
NginxInc Nginx Ingress Controller kurulumu
Kubernetes üzerinde Ingress Controller için birden farklı ürün kullanılabilmekte. Bu ürünler arasında öne çıkanlardan birisi olan Nginx için hem Kubernetes 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. Aşağıdaki adımlar takip edilerek Centos 7 Minimal üzerine kurulu Kubernetes Cluster’ında Nginx tarafından yayınlanmış haliyle Nginx Ingress Controller kurulumu yapılabilir. Her ne kadar Nginx kurulumu için Helm patikasının takip edilmesi daha kolay olsa da bu makalemde öncelikle zor yoldan (ya da uzun yoldan mı demeliyim) ilerlemek istiyorum. Bu sayede yapılandırma hakkında da fazla bilgi ve kontrol sahibi olabilirsiniz.
Nginx Ingress Controller kurulumu için öncelikle sunucu üzerinde git kurulu olmalıdır. Sunucuda git kurulu değil ise aşağıdaki komut kullanılabilir;
yum install -y git
Yapılandırmalar için kullanılacak Nginx deposu yerele kopyalanır;
git clone https://github.com/nginxinc/kubernetes-ingress.git
Tanımlamaların yapılacağı deployments klasörüne geçilir;
cd kubernetes-ingress/deployments/
Ingress Controller için kullanılacak namespace ve servis hesapları oluşturulur;
kubectl apply -f common/ns-and-sa.yaml
Default server için TLS sertifikası ile bir secret oluşturulur;
kubectl apply -f common/default-server-secret.yaml
Not: Bu adımda SSL testleri için bir ssl sertifikası ve anahtar tanımlanacaktır.
Default server herhangi bir ingress tanımı olmayan domain’ler için 404 dönecektir.
Nginx yapılandırması için bir configmap oluşturulur;
kubectl apply -f common/nginx-config.yaml
nginx-config.yaml dosyası incelendiğinde boş bir configmap olduğu görülecektir. Kurulumda özelleştirme istenirse buraya ilgili parametre değerleri girilmelidir. Kullanılabilecek değerler için Nginx-Ingress Controller dokümantasyonu incelenebilir. Aynı sayfada ingress oluştururken kullanabileceğiniz annotation’ları da bulabilirsiniz.
Kurulumunuzda Virtual Server ve Virtual Server Route kaynaklarını kullanmak isterseniz aşağıdaki komutla gerekli kaynak tanımlarını yapmalısınız;
kubectl apply -f common/custom-resource-definitions.yaml
Eğer RBAC aktif ise bir cluster role oluşturulur ve servis hesabına bağlanır;
kubectl apply -f rbac/rbac.yaml
Ingress Controller Deploy’u
Yukarıdaki adımlarla hazırladığımız Kubernetes Cluster’ımıza Deployment ya da DaemonSet olarak Nginx Ingress Controller kurulumu yapılabilir. DaemonSet kurulumunda Cluster’a yeni üyelerin eklenmesi ile otomatik olarak yatayda bütüme elde edilebilirken, Deployment kurulumunda yatayda büyüme için daha fazla kontrol sahibi olunacaktır. Cluster’ınızın ihtiyaçlarını göz önüne alarak bu iki seçenekten mimarinize uygun olanı seçmelisiniz.
Ingress Contoller’ı Deployment Olarak Yapılandırmak
Deployment olarak kullanılmak istenirse; aşağıdaki komutla ingress controller oluşturulur;
kubectl apply -f deployment/nginx-ingress.yaml
Ingress Controller’ınızı Prometheus yardımıyla izlemek isterseniz nginx-ingress.yaml dosyasında args bölümünde -enable-prometheus-metrics parametresini vermeniz gerekmektedir. Prometheus’un yayınlanan metriklerden haberdar olması için aynı dosyada template bölümüne aşağıdaki annotation’ların da girilmesi gerekmektedir;
annotations: prometheus.io/scrape: "true" prometheus.io/port: 9113
Bu işlemlerde ardından dışarıdan erişim için nodeport oluşturulur;
kubectl create -f service/nodeport.yaml
Ingress Controller’ı DaemonSet olarak Yapılandırmak
Deamonset olarak kullanılmak istenerse; aşağıdaki komutla ingress controller oluşturulur;
kubectl apply -f daemon-set/nginx-ingress.yaml
Ingress Controller’ınızı Prometheus yardımıyla izlemek isterseniz nginx-ingress.yaml dosyasında args bölümünde -enable-prometheus-metrics parametresini vermeniz gerekmektedir. Prometheus’un yayınlanan metriklerden haberdar olması için aynı dosyada template bölümüne aşağıdaki annotation’ların da girilmesi gerekmektedir;
annotations: prometheus.io/scrape: "true" prometheus.io/port: 9113
Kurulum Doğrulaması
Kurulumun doğruluğu için aşağıdaki komut kullanılabilir;
kubectl get pods --namespace=nginx-ingress

curl ile tüm worker node’ların 80 portuna talep gönderildiğinde 404 Not Found yanıtı alınacaktır;

Ingress Controller Test
Ingress Controller Kubernetes içerisinde bir ingress oluşturularak test işlemi yapılabilir. Bunun için aşağıdaki komutla app.ingress.yaml dosyası oluşturulur;
cat > app.ingress.yaml <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: echoserver-deploy spec: replicas: 2 selector: matchLabels: app: echo template: metadata: labels: app: echo spec: containers: - name: my-echo image: gcr.io/google_containers/echoserver:1.8 --- apiVersion: v1 kind: Service metadata: name: echoserver-svc spec: selector: app: echo ports: - protocol: TCP port: 8080 targetPort: 8080 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: echoserver-ingress annotations: INGRESS.kubernetes.io/rewrite-target: / spec: rules: - host: ingress-test.fatihboy.com http: paths: - path: /echoserver backend: serviceName: echoserver-svc servicePort: 8080 EOF
Aşağıdaki komutla ingress oluşturulur;
kubectl create -f app.ingress.yaml
Aşağıdaki komutla ingress kontrol edilir;
kubectl get ing

Aşağıdaki komutla Worker node’lardan birisine yapılacak talep echoserver pod’una yönlendirilecektir;
curl http://k8s-w1/echoserver -H "Host: ingress-test.fatihboy.com"

Nginx Ingress Controller’ı kaldırma
Nginx Ingress Controller’ı kaldırmak için aşağıdaki komutla kurulumun yapıldığı namespace’in silinmesi yeterli olacaktır;
kubectl delete namespace nginx-ingress