
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:80
veya başlıklı istekleri alacak http://localhost
.
Docker sağlayıcı yapılandırması
Docker sağlayıcısını etkinleştirir.
–providers.docker.exposedbydefault=false
Yalnızca Docker etiketine sahip hizmetler traefik.enable=true
keş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.sock
kullanacağız .socket_proxy
–providers.docker.network=proxy
traefik_public
Traefik aracılığıyla açıkta kalan tüm hizmetler, varsayılan olarak Docker ağını kullanacak .
Docker hizmeti whoami
açığ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 web
giriş 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.tutorial
bu 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 😀
Bir yanıt bırakın