Docker-compose ile Traefik Kurulumu

Birkaç ay önce, yeni projelerimizden birinde (yine) bir ters proxy sunucusuna ihtiyacım vardı. Bir inceleme uygulamaları ortamı kuruyordum ve verimli, aynı zamanda kararlı bir şeye ihtiyacım vardı. Çoğu durumda, bahsedilen NGINX kurulumunu yeniden kullanırdım, ancak geçmişte, çoğunlukla hata ayıklama olasılığı olmayan bazı sorunlarla karşılaştım, bu yüzden Traefik’i denemeye karar verdim.

Yeni bir şey keşfettiğinizde ve bir veya iki hafta sonra onsuz nasıl yaşayabileceğinizi merak ettiğinizde hissettiğiniz duyguyu biliyor musunuz? Traefik ile benim için durum buydu. 🙂

Trafik nedir?

Traefik, Bulut, Şirket İçi ve Karma iş yükleri için Yönlendirme, Yük Dengeleme ve Proxy’ler için modern standarttır. Yapılandırmasını otomatik ve dinamik olarak yönetmek için Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file… gibi çeşitli arka uçlarla çalışır. Mikro hizmet altyapılarını otomatik olarak inceler ve yapılandırır.

Traefik neden kullanılır?

Traefik, büyük uygulamaların ve sistemlerin işletilmesi ve yönetimi ile ilgili endişeleri gidermek için tanıtıldı. Hizmetler arasındaki etkileşim, bir uygulamanın çalışma zamanı davranışının kritik bir bileşenidir. Hizmetler arasındaki bağlantı, bir uygulamanın çalışma zamanı davranışının önemli bir bileşenidir ve Traefik, geliştiricilere bu iletişimi kontrol etmek için bir soyutlama katmanı sağlayarak daha fazla görünürlük ve güvenilirlik sağlar. Özel bir kontrol katmanı olmadan uygulama sorunlarını ve arızalarını ölçmek ve teşhis etmek çok karmaşık olabilir ve bu noktada Traefik bize yardımcı olur.

Traefik’in faydaları nelerdir?

  • Traefik yapılandırmasını sürekli güncelleyebilir – yeniden başlatma gerekmez
  • Traefik, çoklu yük dengeleme algoritmalarını destekleyebilir
  • Traefik, “Let’s Encrypt (joker karakter sertifikaları desteği)” özelliğini kullanarak mikro hizmetlerinize HTTPS sağlar
  • Traefik’in çok temiz ve dinamik bir web kullanıcı arayüzü var
  • Traefik, Websocket, HTTP/2, GRPC uyumlu olarak gelir
  • Ölçümler sağlar (Rest, Prometheus, Datadog, Statsd, InfluxDB)
  • Traefik erişim günlüklerini (JSON, CLF) tutar.
  • Çok hızlı
  • Bir Rest API’sini ortaya çıkarır
  • Destek proaktiftir ve geliştirme akıcıdır.
  • Tek bir ikili dosya olarak paketlenmiştir ve küçük bir resmi liman işçisi görüntüsü olarak mevcuttur

Hizmetleri her yerde kullanılabilir hale getirmek  Kolay Değil…!

Kendi kendine barındırılan hizmetlerinizi kendi ağınızda çalıştırmak çok faydalı olabilir. Ev Asistanı , Grafana ve Adguard Home/Pihole gibi şeyler kendi evinizde inanılmaz derecede faydalıdır. Nextcloud gibi diğer harika hizmetler için büyük olasılıkla her yerden oldukça hızlı bir şekilde erişim aramaya başlayacaksınız.

Bunun basit bir çözümü var: port yönlendirme. Yönlendirici ayarlarınızı belirli bir bağlantı noktasındaki trafiği sunucunuza iletecek şekilde değiştirirseniz, o bağlantı noktasında çalışan hizmete İnternet’ten erişebilirsiniz. Bunu yapma! Bu, ağınıza doğrudan erişime izin verdiği için büyük bir güvenlik riski yaratacaktır. Bu çözüm, benzer bir bağlantı noktasında birden fazla hizmeti çalıştırmaya çalıştığınız anda çalışmayı da durduracaktır.

Bunun yerine (en az) iki daha iyi seçenek var. Daha güvenli ama aynı zamanda daha az kullanışlı olan çözüm, her şeyi güvenli ağınızda tutmak ve herhangi bir hizmete erişmek için bir VPN kullanmaktır. Bir VPN, temel olarak cihazlarınızın herhangi bir yerden LAN’ınıza güvenli bir şekilde bağlanmasına izin verir. O zaman ağın içindeymiş gibi davranabilirler. Bu oldukça güvenlidir ancak hizmetlerinize erişmek için her zaman bir VPN kurmanız gerekecektir.

