[บันทึกช่วยจำ] ลองเล่น Traefik Ingress ใน K8S Cluster บน On-Premises

Kritsadanshon Sadeewong
10 min readSep 6, 2020

สารบัญ

จากครั้งที่เราทดลองใช้งาน NGINX Ingress บน K8S Cluster แล้ว เรามาลองใช้งาน Traefix ดูบ้างว่าการใช้งานจะแตกต่างกันมากน้อยขนาดไหน ซึ่งผู้เขียนเองก็ได้เคยใช้งานเจ้า Traefix มาแล้วแต่ใช้งานอยู่ Swarm Cluster ก็ต้องบอกเลยว่าสะดวกสบายมากๆ ในการจัดการบริหาร service ต่างๆ

ซึ่งเจ้า Traefix นั้น Open-Source ประเภท Edge Router ทำหน้าที่จัดการเมื่อมีการเรียกใช้งานจากหน้าบ้าน ว่าเมื่อมีการเรียกแบบนี้ต้องวิ่งไปหา service ตัวไหน หรือมีการจัดการ header อะไรเพิ่มเติมหรือเปล่าเป็นต้น

ส่วนประกอบต่างๆ ก็ยังมีเหมือนกับ NGINX Ingress

Ingress, Ingress Resource เป็น service ประเภทหนึ่งมีหน้าที่บริการ application ต่างๆ ที่อยู่ภายใน cluster ส่งออกไปข้างนอกโดยที่เราสามารถกำหนด rules ต่างๆได้ดัง

Content-based routing: ใช้ในการกำหนดการว่าหากมีการเรียกแบบนี้ให้ไป service ไหน โดยจะมีการแบ่งออกเป็น 2 แบบอีก

  • Host-based routing. เป็นการกำหนดใช้ Hostname (FQDN) เป็นตัวกำหนด routing ว่าเรียกแบบนี้เข้ามาให้ไปที่ services อะไร เช่น images.demo.domain
  • Path-based routing. เป็นการกำหนดใช้ pathเป็นตัวกำหนด routing ว่าเรียกแบบนี้เข้ามาให้ไปที่ services อะไร เช่น demo.domain/images

TLS/SSL termination: ใช้ในการทำเรื่อง Offload SSL certificate

สำหรับ infrastructure ทางผู้เขียนได้ใช่ของเดิมจากครั้งที่แล้ว

เอาละละเราไปลงมือทำกันเถอะ

ตั้งค่าเกี่ยว RBAC และ Deploy Ingress Controller

ขั้นตอนที่ 1 — สร้าง service account สำหรับ Ingress controller

dcadmin@k8s-operation:~$ kubectl apply -f traefik-ds.yaml

traefik-ds.yaml

---
apiVersion: v1
kind: ServiceAccount
metadata:
name: traefik-ingress-controller
namespace: kube-system
---
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: traefik-ingress-controller
namespace: kube-system
labels:
k8s-app: traefik-ingress-lb
spec:
selector:
matchLabels:
k8s-app: traefik-ingress-lb
name: traefik-ingress-lb
template:
metadata:
labels:
k8s-app: traefik-ingress-lb
name: traefik-ingress-lb
spec:
serviceAccountName: traefik-ingress-controller
terminationGracePeriodSeconds: 60
containers:
- image: traefik:v1.7
name: traefik-ingress-lb
ports:
- name: http
containerPort: 80
hostPort: 80
- name: admin
containerPort: 8080
hostPort: 8080
securityContext:
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
args:
- --api
- --kubernetes
- --logLevel=INFO
---
kind: Service
apiVersion: v1
metadata:
name: traefik-ingress-service
namespace: kube-system
spec:
selector:
k8s-app: traefik-ingress-lb
ports:
- protocol: TCP
port: 80
name: web
- protocol: TCP
port: 8080
name: admin

ขั้นตอนที่ 2 — สร้าง cluster role และทำการ binding cluster role ให้กับ service account ที่สร้างขึ้นมา

dcadmin@k8s-operation:~$ kubectl apply -f traefik-rbac.yaml

traefik-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
- apiGroups:
- extensions
resources:
- ingresses/status
verbs:
- update
---
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

ขั้นตอนที่ 3— สร้าง service และ ingress resource สำหรับ UI dashboard

dcadmin@k8s-operation:~$ kubectl apply -f traefik-ui.yaml

traefik-ui.yaml

