Kubernetes, dağıtılmış uygulamaları yönetmek için güçlü bir platform sağlar. Ancak, bu uygulamalara dış dünyadan erişim sağlamak için uygun bir yol gereklidir. Bu noktada, Kubernetes'in Ingress nesnesi ve NGINX Ingress Controller devreye girer. Bu dokümanda, NGINX Ingress Contoller'ın nasıl kurulacağı ve Apinizer Servislerine Ingress ile nasıl erişim sağlanacağı adım adım açıklanmaktadır.

Kubernetes Ingress Nedir?

Ingress, dış dünyadan Kubernetes kümesindeki uygulamalara erişim sağlamak için kullanılan bir kubernetes nesnesidir.

Belirli bir host adına veya yoluna gelen istekleri belirli bir servise yönlendirebilir. Örneğin, example.com/app adresine gelen bir isteği, app-service adlı bir Kubernetes servisine yönlendirebilir.


Nginx Ingress Controller nedir?

NGINX Ingress Controller, bir Kubernetes kümesinde çalışan uygulamalara gelen istekleri yönlendirmek için NGINX'i kullanır. Ingress nesnelerini izler ve belirli kurallara göre gelen istekleri farklı hizmetlere yönlendirir. Kubernetes ekosisteminde NGINX'in yanı sıra çeşitli diğer Ingress Controller'lar da bulunmaktadır. Bunlardan en çok bilinenleri şunlardır: traefik, HAProxy, Envoy, Ambassador.


 


Bu dokümanda, NGINX Ingress Controller kurarak uygulamaya erişim sağlanmaktadır. Bulut sağlayıcınızda (AWS, GCP, Azure vb.) kubernetes cluster'ınızı dışarıya açmak istediğinizde, LoadBalancer tipinde bir servis oluşturursunuz ve size otomatik olarak bir IP atanır. Bu IP, servise dışarıdan erişim sağlamak için kullanılır. Ancak, bu bulut dışı (on-premises) veya bare-metal ortamlarda, MetalLB gibi bir tool kullanılarak LoadBalancer hizmetine ihtiyaç duyulur.


Bu uygulama localde bulunan Ubuntu işletim sistemine sahip sanal bir makinede gerçekleştirilecek.

Cloud ortamında çalışıyorsanız MetalLB kurulumunu atlayabilirsiniz.

MetalLB Kurulumu

MetalLB (Metal Load Balancer), Kubernetes kümeleri için bir ağ yük dengeleyicisi (load balancer) çözümüdür.

Aşağıdaki komut ile kubernetes kümesine, MetalLB kurulumunu gerçekleştirebilirsiniz.

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.5/config/manifests/metallb-native.yaml
POWERSHELL


Aşağıdaki komutla oluşturulan podların durumunu kontrol edin ve hazır ("ready") olana kadar bekleyin.

kubectl get all -n metallb-system
POWERSHELL

Dış IP (external-ip) Havuzu Oluşturulması

MetalLB'nin kullanımı için bir IP adresi havuzu oluşturulması gerekmektedir. 

Bir yaml dosyası oluştun ve aşağıda bulunan IPAddressPool türündeki içeriği ekleyiniz.

vim ip-pool.yaml
POWERSHELL

Adres kısmında belirttiğiniz ip aralığı sizin dış ortamlardan erişeceğiniz ip adresiniz olacaktır.

Local network'ten ulaşılabilir boş bir ip aralığı vermeniz gerekmekte

Bu örnekte 172.16.100.170-172.16.100.180 aralığı verilmiştir.

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: ip-pool
  namespace: metallb-system
spec:
  addresses:
  - 172.16.100.170-172.16.100.180     #Size uygun ip adresleri ile değiştiriniz.
POWERSHELL

Yaml dosyasını uygulayarak, bir IP adres havuzu oluşturunuz.

kubectl apply -f ip-pool.yaml
POWERSHELL

Artık belirtilen aralıktaki IP adreslerini bu havuza ekledi. LoadBalancer türünde servis oluşturduğunuzda, size otomatik bir IP tanımlanacaktır.

Nginx Controller Kurulumu

Helm kullanarak kubernetes kümesine nginx controller kurulumunu yapabilirsiniz. Helm'in kullanılma amacı, Kubernetes kümesinde uygulamaların ayağa kaldırılması için gereken tüm yapılandırma dosyalarını yönetmek ve kurulum sürecini kolaylaştırmaktır.


Bu adımda önce helm kurulumunu yapıp daha sonra Nginx controller reposunu ekleyiniz.

sudo snap install helm --classic
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
POWERSHELL

Artık Helm kullanarak nginx-controller kurulumunu gerçekleştirilebilirsiniz.

helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress --set controller.ingressClassResource.name=nginx --create-namespace
POWERSHELL


Yukarıdaki komutu çalıştırdığınızda bu çıktıyı size verecektir.


Nginx Controller kurulumu başarılı bir şekilde tamamlandıktan sonra belirli bir kontrol aşaması bulunmaktadır.