İkinci çözüm, ters bir proxy’dir. Bir proxy, giden trafiğinizi alıp başka bir yere yönlendirirken, bir ters proxy, gelen trafikle aynı şeyi yapar. Hedef alan adı gibi bazı özelliklere güvenerek, aynı bağlantı noktasına yönlendirilen gelen trafiği sunucunuzdaki farklı hizmetlere/bağlantı noktalarına yönlendirmek için kullanabilirsiniz. Bu tür birçok proxy var ama Docker ve docker-compose için büyük desteği olduğu için şimdilik seçtiğim Traefik.

Traefik’in Temel Konseptleri

Providers , Traefik’in yapılandırma keşfi için kullandığı altyapı bileşenleridir. Kaputun altında Traefik, sağlayıcıların API’lerini sorgular ve aldığı bilgilere göre rotaları dinamik olarak günceller.

Docker, ECS, Kubernetes, Consul, Rancher vb. gibi bir dizi support providers vardır . Bu eğitimde, yönlendirme yapılandırması için Docker sağlayıcısını ve konteyner etiketlerini kullanacağız.

Entrypoints

Entrypoints noktaları, belirli bağlantı noktalarında ve belirli bir protokol (TCP veya UDP) için gelen trafiği dinler. En popüler giriş noktaları, 80 ve 443 numaralı bağlantı noktalarını dinleyenlerdir. Giriş noktaları, Traefik’in statik yapılandırmasının bir parçasıdır; bu, onları bir dosya (YAML veya TOML) veya CLI bağımsız değişkenleri kullanarak tanımlamanız gerektiği anlamına gelir.

Routers

Roueters gelen istekleri analiz eder ve bir dizi kurala dayanarak isteklerin uygun servislerde sonuçlanmasını sağlar. İsteği iletmeden önce ara yazılımları da kullanabilirler.

Middlewares

Middlewares router‘lara eklenebilir ve istekleri servislere ulaşmadan önce analiz etmek/geliştirmek/değiştirmek/reddetmek için kullanılabilir. İstenirse, birlikte zincirlenebilirler ve bazı yaygın kullanım durumları kimlik doğrulama, yeniden yönlendirme, yol değiştirme vb.

Services

Services , istekleri gerçek hizmetlerinize iletmenin yolunu yapılandırır. Yük dengeleme (yalnızca sürüm traefik 2.6’dan itibaren yeniden deneme), sağlık kontrolleri, yapışkan oturumlar vb. gibi şeyleri yapılandırırlar.

Traefik Kurulumu ve Yapılandırılması

Şimdi yapılandırmayı parça parça açıklayacağım.

Traefik service

traefik:
  image: traefik:v2.7
  command:
    # Entrypoints configuration
    - --entrypoints.web.address=:80
    # Docker provider configuration
    - --providers.docker=true
    # Makes sure that services have to explicitly direct Traefik to expose them
    - --providers.docker.exposedbydefault=false
    # Use the secure docker socket proxy
    - --providers.docker.endpoint=tcp://socket_proxy:2375
    # Default docker network to use for connections to all containers
    - --providers.docker.network=traefik_public
    # Logging levels are DEBUG, PANIC, FATAL, ERROR, WARN, and INFO.
    - --log.level=info
  ports:
    - 80:80
Entrypoints configuration
–entrypoints.web.address=:80

Traefik kapsayıcısının 80 numaralı bağlantı noktasını dinleyecek web adlı bir giriş noktası tanımlar.Kısa sözdizimini kullanarak bağlantı noktalarını belirterekHOST_PORT:CONTAINER_PORT

ports:
  - 80:80

80 numaralı bağlantı noktasını kapsayıcının 80 numaralı bağlantı noktasına yayınlıyorsunuz. Bu şekilde, Traefik localhost:80veya başlıklı istekleri alacak http://localhost.

Docker sağlayıcı yapılandırması

–providers.docker=true

Docker sağlayıcısını etkinleştirir.

–providers.docker.exposedbydefault=false

Yalnızca Docker etiketine sahip hizmetler traefik.enable=truekeşfedilecek ve yönlendirme yapılandırmasına eklenecektir.

–providers.docker.endpoint=tcp://socket_proxy:2375

