Kubernetes LAB08 18/20

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.

Traefik LoadBalancer Dashboard
Traefik LoadBalancer Dashboard

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 !!!

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir