
Bu yazımda, Nginx ingress controller kullanarak Kubernetes’de nasıl ingress kullancağımızı ve trafiği joker karakter’li DNS kaydı kullanarak deployment’lara nasıl yönlendireceğinizi öğreneceksiniz.
Kubernetes ingress’in nasıl çalıştığını anlamak istiyorsanız, lütfen Yeni Başlayanlar İçin Kubernetes Ingress Eğitimi’daki bu blog gönderisini okuyun.
İşte Nginx ingress controller kullanan Kubernetes ingress örnek mimarisi

Ön şartlar:
- Bir Kuberntes cluster.
- kubectl yardımcı programı.
- Kubernetes cluster’a yönetici erişimi.
- Ingress controller load balancer’ına işaret etmek için geçerli bir etki alanı.
Not: Bu eğitici, AWS üzerinde buluan bir kubernetes cluster’ında denendi. Mantıken tüm bulut ortamlarında çalışmalıdır. Eğer herhangi bir hatayla karşılaşırsanız, kurulumda bazı ayarlamalar yapmanız gerekebilir.
Nginx Ingress Controller Kurulumu
İki adet nginx ingress controller vardır.
- Kubernetes topluluğu tarafından sunulan Nginx ingress controller
- Nginx Inc tarafından üretilen Nginx ingress controller
Ben Kubernetes topluluğu tarafından sunulan Nginx ingress controller‘ı kullanacağım.
Ingress controller’ın belirli bir namespace, service account, cluster role vb. bağlarına, yapılandırmalara İhtiyacı vardır. Resmi ingress deposundan yaml dosyasını kullanarak belirtilen tüm kubernetes nesnelerini oluşturabilirsiniz .
Resmi ingress deposundaki mandatory.yaml dosyasını kullanarak ingress controller’ı deploy edelim.
Kubectl kullanarak Nginx ingress deployment oluşturalım.
1 |
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml |
İpucu: Eğer 1.14 önceki bir Kubernetes sürümünü kullanıyorsanız, mandatory.yaml dosyasının 217. satırında kubernetes.io/os satırını beta.kubernetes.io/os ile değiştirin. bkz. Etiketler.
Dosyayı indirip vim ile düzenleyelim.
1 2 |
$wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml $vim mandatory.yaml |
217. satırda bulunan kubernetes.io/os: linux kısmı beta.kubernetes.io/os: linux ile değiştirip dosyayı kaydedip çıkalım ve bu şekilde deployment oluşturalım.
1 |
$ kubectl apply -f mandatory.yaml |
sonrasında bu şekilde bir output görmeniz gerekiyor.
1 2 3 4 5 6 7 8 9 10 11 |
namespace/ingress-nginx created configmap/nginx-configuration created configmap/tcp-services created configmap/udp-services created serviceaccount/nginx-ingress-serviceaccount created clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created role.rbac.authorization.k8s.io/nginx-ingress-role created rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created deployment.apps/nginx-ingress-controller created limitrange/ingress-nginx created |
Ingress Controller pod’larının doğru ayarlandığından emin olmak için kontrol edelim.
1 |
$ kubectl get pods -n ingress-nginx |
Ingress controller için LoadBalancer service’ini ayarlama
Sonraki adım, nginx ingress deployment’ını kümenin dışına erişime açmak için Type’ı Loadbalancer olan bir service oluşturmaktır.
Bu kurulumda, ELB’yi hangi katmanda (L4 veya L7) yapılandırmak istediğimizi seçmenizi gerektirir:
- Layer 4 : 80 ve 443 numaralı bağlantı noktaları için listener protokolü olarak TCP kullanın.
- Layer 7 : 80 numaralı bağlantı noktası için listener protokolü olarak HTTP kullanın ve ELB’de TLS’yi sonlandırın
Ben layer 7 olarak bir yapılandırma yapacağım. bkz
Adım 1: daha önceden oluşturduğumuz nginx-configiration configmap aşağıdaki şekilde güncellememiz gerekiyor.
1 2 |
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/aws/patch-configmap-l7.yaml configmap/nginx-configuration configured |
Adım 2: Yerel olarak bir proje dizini oluşturun ve bu dizine geçin.
1 2 |
$ mkdir ingress-deployment $ cd ingress-deployment |
Adım 3: nginx-ingress.yaml adlı bir dosya oluşturun
1 |
$ vim nginx-ingress.yaml |
Adım 4: Aşağıdaki içeriği dosyaya kopyalayın.
Not : Etiketlerin altındaki ek açıklamalar, nginx denetleyicisi dağıtımıyla entegrasyon için çok önemlidir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
kind: Service apiVersion: v1 metadata: name: ingress-nginx namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx spec: type: LoadBalancer selector: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx ports: - name: http port: 80 targetPort: http - name: https port: 443 targetPort: https |
Adım 5: Ingress Controller service’ini oluşturun.
1 |
$ kubectl apply -f nginx-ingress.yaml |
Adım 5: Oluşturulan service’i kontrol edin.
1 |
$ kubectl get svc -n ingress-nginx |
Bir Alan Adını Loadbalancer IP’siyle Eşleme
Ingress ayarlarımızın çalışmasını sağlamak için, loadbalancer IP’siyle (veya CNAME) bir alan adı eşlememiz gerekir. Bunu iki şekilde yapabilirsiniz.
Tek DNS Eşlemesi:
Tek etki alanını doğrudan yük dengeleyici IP’sine A kaydı olarak eşleyebilirsiniz. Bunu kullanarak, giriş denetleyicisi için yalnızca bir etki alanına ve birden çok path’e dayalı trafik yönlendirmesine sahip olabilirsiniz.
Örneğin,
www.omeroner.com –> Loadbalancer IP / CNAME
Bu modeli kullanarak yola dayalı yönlendirmeye sahip olabilirsiniz.
Birkaç örnek,
http://demo2.omeroner.com/app/api
http://demo2.omeroner.com/app1/api
http://demo2.omeroner.com/app2/api
Joker Karakter DNS Eşlemesi:
Bir joker karakter DNS’sini load balancer ile eşlerseniz, giriş sırasında dinamik DNS uç noktalarınız olabilir.
Örneğin,
*.omeroner.com
Bu şekilde, tek giriş denetleyicisi aracılığıyla birden çok dinamik alt etki alanına sahip olabilirsiniz ve her DNS’nin kendi yol tabanlı yönlendirmesi olabilir.
Örneğin,
http://demo.omeroner.com/api
http://demo.omeroner.com/api/v1
http://demo.omeroner.com/api/v2
http://demo2.omeroner.com/api
http://demo2.omeroner.com/api/v1
http://demo2.omeroner.com/api/v2
http://test.omeroner.com/
http://test2.omeroner.com/
http://test3.omeroner.com/
Demo amaçlı olarak, bir joker karakter DNS’sini LoadBalancer IP/CNAME ile eşledik. DNS sağlayıcınıza bağlı olarak, bu ayarı yapabilirsiniz.
Demo Uygulama Kurulumu
Test amacıyla, bir demo uygulaması deploy edip bir ClusterIp service’i ekleyeceğiz.
1.Adım: Dev adlı bir ad alanı oluşturun
1 |
$ kubectl create namespace dev |
Adım 2: hello-app.yaml adlı bir dosya oluşturun.
Adım 3: Aşağıdaki içeriği kopyalayın ve dosyayı kaydedin.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
apiVersion: apps/v1 kind: Deployment metadata: name: hello-app namespace: dev spec: selector: matchLabels: app: hello replicas: 3 template: metadata: labels: app: hello spec: containers: - name: hello image: "gcr.io/google-samples/hello-app:2.0" |
Adım 4: Kubectl kullanarak deployment oluşturma.
1 |
$ kubectl create -f hello-app.yaml |
Dağıtım durumunu kontrol edin.
1 |
kubectl get deployments -n dev |
Adım 5: hello-app-service.yaml adlı bir dosya oluşturun.
Adım 6: Aşağıdaki içeriği kopyalayın ve dosyayı kaydedin.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
apiVersion: v1 kind: Service metadata: name: hello-service namespace: dev labels: app: hello spec: type: ClusterIP selector: app: hello ports: - port: 80 targetPort: 8080 protocol: TCP |
Adım 7: Kubectl kullanarak service’i oluşturun.
1 |
$ kubectl create -f hello-app-service.yaml |
Servis durumunu kontrol edin
1 |
$ kubectl get svc -n dev |
Kubernetes Ingress Oluşturma
Şimdi hello uygulamamıza bir DNS kullanarak erişmek için bir ingress nesnesi oluşturalım. Bir ingress nesnesi, yönlendirme kurallarının tanımından başka bir şey değildir.
Ingress nesnesinin Nginx controller’ına nasıl bağlandığını merak ediyorsanız ingress controller pod kuralları denetlemek için ingress API’sine bağlanır ve nginx.conf öğesini buna göre günceller.
Adım 1: ingress.yaml adlı bir dosya oluşturun
Adım 2: Aşağıdaki içeriği kopyalayın ve dosyayı kaydedin.
Dns’de *.omeroner.com ile load balancer ip/cname ini eşleştirdiğimizden trafik nginx controller servisine gelecek.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: test-ingress namespace: dev spec: rules: - host: test.omeroner.com http: paths: - backend: serviceName: hello-service servicePort: 80 |
Adım 3: Yapılandırmaları kontrol etmek için oluşturulan oluşturulan giriş nesnesini açıklayın.
1 |
$ kubectl describe ingress -n dev |
Artık test.omeroner.com etki alanına erişmeye çalışırsanız (etki alanı adınızla değiştirmeniz gerekir.), deploy ettiğimiz örnek uygulamamıza erişebilmeniz gerekir.
So, what do you think ?