Şimdi kurulumda oluşturulan servislerden  ingress-nginx-controller (loadbalancer tipinde) servisinin external-ip alanında bir ip atanmış mı kontrol edilmelidir. 

kubectl get svc -n ingress-nginx
POWERSHELL

Kontrol edildiğinde dışarıdan erişim sağlamak için bir external-ip atanmış olduğu görülmekte.


Nginx controller artık hazır durumda.

Şimdi, Apinizer uygulamasına erişim sağlamak için bir sonraki adım, bir Ingress objesi oluşturmaktır.

Bu sayede, belirli bir DNS adı ve ön ek tanımlayarak Apinizer Yönetim Arayüzüne erişimi kolaylaştırabiliriz.

Apinizer Deploy Örneği

Aşağıdaki komut çıktısında Apinizer Yönetim Arayüzü'nün çalıştığı namespace ve POD gözükmektedir. 


Bu pod'da çalışan uygulamamıza erişmek istediğinizde(aşağıdaki ekranın karşımıza çıkabilmesi için) yapacağımız Ingress tanımlamaları bir sonraki bölümde anlatılmaktadır.

 

Ingress Objesi Oluşturmak

Ingress kullanmadan önce, uygulamanızın hangi URL'lere nasıl erişileceğini tanımlamak için bir Ingress kaynağı oluşturulması gerekir.

Ingress kaynağı, Nginx Ingress Controller tarafından izlenerek gelen istekleri hedeflere yönlendiren kuralları belirtir.


Bir yaml dosyası oluşturup ilgili konfigürasyonları kendimize göre düzenleyerek, Kubernetes'te bir Ingress objesi oluşturun.

vi ingress.yaml
POWERSHELL

Ingress içeriğini ekleyin ve aşağıdaki uyarı kısmında belirtilen alanları kendinize göre düzenleyin.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: manager-ingress
  namespace: apinizer
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /index.html
spec:
  rules:
  - host: demo.apinizer.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: manager
            port:
              number: 8080

POWERSHELL

Belirtilen alanları kendi uygulamanıza göre düzenleyebilirsiniz.

host: demo.apinizer.com Bu alanda, Ingress kuralları tanımlanır. Host alanı, gelen isteklerin hangi DNS adına yönlendirileceğini belirtir.

path: / Bu alanda, gelen isteklerin belirli bir URL yoluna göre hangi hedefe yönlendirileceği belirtilir. Bu örnekte, / yoluna sahip istekler bu kurala uyar. 

pathType: Prefix Bu alanda, belirtilen yolun bir önek olduğu belirtilir. Yani / yoluna sahip istekler / önekiyle başlayan tüm yollara uyar.

backend: service: name: manager Bu alanda isteklerin yönlendirileceği hedef servisin adı yazılır.
port: number: 8080  Bu alanda servisinizin port numarası (8080) belirtilir.

Yaml dosyasını kullanarak bir ingress nesnesi oluşturun.

kubectl apply -f ingress.yaml
POWERSHELL

Oluşturulan Ingress nesnesinin doğruluğunu ve çalışabilir olduğunu kontrol etmek için aşağıdaki komutu çalıştırabilirsiniz.

kubectl get ing -A
POWERSHELL

Ingress nesnesi oluşturulmuş ve  ingress-nginx-controller servisinde oluşan ip bilgisi adres alanında görünüyor.

Ayrıca, Ingress YAML dosyasında belirttiğiniz host adresini de burada görmelisiniz.

Önemli : Ingress'in adresi atayabilmesi için 1-2 dakika beklemek ve birkaç kez kontrol etmek gerekebilir.

Eğer bir hizmet sağlayıcısından alan adı satın almadıysanız, test amacıyla kendi bilgisayarınızda yerel bir kayıt yapabilirsiniz. Bu işlemin nasıl yapılacağı aşşağıdaki dökümanda Ubuntu işletim sistemli bir sunucuya göre anlatılmaktadır.

Öncelikle, alan adınızı yönetmek için kendi bilgisayarınızda bir DNS kaydı eklemek istiyorsanız, aşağıdaki adımları izleyebilirsiniz:

DNS Tanımlama

İlk adım olarak, /etc/hosts dosyasını bir metin düzenleyici ile açın.

Bu dosya, IP adresleri ve karşılık gelen ana bilgisayar isimlerinin eşleştirildiği bir yerel DNS (Domain Name System) dosyasıdır.

vi /etc/hosts
POWERSHELL

Nginx Controllerdan gelen ingress-nginx-controller servisinin sağladığı external-ip adresini ve Ingress YAML dosyasında belirttiğiniz  DNS adresini bu dosyaya ekleyiniz.

<external-ip>   demo.apinizer.com
POWERSHELL

Sonuç

Test adımında curl komutu kullanılabilir veya tarayıcı üzerinden erişim sağlanabilir.

curl demo.apinizer.com/apinizer/management/health adresine istek atıldığında sonuç şu şekildedir:

Tarayıcı ile erişildiğinde Apinizer Yönetim Arayüzü ekranı gelecektir.

Artık Apinizer'a erişimi sağlamak için bir ingress kullanıyorsunuz ve beklenen sonuç başarılı oldu.