Home TürkçeKubernetes Kubernetes Nginx Ingress Controller kurulumu

Kubernetes Nginx Ingress Controller kurulumu

by Fatih Boy
2 comments

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

Şu Yazıları da Sevebilirsiniz

2 comments

NginxInc Nginx Ingress Controller kurulumu - Fatih'in Notları 5 Eylül 2019 - 10:40

[…] tarafından hem de Nginx tarafından birer Ingress Controller yayınlanmış durumdadır. Bir önceki makalemde Kubernetes tarafından yayınlanan versiyonuna dair kurulum adımlarını paylaşmıştım. […]

Reply
Nginx Ingress Controller kurulumu - Kolay Yol - Fatih'in Notları 12 Eylül 2019 - 10:17

[…] sizlere Kubernetes tarafından sağlanan Ingress Controller’ı Kubernetes Cluster’ınıza nasıl kurabileceğinizi anlatmıştım. Doğrusunu söylemek gerekirse bu makalede görece daha uzun yolu sizlere […]

Reply

Leave a Comment

* Bu formu kullanarak, verilerinizin bu web sitesi tarafından saklanması ve kullanılmasını kabul ediyorsunuz.

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

Bu web sitesi deneyiminizi geliştirmek için çerezleri kullanır. Bunu kabul ettiğinizi varsayacağız, ancak isterseniz vazgeçebilirsiniz. Kabul Et Daha Fazla Bilgi