Kubernetes Nginx Ingress Controller kurulumu

Kubernetes tarafından sağlanan Nginx Ingress Controller NodePort olarak Servis üzerinden ya da Host Network olarak doğrudan Host üzerinden dışarı açılabilir. Aşağıda her iki yöntem için detay ve kurulum adımları bulunmaktadır.

NodePort olarak Servis üzerinden Kurulum

Kuruluma aşağıdaki komutla zorunlu bileşenlerin kurulumu yapılarak başlanır;

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

Aşağıdaki adımla Ingress Controller NodePort olarak erişime açılır;

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/service-nodeport.yaml

NodePort-Nginx-Ingress-Controller

Bu yaklaşımda varsayılanda 30000-32767 aralığında yer alan ve Kubernetes tarafından atanan bir NodePort üzerinden Ingress Controller dışarı açılır. Port aşağıdaki komutla öğrenilebilir;

kubectl -n ingress-nginx get svc

get-svc

Bu yaklaşımın beraberinde getirdiği  bir sıkıntı istemci ip’sinin Ingress Controller’a ulaşmaması olacaktır. Kubernetes 1.5 itibari ile NodePort olarak tanımlanan Servislerde avrsayılan olarak Source NAT uygulamaktadır. Yani hedef paket içerisindeki istemci ip’si node ip’si ile değiştirilmektedir. Dolayısıyla NodePort olarak açtığımız Ingress Controller tarafından görülen ip adresi talebi alan node’un ip’si olacaktır.

Bu problemi aşmak için NodePort tanımı yapılırken local externalTrafficPolicy politikası kullanılabilir. Örneğin;

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  externalTrafficPolicy: Local
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
---

Aşağıda komut yardımıyla bu yapılandırma uygulanabilir;

kubectl apply -f https://raw.githubusercontent.com/fatihboy/nginx-ingress-deploy/master/service-nodeport-local.yaml

Örnekte olduğu gibi harici trafik politikası olarak yerel verilmesi durumunda kubernetes proxy sadece yerel endpoint’ler için yapılan talepleri karşılayacak, bunun dışındakiler için bir yönlendirme yapmayarak paketler düşürülecektir. Bu yaklaşımda bir yönlendirme, dolayısıyla da  bir Source Nat işlemi yapılmayacağından istemci ip’si korunması garanti altına alınmış olur. Bu senaryoda Ingress Controller kurulu olmayan Node’lara yapılan talepler düşürüleceği için üretim ortamlarında sıkıntı yaşamamak adına ingress controller pod’unu node selector kullanarak belirlediğiniz node’larda çalıştırması ve istemcilerin sadece bu node’lara yönlendirilmesini tavsiye ediyorum.

NodePort-Local-Nginx-Ingress-Controller

NodePort ile dışarı açılan Nginx Ingress Controller’ının yukarıda detaylarını paylaştığım her iki yaklaşımında da unutulmaması gereken konu Pod içerisinde hizmet veren Nginx’in kendini 80 ve 443 portları üzerinden dış dünyaya hizmet veriyor olarak düşündüğüdür. Dolayısıyla Redirect gibi bir senaryoda yönlendirmeler yine bildiği bu portlar doğrultusunda olacaktır.

Host Network üzerinden erişim

Nginx Ingress Controller’ı dış erişime açmanın bir diğer yolu da host network ile açmaktır. Bu sayede host ile aynı network namespace’inde çalışman Nginx Ingress Controller doğrudan 80 ve 443 portlarında dışarı açılabilecektır. Aynı zamanda NodePort senaryosundaki gibi bir NAT’lama yapılmayacağından istemci ip’sine ulaşılabilecektir.

hostNetwork-Nginx-Ingress-Controller

Bu senaryo için POD tanımına aşağıdaki şekilde hostNetwork girdisi eklenmelidir;

template:
  spec:
    hostNetwork: true

Aşağıda komut yardımıyla bu yapılandırma uygulanabilir;

kubectl apply -f https://raw.githubusercontent.com/fatihboy/nginx-ingress-deploy/master/deployment-host-network.yaml

Host network olarak açılan Nginx Ingress Controller, deployment tanımında 1 replika istendiği için cluster’da sadece 1 sunucu üzerinden bulunacaktır. Dolayısıyla sadece bu makineye yapılan talepler karşılanacaktır. Bu durumda aşağıdaki şekilde deployment’ı yatayda çoğaltabilirsiniz;

kubectl scale deployment.apps/nginx-ingress-controller -n ingress-nginx --replicas=[YENİ_REPLIKA_SAYISI]

scale-up

Scale ederken dikkat edilmesi gereken bir konu NodePort seçeneğinden farklı olarak, Pod’un host network üzerinde açılması nedeniyle aynı node üzerinde birden fazla pod’u ayağa kaldırılamayacak olmasıdır.

scale-up-3

Alternatif olarak şekilde daemonset olarak kurulum yapılabilir. Bu durumda karşımıza şu şekilde bir topoloji çıkacaktır;

daemonset-hostNetwork-Nginx-Ingress-Controller

Bunun için aşağıdaki komut kullanılabilir;

kubectl apply -f https://raw.githubusercontent.com/fatihboy/nginx-ingress-deploy/master/daemonset-host-network.yaml

get-pods

Host network kullanımı senaryolarında varsayılan olarak Kubernetes DNS’i kullanılmayacağı için Kubernetes içi isim çözümlemesini yapamayacaktır. Çözüm olarak dnsPolicy değeri olarak ClusterFirstWithHostNet kullanılabilir.

Daemonset örneği;

kubectl apply -f https://raw.githubusercontent.com/fatihboy/nginx-ingress-deploy/master/daemonset-host-network-dns.yaml

Deployment örneği;

kubectl apply -f https://raw.githubusercontent.com/fatihboy/nginx-ingress-deploy/master/deployment-host-network-dns.yaml

Fatih Boy

Ankara'da yaşayan Fatih, kendi şirketinde özellikle bankacılık, sigortacılık ve otomotiv sektörlerinde IT danışmanlıkları vermektedir. Devops, ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook

2 yorum

  1. Pingback: NginxInc Nginx Ingress Controller kurulumu - Fatih'in Notları

  2. Pingback: Nginx Ingress Controller kurulumu - Kolay Yol - Fatih'in Notları

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.