---
apiVersion: v1
kind: Service
metadata:
name: traefik-web-ui
namespace: kube-system
spec:
selector:
k8s-app: traefik-ingress-lb
ports:
- name: web
port: 80
targetPort: 8080
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: traefik-web-ui
namespace: kube-system
spec:
rules:
- host: traefik-ui.k8s.lab.local
http:
paths:
- path: /
backend:
serviceName: traefik-web-ui
servicePort: web

ขั้นตอนที่ 4 — ตรวจสอบ pods, service และ ingress ต่างๆ

dcadmin@k8s-operation:~$ kubectl get all -n kube-system | grep traefik

ผลลัพธ์ที่ได้

pod/traefik-ingress-controller-m5hsr              1/1     Running   0          4m1s
pod/traefik-ingress-controller-smzx4 1/1 Running 0 4m1s
pod/traefik-ingress-controller-v2sgb 1/1 Running 0 4m1s
service/traefik-ingress-service ClusterIP 10.233.23.253 <none> 80/TCP,8080/TCP 4m2s
service/traefik-web-ui ClusterIP 10.233.55.191 <none> 80/TCP 3m50s
daemonset.apps/traefik-ingress-controller 3 3 3 3 3 <none> 4m2s

ขั้นตอนที่ 5 — แก้ไข hosts ที่เครื่องเราเองให้สามารถเรียกใช้งาน UI dashboard ได้

172.16.31.78    traefik-ui.k8s.lab.local

ขั้นตอนที่ 6 — ลองเรียกใช้งาน UI dashboard

ซึ่งเราจะสามารถ rule ต่างๆ ที่เราใช้จาก frontends ไปหา backends ตัวไหน ใช้ route rules อะไรอยู่

ทดลอง Deploy Application

ขั้นตอนที่ 1 — สร้าง deployment สำหรับ main application

dcadmin@k8s-operation:~$ kubectl apply -f nginx-deployment-main.yaml

nginx-deployment-main.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy-main
labels:
run: nginx
spec:
replicas: 2
selector:
matchLabels:
run: nginx-main
template:
metadata:
labels:
run: nginx-main
spec:
containers:
- image: nginx
name: nginx

ขั้นตอนที่ 2 — สร้าง service สำหรับ main application

dcadmin@k8s-operation:~$ kubectl apply -f nginx-service-main.yaml

nginx-service-main.yaml

apiVersion: v1
kind: Service
metadata:
name: nginx-service-main
labels:
run: nginx
spec:
ports:
- port: 80
protocol: TCP
selector:
run: nginx-main

ขั้นตอนที่ 3 — ตรวจสอบ pods และ service

dcadmin@k8s-operation:~$ kubectl get pods,services

ผลลัพธ์ที่ได้

NAME                                     READY   STATUS    RESTARTS   AGE
pod/nginx-deploy-main-7cc547b6f7-4txvp 1/1 Running 0 7s
pod/nginx-deploy-main-7cc547b6f7-ftq57 1/1 Running 0 7s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 12h
service/nginx-service-main ClusterIP 10.233.63.11 <none> 80/TCP 7s

ขั้นตอนที่ 4 — สร้าง ingress resource เพื่อกำหนด rule การ routing โดยทางผู้เขียนจะใช้ Hostname (FQDN) เป็นชื่อ k8s.lab.local ทั้งนี้ผู้ที่ลองทำตามต้องไปทำการแก้ไขไฟล์ hosts ในเครื่องตัวเองให้ระบบ k8s.lab.local ไปที่ VIP ของ HA Proxy ด้วย

dcadmin@k8s-operation:~$ kubectl apply -f ingress-resource.yaml

ingress-resource.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-resource
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: k8s.lab.local
http:
paths:
- backend:
serviceName: nginx-service-main
servicePort: 80

ตรวจสอบ ingress resource

dcadmin@k8s-operation:~$ kubectl get ingress

ผลลัพธ์ที่ได้

NAME               HOSTS           ADDRESS   PORTS   AGE
ingress-resource k8s.lab.local 80 9s

ดูรายละเอียดของ ingress resource

dcadmin@k8s-operation:~$ kubectl describe ingress

ผลลัพธ์ที่ได้

Name:             ingress-resource
Namespace: default
Address:
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
k8s.lab.local
nginx-service-main:80 (10.233.84.9:80,10.233.88.8:80)

