Daha önceki konumuzda tüm worker’lar üzerinde kaldırdığımız podların Kubernetes service – ingress tarafından hangi worker ip adresine istek giderse gitsin yük dengelediğini gördük.
Çok fazla Worker sunucumuz olabilir veya bunların ip adreslerini değiştirmek durumunda kalabiliriz. Bazı uygulamalar sadece tek bir ip adresi üzerinden request göndermek isteyebilir. DNS tarafında round-robin yapmayıp Kubernetes cluster içerisinde bunu yapmak isteyebiliriz gibi gibi… Bir çok sebep bu işlemi yapmak için bir neden olabilir.
İşte tam bu noktada biz MetalLB ile Load-Balancer’a atayacağımız ip adresini Pod’un label’ı ile eşleştirip ardından o ip adresine gelen isteği Worker’lara ilettirebiliriz.
Şimdi Rancher makinemizden kubectl yardımı ile işlemlere devam ediyoruz.
Öncelikle HELM paket yöneticisi kurulu değilse kuruyoruz.
Bitnami reposunu ekliyoruz
helm repo add bitnami https://charts.bitnami.com/bitnami
Namespace oluşturuyoruz
kubectl create ns metal-lb
Helm ile MetalLB’yi kubernetes üzerine kuruyoruz.
helm install -n metal-lb metal-lb bitnami/metallb
Kurulum bittikten sonra aşağıdaki yaml dosyasını kubectl üzerinden kaldırıyoruz. MetalLB 4 versiyonundan sonra ip pool’u ayrı bir şekilde belirtiyoruz.
IP adreslerini kendinize göre düzenlemeyi unutmayın.
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
namespace: metallb-system
spec:
addresses:
- 192.168.10.0/24
- 192.168.9.1-192.168.9.5
- fc00:f853:0ccd:e799::/124
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2
namespace: metal-lb
Yukarıdaki işlemlerden sonra uygulamamızı yayına vermek için nginx ingress controller kuruyoruz
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml
Artık kaldırdığınız uygulamanın ingress’inde spec kısmını aşağıdaki gibi matchlemeniz gerekiyor
spec:
ingressClassName: nginx
Eğer ikincil bir ağ kaldırmak isterseniz aşağıdaki yaml komutlarını baz alabilirsiniz
---
# https://kubernetes.github.io/ingress-nginx/user-guide/cli-arguments/
#
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-ingress-rancher-controller
namespace: "ingress-nginx"
#labels:
spec:
selector:
matchLabels:
name: nginx-ingress-rancher
template:
metadata:
labels:
name: nginx-ingress-rancher
spec:
terminationGracePeriodSeconds: 60
serviceAccountName: ingress-nginx
containers:
- image: k8s.gcr.io/ingress-nginx/controller:v0.35.0
name: nginx-ingress
livenessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
timeoutSeconds: 5
lifecycle:
preStop:
exec:
command:
- /wait-shutdown
securityContext:
capabilities:
add:
- NET_BIND_SERVICE
drop:
- ALL
runAsUser: 101 # www-data
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
ports:
- name: http
containerPort: 80
hostPort: 90
- name: https
containerPort: 443
hostPort: 453
- name: health
containerPort: 10254
hostPort: 10264
args:
- /nginx-ingress-controller
#- --configmap=$(POD_NAMESPACE)/nginx-load-balancer-microk8s-conf
#- --tcp-services-configmap=$(POD_NAMESPACE)/nginx-ingress-tcp-microk8s-conf
#- --udp-services-configmap=$(POD_NAMESPACE)/nginx-ingress-udp-microk8s-conf
- --ingress-class=rancher
- --publish-status-address=127.0.0.1
Aşağıdaki 10.0.0.155 kısmı servisi bağlayacağınız ingress’in hangi ip adresi ile çalışacağını belirttiğiniz kısım.
---
apiVersion: v1
kind: Service
metadata:
name: ingress-rancher
namespace: "ingress-nginx"
spec:
selector:
name: nginx-ingress-rancher
type: LoadBalancer
# loadBalancerIP is optional. MetalLB will automatically allocate an IP
# from its pool if not specified. You can also specify one manually.
loadBalancerIP: 10.0.0.155
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
- name: https
protocol: TCP
port: 443
targetPort: 443
Bu ikincil yamlları kaldırdıktan sonra kaldırdığınız podun ingressi için matchlemeniz gereken değer aşağıdaki gibi olacaktır
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
ingressClassName: nginx
...