Doğrudan bağlanmak yerine, güvenlik önlemi olarak Docker uç noktasını sorgulayabilmek için kapsayıcıyı unix:///var/run/docker.sockkullanacağız .socket_proxy

–providers.docker.network=proxy

traefik_publicTraefik aracılığıyla açıkta kalan tüm hizmetler, varsayılan olarak Docker ağını kullanacak .

Whoami etiketleri

Docker hizmeti whoamiaçığa çıkacak ve yalnızca Traefik aracılığıyla erişilebilir.

whoami:
    image: traefik/whoami:latest
    labels:
      # Explicitly instruct Traefik to expose this service
      - traefik.enable=true
      # Router configuration
      ## Listen to the `web` entrypoint
      - traefik.http.routers.whoami_route.entrypoints=web
      ## Rule based on the Host of the request
      - traefik.http.routers.whoami_route.rule=Host(`whoami.example.k2.net`)
      - traefik.http.routers.whoami_route.service=whoami_service
      # Service configuration
      ## 80 is the port that the whoami container is listening to
      - traefik.http.services.whoami_service.loadbalancer.server.port=80

traefik.enable=true

Açıkça Traefik’e yönlendirme yapılandırmasına eklemesini söyler.

traefik.http.routers.whoami_route.entrypoints=web

Rota whoami_route, istekleri yalnızca webgiriş noktasından (port 80) kabul eder.

traefik.http.routers.whoami_route.rule=Host( whoami.karvounis.tutorial)

Bu etiket, Host kuralını ekler. Bir isteğin etki alanı (ana bilgisayar üstbilgi değeri) ise, whoami.karvounis.tutorialbu yönlendirici etkinleşir ve isteği hizmete iletir.

traefik.http.routers.whoami_route.service=whoami_service

İsteğin kriterleriyle eşleşmesi durumunda kullanılacak hizmet whoami_route.

traefik.http.services.whoami_service.loadbalancer.server.port=80

Hizmet whoami_service, isteği konteynerin 80 numaralı bağlantı noktasına gönderecek (80 değeri bu ayar için varsayılan değerdir). Bir hizmetin dinlediği varsayılan kapsayıcı bağlantı noktası 80 olmadığında kullanışlıdır (yani, Portainer 9000‘i dinliyordur, bu durumda bu hizmeti bu şekilde yapılandırırsınız traefik.http.services.portainer_service.loadbalancer.server.port=9000).

Traefik Network Oluşturulması

Aşağıdaki gibi traefik için kullanacağımız bir network oluşturuyoruz.

Traefik Reverse Proxy’yi Kurulumu ve Yapılandırılması

Bu adımda, HTTPS letsencrypt etkinleştirilmiş (‘traefik.example.k2.net alan adını kullanarak) traefik kapsayıcısını oluşturacağız ve HTTP’yi traefik üzerinde otomatik olarak HTTPS’ye yönlendireceğiz.

Traefik Ön Kurulum

Tüm traefik konfigürasyonunu oluşturmadan önce, şifreli htpasswd şifresini oluşturmak ve yeni traefik dizini oluşturmak için ‘httpd-tools’ kurmamız gerekiyor.

Aşağıdaki apt komutunu kullanarak ‘httpd-tools’ yükleyelim.

yum install httpd-tools

Şimdi traefik kontrol paneli kimlik doğrulaması için yeni bir parola oluşturmak için aşağıdaki htpasswd komutunu çalıştıralım.

htpasswd -nb osman password

Kodun çıktısını saklayınız.

osman:$apr1$0HFVvN2p$8oqXioIVukL3FTSCAyCbW.

Tüm traefik yapılandırmaları için ‘traefik’ adlı yeni bir dizin oluşturalım.

mkdir -p traefik/ 
cd traefik/

Traefik Yapılandırması Oluşturulması

Yeni bir ‘traefik.toml’ yapılandırma dosyası oluşturalım.

cd traefik/
vim traefik.toml

Daha sonra terminalde açılan ekrana aşağıda yer alan kodu yapıştıralım.

#Traefik Global Configuration
debug = false
checkNewVersion = true
logLevel = "ERROR"

#Define the EntryPoint for HTTP and HTTPS
defaultEntryPoints = ["https","http"]

#Enable Traefik Dashboard on port 8080
#with basic authentication method
#mohammad and password
[web]
address = ":8080"
[web.auth.basic]
users = ["osman:$apr1$0HFVvN2p$8oqXioIVukL3FTSCAyCbW."]

#Define the HTTP port 80 and
#HTTPS port 443 EntryPoint
#Enable automatically redirect HTTP to HTTPS
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]