Annotations:
kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"networking.k8s.io/v1beta1","kind":"Ingress","metadata":{"annotations":{},"name":"ingress-resource","namespace":"default"},"spec":{"rules":[{"host":"k8s.lab.local","http":{"paths":[{"backend":{"serviceName":"nginx-service-main","servicePort":80}}]}}]}}
Events: <none>

แก้ไข hosts ที่เครื่องเราเองด้วยนะ

172.16.31.78    k8s.lab.local

ขั้นตอนที่ 5 — ทดสอบลองเรียกใช้งาน main application

เย้เรียกเข้าใช้งานได้แล้ว

ขั้นตอนที่ 6— ตรวจสอบหน้า UI dashboard ดูซิ

ทดลอง Deploy Application ตัวต่อไป

ขั้นตอนที่ 1 — สร้าง deployment สำหรับ cat application

dcadmin@k8s-operation:~$ kubectl apply -f nginx-deployment-cat.yaml

nginx-deployment-cat.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: nginx
name: nginx-deploy-cat
spec:
replicas: 2
selector:
matchLabels:
run: nginx-cat
template:
metadata:
labels:
run: nginx-cat
spec:
volumes:
- name: webdata
emptyDir: {}
initContainers:
- name: web-content
image: busybox
volumeMounts:
- name: webdata
mountPath: "/webdata"
command: ["/bin/sh", "-c", 'echo "<title>Welcome to nginx!</title><h1>CAT Application<h1/><p>&nbsp;____&nbsp; &nbsp; &nbsp;_&nbsp; &nbsp; ____<br />/ ___|&nbsp; &nbsp; / \&nbsp; &nbsp;|_ _|<br />| |&nbsp; &nbsp; &nbsp; &nbsp; / _ \&nbsp; &nbsp;| |<br />| |___ / ___ \ | |<br /> \____/_/&nbsp; &nbsp; \_\_|</p>" > /webdata/index.html']
containers:
- image: nginx
name: nginx
volumeMounts:
- name: webdata
mountPath: "/usr/share/nginx/html"

ขั้นตอนที่ 2 — สร้าง service สำหรับ cat application

dcadmin@k8s-operation:~$ kubectl apply -f nginx-service-cat.yaml

nginx-service-cat.yaml

apiVersion: v1
kind: Service
metadata:
name: nginx-service-cat
labels:
run: nginx
spec:
ports:
- port: 80
protocol: TCP
selector:
run: nginx-cat

ขั้นตอนที่ 3 — ตรวจสอบ pods และ service

dcadmin@k8s-operation:~$ kubectl get pods,services

ผลลัพธ์ที่ได้

NAME                                     READY   STATUS    RESTARTS   AGE
pod/nginx-deploy-cat-c6cdd4b64-j74fw 1/1 Running 0 28s
pod/nginx-deploy-cat-c6cdd4b64-xdtw7 1/1 Running 0 28s
pod/nginx-deploy-main-7cc547b6f7-4txvp 1/1 Running 0 3m14s
pod/nginx-deploy-main-7cc547b6f7-ftq57 1/1 Running 0 3m14s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 12h
service/nginx-service-cat ClusterIP 10.233.25.176 <none> 80/TCP 28s
service/nginx-service-main ClusterIP 10.233.63.11 <none> 80/TCP 3m14s

ขั้นตอนที่ 4 — แล้วเราจะเข้าใช้ cat application ยังไงนะ ลองเรียก cat.k8s.lab.local

อย่าลืม แก้ไข hosts ที่เครื่องเราเองด้วยนะ

172.16.31.78    cat.k8s.lab.local

ยังเรียกไม่ได้เพราะยังไม่ได้เพิ่ม rule บน ingress resource

ขั้นตอนที่ 5 — เพิ่ม rule สำหรับ cat.k8s.lab.local ให้เรียกไปที่ nginx-service-cat

dcadmin@k8s-operation:~$ kubectl apply -f ingress-resource.yaml

ingress-resource.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-resource
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: k8s.lab.local
http:
paths:
- backend:
serviceName: nginx-service-main
servicePort: 80
- host: cat.k8s.lab.local
http:
paths:
- backend:
serviceName: nginx-service-cat
servicePort: 80

ตรวจสอบ ingress resource

dcadmin@k8s-operation:~$ kubectl get ingress

ผลลัพธ์ที่ได้

NAME               HOSTS                             ADDRESS   PORTS   AGE
ingress-resource k8s.lab.local,cat.k8s.lab.local 80 3m4s

