Apinizer Servislerine Kubernetes Ingress ile Erişim
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
Aşağıdaki komutla oluşturulan podların durumunu kontrol edin ve hazır ("ready") olana kadar bekleyin.
kubectl get all -n metallb-system
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
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.
Yaml dosyasını uygulayarak, bir IP adres havuzu oluşturunuz.
kubectl apply -f ip-pool.yaml
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
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
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
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
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
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
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
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
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
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.