#Enable retry sending a request if the network error
[retry]

#Define Docker Backend Configuration
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "traefik.example.k2.net"
watch = true
exposedbydefault = false

#Letsencrypt Registration
#Define the Letsencrypt ACME HTTP challenge
[acme]
email = "[email protected]"
storage = "acme.json"
entryPoint = "https"
OnHostRule = true
  [acme.httpChallenge]
  entryPoint = "http"

Letsencrypt ACME Yapılandırması

‘traefik.toml’ üzerindeki acme yapılandırması, SSL letsencrypt’i otomatik olarak oluşturmak için kullanılır. Ve ‘acme.json’ depolama dosyası için gereklidir.

Yeni bir JSON dosyası ‘acme.json’ oluşturun ve izni ‘600’ olarak değiştirelim

touch acme.json
chmod 600 acme.json

SSL letsencrypt bilgisi ile ilgili tüm günlükler dosyaya kaydedilecektir.

Docker Trafik Kurulumu

Docker-compose.yml aşağıdaki gibidir:

---
version: '3.8'

services:
  traefik:
    image: traefik:v2.7
    container_name: traefik
    restart: unless-stopped
    volumes:
      - /root/traefik/acme.json:/acme.json
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - proxy
    labels:
      - 'traefik.enable=true'
      - 'traefik.http.routers.api.rule=Host(`traefik.example.k2.net`)'
      - 'traefik.http.routers.api.entrypoints=https'
      - '[email protected]'
      - 'traefik.http.routers.api.tls=true'
      - 'traefik.http.routers.api.tls.certresolver=letsencrypt'
    ports:
      - 80:80
      - 443:443
    command:
      - '--api'
      - '--providers.docker=true'
      - '--providers.docker.exposedByDefault=false'
      - '--entrypoints.http=true'
      - '--entrypoints.http.address=:80'
      - '--entrypoints.http.http.redirections.entrypoint.to=https'
      - '--entrypoints.http.http.redirections.entrypoint.scheme=https'
      - '--entrypoints.https=true'
      - '--entrypoints.https.address=:443'
      - '[email protected]ain.net'
      - '--certificatesResolvers.letsencrypt.acme.storage=acme.json'
      - '--certificatesResolvers.letsencrypt.acme.httpChallenge.entryPoint=http'
      - '--log=true'
      - '--log.level=INFO'
    logging:
      driver: "json-file"
      options:
        max-size: "1m"

  webapp:
    image: traefik/whoami:latest
    container_name: webapp
    restart: unless-stopped
    networks:
      - proxy
    labels:
      - 'traefik.enable=true'
      - 'traefik.http.routers.webapp.rule=Host(`whoami.example.k2.net`)'
      - 'traefik.http.routers.webapp.entrypoints=https'
      - 'traefik.http.routers.webapp.tls=true'
      - 'traefik.http.routers.webapp.tls.certresolver=letsencrypt'
      - 'traefik.http.routers.webapp.service=webappservice'
      - 'traefik.http.services.webappservice.loadbalancer.server.port=80'
    logging:
      driver: "json-file"
      options:
        max-size: "1m"

networks:
  proxy:
    name: proxy

Aşağıdaki komut ile oluşturmuş olduğumuz docker-compose’u ayağa kaldırıyoruz.

docker-compose up -d

Bu komut ile oluşturulan container’ların durumunu öğreniyoruz.

docker ps

 

Eğer docker-compose’umuzu düzgün bir şekilde yapılandırdıysak , container’lar sorunsuz bir şekilde ayağa kalkacaktır.

traefik.example.k2.net

whoami.example.k2.net

Traefik’i kurdun, peki şimdi ne olacak?

Artık Traefik’i kurduğunuza ve onu hem ikili dosyadan hem de docker-compose kullanarak çalıştırdığınıza göre, daha fazla mikro hizmet eklemeye hazırsınız! içine yeni Docker görüntüleri eklerseniz docker-compose.yml, Traefik yeni eklenen arka uçları hemen tanır ve Traefik’in başka bir yapılandırmasını yapmadan veya yeniden başlatmadan isteği ona yönlendirir.

Daha fazla yapılandırma seçeneği için Traefik belgelerine bakın .

Şimdi, ” Bu muhteşem Traefik ters proxy’nin arkasına ne kurmalıyım?” diye soruyor olabilirsiniz.Deneyin ve görün 😀

İlk yorum yapan olun

Bir yanıt bırakın

E-posta hesabınız yayımlanmayacak.


*