ดูรายละเอียดของ ingress resource

dcadmin@k8s-operation:~$ kubectl describe ingress

ผลลัพธ์ที่ได้

Name:             ingress-resource
Namespace: default
Address:
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
k8s.lab.local
nginx-service-main:80 (10.233.84.9:80,10.233.88.8:80)
cat.k8s.lab.local
nginx-service-cat:80 (10.233.74.9:80,10.233.88.9:80)

Annotations:
kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"networking.k8s.io/v1beta1","kind":"Ingress","metadata":{"annotations":{},"name":"ingress-resource","namespace":"default"},"spec":{"rules":[{"host":"k8s.lab.local","http":{"paths":[{"backend":{"serviceName":"nginx-service-main","servicePort":80}}]}},{"host":"cat.k8s.lab.local","http":{"paths":[{"backend":{"serviceName":"nginx-service-cat","servicePort":80}}]}}]}}
Events: <none>

ขั้นตอนที่ 5 — ทดสอบลองเรียกใช้งาน cat application อีกครั้ง

เย้เข้าได้แล้ว

ขั้นตอนที่ 6 — ตรวจสอบหน้า UI dashboard ดูซิ

ทดลอง Deploy Application อีกสัก 2 ตัว

ขั้นตอนที่ 1 — สร้าง deployment สำหรับ dog application

dcadmin@k8s-operation:~$ kubectl apply -f nginx-deployment-dog.yaml

nginx-deployment-dog.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: nginx
name: nginx-deploy-dog
spec:
replicas: 2
selector:
matchLabels:
run: nginx-dog
template:
metadata:
labels:
run: nginx-dog
spec:
volumes:
- name: webdata
emptyDir: {}
initContainers:
- name: web-content
image: busybox
volumeMounts:
- name: webdata
mountPath: "/webdata"
command: ["/bin/sh", "-c", 'echo "<title>Welcome to nginx!</title><h1>DOG Application<h1/><p>____&nbsp; ___&nbsp; &nbsp;____<br />|&nbsp; &nbsp;_ \/&nbsp; _ \ / ___|<br />| |&nbsp; | | |&nbsp; | | |&nbsp; _<br />| |_| | |_| | |_| |<br />|___/\___/ \___|</p>" > /webdata/index.html']
containers:
- image: nginx
name: nginx
volumeMounts:
- name: webdata
mountPath: "/usr/share/nginx/html"

ขั้นตอนที่ 2 — สร้าง service สำหรับ dog application

dcadmin@k8s-operation:~$ kubectl apply -f nginx-service-dog.yaml

nginx-service-dog.yaml

apiVersion: v1
kind: Service
metadata:
name: nginx-service-dog
labels:
run: nginx
spec:
ports:
- port: 80
protocol: TCP
selector:
run: nginx-dog

ขั้นตอนที่ 3 — สร้าง deployment สำหรับ rabbit application

dcadmin@k8s-operation:~$ kubectl apply -f nginx-deployment-rabbit.yaml

nginx-deployment-rabbit.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: nginx
name: nginx-deploy-rabbit
spec:
replicas: 2
selector:
matchLabels:
run: nginx-rabbit
template:
metadata:
labels:
run: nginx-rabbit
spec:
volumes:
- name: webdata
emptyDir: {}
initContainers:
- name: web-content
image: busybox
volumeMounts:
- name: webdata
mountPath: "/webdata"
command: ["/bin/sh", "-c", 'echo "<title>Welcome to nginx!</title><h1>RABBIT Application<h1/><p>____&nbsp; &nbsp; &nbsp; &nbsp; _&nbsp; &nbsp; &nbsp;___&nbsp; ___&nbsp; ___ ____<br />|&nbsp; &nbsp;_ \&nbsp; &nbsp; &nbsp; / \&nbsp; &nbsp;| __ )| __ )_ _|_&nbsp; &nbsp;_|<br />|&nbsp; |_) |&nbsp; &nbsp;/ _ \&nbsp; |&nbsp; _ \|&nbsp; _&nbsp; \| |&nbsp; &nbsp; | |<br />|&nbsp; &nbsp;_ &lt;&nbsp; / ___ \| |_) | |_) | |&nbsp; &nbsp; | |<br />|_| \_\/_/&nbsp; &nbsp; \_\___/|___/___||_|</p>" > /webdata/index.html']
containers:
- image: nginx
name: nginx
volumeMounts:
- name: webdata
mountPath: "/usr/share/nginx/html"

