[บันทึกช่วยจำ] ลองเล่น 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

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