HA Kubernetes üzerine MetalLB ve Kong Ingress Kurulumu
HA Kubernetes kurulumunu incelemek için şu yazımı okuyabilirsiniz.
1. MetalLB Kurulumu
Ingress işlemlerini yaparken cloud providerlar kendi ortamlarındaki servisleri entegre ederek Ingress işlemlerinde external ipleri bu servislerden sağlarlar. Bare-metal kurulumlarda Ingress işlemleri için gerekli olan external ip adreslerini sağlamak ve yönetmek için devreye metallb gidiyor.
Kuruluma geçmeden önce mutlaka incelemeniz gereken tablolardan biri supported platform
supported CNI plugins
Öncelikle Metallb kurulumunu yapıyoruz. Kurulum öncesinde kubernetes configlerinde bazı parametreleri değiştirmemiz gerekiyor.
kubectl edit configmap -n kube-system kube-proxy
Metallb kurulumunu yapıyoruz.
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.5/config/manifests/metallb-native.yaml
Metallb kurulumu için son adım olaran ip pool konfigürasyonunu yapmamız gerekiyor. Bunun için metallb-config.yaml dosyalı oluşturulur ve create edilir.
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
namespace: metallb-system
spec:
addresses:
- 10.30.90.100/27 #Kendi ortamınıza göre değiştirmeniz gerekmektedir.
2. Kong Ingress Controller (KIC) Kurulumu
KIC kurulumu metallb kurulum ve ayarlarını yaptıktan sonra tek komut ile yapılabiliyor.
kubectl apply -f https://bit.ly/k4k8s
Kurulum tamamlandı kontrol ettiğimde metallb’de belirtiğim pool içerisinden bir ip adresi aldığını görüyorum.
kubectl -n kong get service kong-proxy
Bu ip adresini sanal sunucu dışından erişime açmak için sanal bir nic oluşturuyorum.
ifconfig ens192:0 10.30.90.96 netmask 255.255.255.0 up
3. Havada Kalmasın Akılda Kalsın( :) )
Senaryo: Benim elimde foo ve bar adında 2 tane uygulama olsun. Ben bunları KIC ile kubernetes ekosisteminin dışından erişilebilir duruma getirmek istiyorum. Erişim içinde
EXTERNAL_IP/foo → foo application
EXTERNAL_IP/bar → bar application
Hadi halledelim şu işi.
Öncelikle foo ve bar uygulamaları için deployment ve service tanımlarını yapıyoruz.
#foo application
apiVersion: apps/v1
kind: Deployment
metadata:
name: foo-deployment
spec:
replicas: 1
selector:
matchLabels:
app: foo
template:
metadata:
labels:
app: foo
spec:
containers:
- name: api
image: digitalronin/foo-microservice:0.1
ports:
- containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
name: foo-service
labels:
app: foo-service
spec:
ports:
- port: 5000
name: http
targetPort: 5000
selector:
app: foo
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: foo
namespace: default
spec:
ingressClassName: kong
rules:
- http:
paths:
- path: /foo
pathType: Prefix
backend:
service:
name: foo-service
port:
number: 5000#bar application
apiVersion: apps/v1
kind: Deployment
metadata:
name: bar-deployment
spec:
replicas: 1
selector:
matchLabels:
app: bar
template:
metadata:
labels:
app: bar
spec:
containers:
- name: api
image: digitalronin/bar-microservice:0.1
ports:
- containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
name: bar-service
labels:
app: bar-service
spec:
ports:
- port: 5000
name: http
targetPort: 5000
selector:
app: bar
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: bar
namespace: default
spec:
ingressClassName: kong
rules:
- http:
paths:
- path: /bar
pathType: Prefix
backend:
service:
name: bar-service
port:
number: 5000
Apply edelim.
kubectl apply -f foo.yaml
kubectl apply -f bar.yaml
Erişmeye çalışıyoruz ve tam istediğimiz gibi çalışıyor.