ขั้นตอนที่ 4 — สร้าง service สำหรับ rabbit application

dcadmin@k8s-operation:~$ kubectl apply -f nginx-service-rabbit.yaml

nginx-service-rabbit.yaml

apiVersion: v1
kind: Service
metadata:
name: nginx-service-rabbit
labels:
run: nginx
spec:
ports:
- port: 80
protocol: TCP
selector:
run: nginx-rabbit

ขั้นตอนที่ 5 — ตรวจสอบ pods และ service

dcadmin@k8s-operation:~$ kubectl get pods,services

ผลลัพธ์ที่ได้

NAME                                       READY   STATUS    RESTARTS   AGE
pod/nginx-deploy-cat-c6cdd4b64-j74fw 1/1 Running 0 3m22s
pod/nginx-deploy-cat-c6cdd4b64-xdtw7 1/1 Running 0 3m22s
pod/nginx-deploy-dog-5dd6cb45c7-jrk4x 1/1 Running 0 23s
pod/nginx-deploy-dog-5dd6cb45c7-vn92n 1/1 Running 0 23s
pod/nginx-deploy-main-7cc547b6f7-4txvp 1/1 Running 0 6m8s
pod/nginx-deploy-main-7cc547b6f7-ftq57 1/1 Running 0 6m8s
pod/nginx-deploy-rabbit-5557fdf458-swmdj 1/1 Running 0 19s
pod/nginx-deploy-rabbit-5557fdf458-x2r94 1/1 Running 0 19s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 12h
service/nginx-service-cat ClusterIP 10.233.25.176 <none> 80/TCP 3m22s
service/nginx-service-dog ClusterIP 10.233.61.154 <none> 80/TCP 23s
service/nginx-service-main ClusterIP 10.233.63.11 <none> 80/TCP 6m8s
service/nginx-service-rabbit ClusterIP 10.233.58.3 <none> 80/TCP 19s

ขั้นตอนที่ 6 — แก้ไข hosts ที่เครื่องเราเพื่อเพิ่ม hostname ที่เราจะเรียกเข้าไปใช้งาน service

172.16.31.78    dog.k8s.lab.local
172.16.31.78 rabbit.k8s.lab.local

ขั้นตอนที่ 7 — เพิ่ม rule สำหรับ dog.k8s.lab.local และ rabbit.k8s.lab.local ให้เรียกไปที่ nginx-service-dog และ nginx-service-rabbit

dcadmin@k8s-operation:~$ kubectl apply -f ingress-resource.yaml

ingress-resource.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-resource
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: k8s.lab.local
http:
paths:
- backend:
serviceName: nginx-service-main
servicePort: 80
- host: cat.k8s.lab.local
http:
paths:
- backend:
serviceName: nginx-service-cat
servicePort: 80
- host: dog.k8s.lab.local
http:
paths:
- backend:
serviceName: nginx-service-dog
servicePort: 80
- host: rabbit.k8s.lab.local
http:
paths:
- backend:
serviceName: nginx-service-rabbit
servicePort: 80

ตรวจสอบ ingress resource

dcadmin@k8s-operation:~$ kubectl get ingress

ผลลัพธ์ที่ได้

NAME               HOSTS                                                           ADDRESS   PORTS   AGE
ingress-resource k8s.lab.local,cat.k8s.lab.local,dog.k8s.lab.local + 1 more... 80 5m53s

ดูรายละเอียดของ ingress resource

dcadmin@k8s-operation:~$ kubectl describe ingress

ผลลัพธ์ที่ได้

Name:             ingress-resource
Namespace: default
Address:
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
k8s.lab.local
nginx-service-main:80 (10.233.84.9:80,10.233.88.8:80)
cat.k8s.lab.local
nginx-service-cat:80 (10.233.74.9:80,10.233.88.9:80)
dog.k8s.lab.local
nginx-service-dog:80 (10.233.74.10:80,10.233.84.10:80)
rabbit.k8s.lab.local
nginx-service-rabbit:80 (10.233.84.11:80,10.233.88.10:80)

