Merhaba arkadaşlar bugünkü laboratuvar yazımızda Ingress Controller’larla ilgili örnekler yapacağız. Bir nevi uygulamalarımızı gelişmiş service olarak dağıtacağız diyebiliriz.
Cluster dışına çıkacak yada host node içerisinde düşük sayıdaki port’ları gösterecek çok sayıda service’iniz varsa ingress controller veya service ağı oluşturabilirsiniz. Kubernetes’in nginx’i resmen desteklediği olsada burada kurulumu daha kolay olan Traefik ingress controller’ları kullanacağız.
Öncelikle bir deployment oluşturalım.
$ kubectl create deployment nginxsunucu1 --image=nginx
deployment.apps/nginxsunucu1 created
Deployment içerisindeki label’ları bulalım. Bu label’ları ingress controller’dan gelen trafikleri servise bağlamak için kullanacağız.
$ kubectl get deployments nginxsunucu1 -o yaml | grep label -A2
labels:
app: nginxsunucu1
name: nginxsunucu1
--
labels:
app: nginxsunucu1
spec:
Sunucumuz için bir NodePort ortaya çıkaralım.
$ kubectl expose deployment nginxsunucu1 --type=NodePort --port=80
service/nginxsunucu1 exposed
Daha önceden RBAC’ı yapılandırdığımız için, ingress controller’ın gerekli tüm port’lar, endpoint’ler ve kaynaklarla çalışacağından emin olmalıyız. clusterrole ve clusterrolebinding türlerini YAML dosyasıyla kuracağız.
$ vim ingress-rbac.yaml
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: traefik-ingress-controller
rules:
- apiGroups:
- ""
resources:
- services
- endpoints
- secrets
verbs:
- get
- list
- watch
- apiGroups:
- extensions
resources:
- ingresses
verbs:
- get
- list
- watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: traefik-ingress-controller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: traefik-ingress-controller
subjects:
- kind: ServiceAccount
name: traefik-ingress-controller
namespace: kube-system
Yeni role ve bağlamalarımızı dağıtalım.
$ kubectl create -f ingress.rbac.yaml
clusterrole.rbac.authorization.k8s.io/traefik-ingress-controller created
clusterrolebinding.rbac.authorization.k8s.io/traefik-ingress-controller created
Traefik controller’ını oluşturmamız lazım. Doğrudan bir web sitesi içerisinde yer alan script’i kullanacağız. Bu URL üzerinden script’e ulaşabilirsiniz.
$ wget https://tinyurl.com/y6hg2owg -O traefik-ds.yaml
$ kubectl create -f traefik-ds.yaml
serviceaccount/traefik-ingress-controller created
daemonset.extensions/traefik-ingress-controller created
service/traefik-ingress-service created
Şimdi yeni bir controller oluşturduk ve bu controller için yeni kurallar eklememiz gerekiyor. Burada test yaparken host’u nginxsunucu1.com olarak ayarladım (Bu host adını bilerek yanlış verdik. İçeride olmayan bir başlık kullandık.) Ayrıca serviceName’inin daha önceki adımda bulduğumuz nginxsunucu1 label’u ile eşleşmesi gerekir.
$ vim ingress-rule.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-test
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: www.nginxsunucu1.com
http:
paths:
- backend:
serviceName: nginxsunucu1
servicePort: 80
path: /
$ kubectl create -f ingress-rule.yaml
ingress.extensions/ingress-test created
Internal ve external IP adreslerini test etmeli ve nginx hoşgeldiniz sayfasını görmeliyiz. Loadbalancer bu durumda curl isteğinde bulunduğumuzda trafiği external arayüze sunacaktır.
$ ip a
....
2: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc mq state UP group default qlen 1000
link/ether 42:01:0a:80:00:02 brd ff:ff:ff:ff:ff:ff
inet 10.128.0.2/32 brd 10.128.0.2 scope global ens4
....
$ curl -H "Host: www.nginxsunucu1.com" http://10.128.0.2/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
....
$ curl -H "Host: www.nginxsunucu1.com" http://35.194.13.86/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
....
Bu noktada gittikçe daha fazla web sunucusu eklemeye devam edeceğiz. İşlem devam ettikçe yapılandırmaya devam edeceğiz.
Başka bir nginx sunucusu dağıtarak başlayalım. Bir label belirleyeli ve 80 numaralı port’u atayalım.
$ kubectl create deployment nginxsunucu2 --image=nginx
deployment.apps/nginxsunucu2 created
$ kubectl get deployment nginxsunucu2 -o yaml | grep label -A2
labels:
app: nginxsunucu2
name: nginxsunucu2
--
labels:
app: nginxsunucu2
spec:
$ kubectl expose deployment nginxsunucu2 --type=NodePort --port=80
service/nginxsunucu2 exposed
Şimdi kurulumu özelleştireceğiz. Yeni pod’un içine girip bash shell’de komutlar çalıştıracağız. nginx’in hoşgeldiniz sayfasına giderek web sayfası title’ını “nginxsunucu2” olarak ayarlayacağız.
$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginxsunucu1-5fd47fcc4-2c4m7 1/1 Running 0 109m
nginxsunucu2-5d6b6d9577-xtg7g 1/1 Running 0 2m47s
$ kubectl exec -ti nginxsunucu2-5d6b6d9577-xtg7g -- /bin/bash
$ apt-get update
$ apt-get install vim -y
$ vim /usr/share/nginx/html/index.html
<head>
<title>NGINX SUNUCU 2</title>
<style>
....
$ exit
nginxsunucu2 service’ini işaret etmek için giriş kurallarını düzenleyelim. Önceki adımda bulduğumuz serviceName’ini kullanmayı unutmayalım.
$ kubectl edit ingress ingress-test
....
rules
- host: www.nginxsunucu1.com
http:
paths:
- backend:
serviceName: nginxsunucu1
servicePort: 80
path: /
- host: www.nginxsunucu2.com
http:
paths:
- backend:
serviceName: nginxsunucu2
servicePort: 80
path: /
....
Artık oluşturduğumuz kuralla beraber ikinci hostname’e curl isteğinde bulunabiliriz.
$ curl -H "Host: www.nginxsunucu2.com" http://10.128.0.2/
<!DOCTYPE html>
<html>
<head>
<title>NGINX SUNUCU 2</title>
<style>
....
Gördüğünüz gibi curl isteği ile beraber artık belirlediğimiz title’daki sayfayı görmeye başladık. Aşağıda iste Traefik Loadbalancer’ın 8080 portundan Dashboard’unu görebilirsiniz. Yazdığımzı kurallar arayüzde mevcut.
Umarım bu yazı sizin için bilgilendirici olmuştur. Yazıyla ilgili bir sorunuz, görüşünüz veya isteğiniz varsa alt kısımda bulunan yorumlardan veya mail adresimden iletişime geçebilirsiniz. Bu yazının başkaları içinde bilgilendirici olduğunu düşünüyorsanız sosyal olun ve sosyal medyada paylaşın! Okuduğunuz için teşekkürler !!!
1 thought on “Kubernetes LAB08 18/20”