Annotations:
kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"networking.k8s.io/v1beta1","kind":"Ingress","metadata":{"annotations":{},"name":"ingress-resource","namespace":"default"},"spec":{"rules":[{"host":"k8s.lab.local","http":{"paths":[{"backend":{"serviceName":"nginx-service-main","servicePort":80}}]}},{"host":"cat.k8s.lab.local","http":{"paths":[{"backend":{"serviceName":"nginx-service-cat","servicePort":80}}]}},{"host":"dog.k8s.lab.local","http":{"paths":[{"backend":{"serviceName":"nginx-service-dog","servicePort":80}}]}},{"host":"rabbit.k8s.lab.local","http":{"paths":[{"backend":{"serviceName":"nginx-service-rabbit","servicePort":80}}]}}]}}
Events: <none>

ขั้นตอนที่ 8 — ทดสอบลองเรียกใช้งาน dog application และ rabbit application

ขั้นตอนที่ 9— ตรวจสอบหน้า UI dashboard ดูซิ

ลองเปลี่ยนมาใช้ Path-based routing ดูซิ

ขั้นตอนที่ 1— แก้ไข ingress resource ไปใช้งาน path-base routing

dcadmin@k8s-operation:~$ kubectl apply -f ingress-resource.yaml

ingress-resource.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-resource
annotations:
traefik.frontend.rule.type: PathPrefixStrip
spec:
rules:
- host: k8s.lab.local
http:
paths:
- path: /
backend:
serviceName: nginx-service-main
servicePort: 80
- path: /cat
backend:
serviceName: nginx-service-cat
servicePort: 80
- path: /dog
backend:
serviceName: nginx-service-dog
servicePort: 80
- path: /rabbit
backend:
serviceName: nginx-service-rabbit
servicePort: 80

ตรวจสอบ ingress resource

dcadmin@k8s-operation:~$ kubectl get ingress

ผลลัพธ์ที่ได้

NAME               HOSTS           ADDRESS   PORTS   AGE
ingress-resource k8s.lab.local 80 9m16s

ดูรายละเอียดของ ingress resource

dcadmin@k8s-operation:~$ kubectl describe ingress

ผลลัพธ์ที่ได้

Name:             ingress-resource
Namespace: default
Address:
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
k8s.lab.local
/ nginx-service-main:80 (10.233.84.9:80,10.233.88.8:80)
/cat nginx-service-cat:80 (10.233.74.9:80,10.233.88.9:80)
/dog nginx-service-dog:80 (10.233.74.10:80,10.233.84.10:80)
/rabbit nginx-service-rabbit:80 (10.233.84.11:80,10.233.88.10:80)

Annotations:
kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"networking.k8s.io/v1beta1","kind":"Ingress","metadata":{"annotations":{"traefik.frontend.rule.type":"PathPrefixStrip"},"name":"ingress-resource","namespace":"default"},"spec":{"rules":[{"host":"k8s.lab.local","http":{"paths":[{"backend":{"serviceName":"nginx-service-main","servicePort":80},"path":"/"},{"backend":{"serviceName":"nginx-service-cat","servicePort":80},"path":"/cat"},{"backend":{"serviceName":"nginx-service-dog","servicePort":80},"path":"/dog"},{"backend":{"serviceName":"nginx-service-rabbit","servicePort":80},"path":"/rabbit"}]}}]}}
traefik.frontend.rule.type: PathPrefixStrip
Events: <none>

เราจะเห็นได้ว่า rules ได้เปลี่ยนไปละ

ขั้นตอนที่ 2— ทดเรียกใช้งานหน้าเว็บ application ต่างๆ

main

cat

dog

rabbit

ขั้นตอนที่ 3 — ตรวจสอบหน้า UI dashboard ดูซิ

เราจะเห็นได้ว่า rules บนหน้า dashboard ก็เปลี่ยนไปด้วย

สุดท้ายการลองเล่นครั้งก็เป็นเพียงการใช้งานเบื้องต้น ตัว traefik ยังไม่ลูกเล่นอีกมากมายที่ให้เราใช้งาน แต่ต้องเรียนรู้ และหัดใช้งานกันต่อไป

สุดท้ายแล้วหากท่านไหนหลงเข้ามาอ่านแล้วเห็นว่าผมยังเข้าใจผิดในเรื่องใด สามารถให้ข้อมูลเพิ่มเติมได้ครับ

Ref: https://docs.traefik.io/

Ref: https://docs.traefik.io/v1.7/user-guide/kubernetes/

--

--

Kritsadanshon Sadeewong

นายช่างระบบระบบคอมพิวเตอร์ ที่ชอบทดลอง และเรียนรู้สิ่งใหม่ไปเรื่อยๆ