Basic Kubernetes Part 10 - Helm - เครื่องมือที่ช่วยในการ Deploy อะไรที่ซับซ้อน Part 3

Basic Kubernetes Part 10 - Helm - เครื่องมือที่ช่วยในการ Deploy อะไรที่ซับซ้อน Part 3

ในการ Deploy นั้นไม่ใช่ว่าทุกการ Deploy จะสำเร็จ บางทีอาจจะเกิดปัญหาขึ้น เช่น มีการ config ผิด หรือพอ Deploy ไปแล้วเกิด Bug ที่รุนแรงจนระบบไม่สามารถทำงานต่อได้ ซึ่งเมื่อเกิดเรื่องแบบนี้ขึ้นก็เป็นที่แน่นอนว่าเราต้องทำการ Rollback เอาการ Deploy ครั้งก่อนกลับมา ซึ่งวิธีการ Rollback กลับมาก็มีได้หลายวิธี เช่น เอา VM ที่ Backup ไว้กลับมา เอา Folder ของ App เวอร์ชั่นเก่ากลับมา เป็นต้น

คราวนี้พอเรามาใช้ k8s ในการ deploy application เราจะเอาการ deploy เก่ากลับมายังไง วิธีง่ายสุดก็คือเก็บไฟล์ yaml เก่าเก็บไว้ พอมีปัญหาค่อยเอาตัวเก่ามาสั่ง apply แต่ปัญหาคือ ในไฟล์ yaml ที่เราสร้างนั้นมีการเพิ่ม deployment service หรือสิ่งต่างๆเข้าไป พอคุณเอาไฟล์เก่ามา apply ตัว resource ใหม่ที่เพิ่มมามันไม่หายไปด้วย ซึ่งนั่นเป็นปัญหาที่คุณต้องตามไปจัดการ

ซึ่งคนที่ใช้ helm ในการ deploy ก็เจอปัญหานี้เหมือนกัน ดังนั้นเขาจึงคิดวิธีการจัดการปัญหาโดยมี Feature การ Rollback ให้กับเราครับ

Deploy version 1

ตัวอย่างไฟล์ทั้งหมดสามารถดูได้ที่ Link

ในขั้นแรกเราลอง Deploy application version 1 กันก่อนโดยไฟล์ template ที่ใช้ในการ deploy คือ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami-deployment
labels:
app: whoami
spec:
selector:
matchLabels:
app: whoami-app
template:
metadata:
labels:
app: whoami-app
spec:
containers:
- name: whoami-container
image: traefik/whoami
ports:
- containerPort: 80
env:
- name: "OWNER"
value: {{ .Values.owner }}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: whoami-ingress
spec:
rules:
- host: {{ .Values.domain }}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: whoami-service
port:
number: 80
---
apiVersion: v1
kind: Service
metadata:
name: whoami-service
spec:
selector:
app: whoami-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP

จากนั้นสั่ง deploy

1
helm upgrade --install whoami-helm --namespace whoami-namespace  --create-namespace whoami/

จากนั้นลองสั่งคำสั่งด้านล่างเพื่อดู Resource ที่เราทำการสร้างขึ้นมาว่ามีอะไรบ้าง

1
kubectl -n whoami-namespace get all

จากนั้นลองสั่งคำสั่งด้านล่างเพื่อดูรายละเอียดของชุด Deploy ที่เราสร้างด้วย helm ครับ

1
helm list -A

จะเห็นว่ามีการสร้างชุด deploy ชื่อ whoami-helm ขึ้นมาแล้วและเลข REVISION เป็น 1 ให้จำเลขตัวนี้ไว้นะครับ

ลองเข้า http://company-c.com/?env=true ผ่าน browser ซึ่งจะเห็นว่าสามารถเปิดได้

Deploy version ที่มีปัญหา

คราวนี้เรามาลองจำลองสถานการณ์ว่าเรา Deploy แล้วเกิดปัญหา โดยผมจะทำการแก้ config ให้ผิด และ เพิ่ม deployment ที่ไม่ใช้งานเข้าไป โดยดูตัวอย่างได้ใน folder : whoami-bug

แก้ไขไฟล์ values.yaml

จากไฟล์จะเห็นว่าผมแก้ตัว domain เปลี่ยนไปทำให้เข้าด้วย http://company-c.com/?env=true ไม่ได้ อีกทั้งก็เปลี่ยนค่า environment owner ไป

1
2
domain: "wasinee-company-c.com"
owner: "WASINEE BD"

แก้ไขไฟล์ whoami.yaml

จากไฟล์ผมจะทำการเพิ่มตัว nginx-bug-deployment เข้าไปเพื่อให้มี deployment ใหม่ที่เกินเข้าไป

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami-deployment
labels:
app: whoami
spec:
selector:
matchLabels:
app: whoami-app
template:
metadata:
labels:
app: whoami-app
spec:
containers:
- name: whoami-container
image: traefik/whoami
ports:
- containerPort: 80
env:
- name: "OWNER"
value: {{ .Values.owner }}
---

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-bug-deployment
labels:
app: nginx-bug
spec:
selector:
matchLabels:
app: nginx-bug-app
template:
metadata:
labels:
app: nginx-bug-app
spec:
containers:
- name: nginx-bug-container
image: nginx:1.25.3-alpine
ports:
- containerPort: 80
---

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: whoami-ingress
spec:
rules:
- host: {{ .Values.domain }}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: whoami-service
port:
number: 80
---
apiVersion: v1
kind: Service
metadata:
name: whoami-service
spec:
selector:
app: whoami-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP

จากนั้นสั่ง deploy ด้วยคำสั่งด้านล่างเพื่อ update ตัว helm

1
helm upgrade --install whoami-helm --namespace whoami-namespace  --create-namespace whoami-bug/

จากนั้นลองสั่งคำสั่งด้านล่างเพื่อดู Resource ที่เราทำการสร้างขึ้นมาว่ามีอะไรบ้าง

1
kubectl -n whoami-namespace get all

จากภาพจะเห็นว่ามี deployment nginx-bug-deployment โผล่ขึ้นมา

จากนั้นลองสั่งคำสั่งด้านล่างเพื่อดูรายละเอียดของชุด Deploy ที่เราสร้างด้วย helm ครับ

1
helm list -A

จะเห็นว่า whoami-helm เปลี่ยน REVISION เป็น 2 แล้ว

ลองเข้า http://company-c.com/?env=true ผ่าน browser ซึ่งจะเห็นว่าไม่สามารถเปิดได้

Rollback กลับเป็น version เก่า

จากตัวส่วนที่แล้วเราได้จำลองการ Deploy ที่เกิดปัญหาคือค่า config domain ผิดและทำการเพิ่ม deployment ใหม่เข้าไป คราวนี้ถ้าเราอยากให้การ deployment ของเราทั้งหมดกลับไปเป็น version ก่อนหน้านี้คือ มีค่า config domain เดิม และ deployment เหมือนเดิมทั้งหมดจะทำยังไงดี อย่างที่บอกไป helm มีคำสั่งให้เรา rollback อยู่แล้ว ซึ่งเราสามารถสั่งได้โดยสั่ง (เดี๋ยวเรามาอธิบายคำสั่งทีหลัง)

1
helm rollback -n whoami-namespace whoami-helm 1 --force

เมื่อสั่งเสร็จเรามาลอง get resource ดูกันว่าเกิดอะไรขึ้น

1
kubectl -n whoami-namespace get all

จะเห็นว่าตัว nginx-bug-deployment หายไปแล้ว

ลองเข้า http://company-c.com/?env=true ผ่าน browser ซึ่งจะเห็นว่าสามารถเปิดเข้าไปได้เหมือนเดิมแล้ว

ซึ่งนั่นแปลว่าการ Deploy ทั้งหมดกลับมาเป็น Version 1 ที่เราต้องการแล้ว ซึ่งแปลว่าเราสามารถทำการ Rollback สำเร็จแล้ว

คราวนี้เรามาลอง helm list ดูกันว่ามีอะไรเปลี่ยนแปลง

1
helm list -A

จากภาพจะเห็นว่าเลข REVISION เปลี่ยนเป็น 3 ต่อจาก 2

อธิบายคำสั่ง helm rollback

1
helm rollback -n whoami-namespace whoami-helm 1 --force
  • helm rollback : เป็นคำสั่งเพื่อสั่งให้ทำการ Rollback
  • -n whoami-namespace : -n เป็นตัวบอกว่าตัวชุด deploy ที่ต้องการ rollack นั้นอยู่ที่ไหน โดยจากตัวอย่างคือ whoami-namespace
  • whoami-helm : ตรงส่วนนี้คือชื่อตัวชุด deploy โดยในตัวอย่างคือ whoami-helm
  • 1 : ตรงส่วนนี้คือตัว REVISION ที่เราต้องการ Rollback กลับไปหา ในที่นี้คือ 1
  • –force : ส่วนนี้เป็นการบอกว่าให้ทำการ update ไม่ว่าจะต้องทำการลบ หรือ สร้างใหม่ก็ตาม

รวมแล้วคือ ทำการ rollback ตัวชุด deploy : whoami-helm ที่อยู่ที่ namespace : whoami-namespace ให้กลับไปอยู่ใน REVISION ที่ 1 โดยทำการลบหรือสร้างใหม่ถ้าจำเป็นต้องทำ

ซึ่งเมื่อทำการสั่ง rollback ไปแล้วนั้นเลข REVISION นั้นจะไม่ได้กลับไปเป็นเลข 1 นะครับ ตัวเลข REVISION จะเพิ่มขึ้นเรื่อยๆ แต่ค่าการ config ต่างๆของ RESOURCE นั้นจะกลับไปเท่ากับ REVISION ที่เราเลือกในคำสั่งครับ

รายละเอียดเพิ่มเติมเกี่ยวกับคำสั่งสามารถดูได้ที่ : https://helm.sh/docs/helm/helm_rollback/

สรุป

ในตอนนี้เราได้รู้วิธีการ Rollback การ Deploy โดยใช้ helm แล้ว ซึ่งง่ายมากๆแค่ใช้คำสั่งคำสั่งเดียว และสำหรับตอนนี้ถือเป็นตอนสุดท้ายของ Basic Kubernetes ซึ่งผมก็หวังว่าทั้ง 10 ตอนที่ได้เขียนไปจะมีประโยชน์กับผู้อ่านได้นำไปใช้ในการทำงาน แล้วเจอกันใหม่ในเรื่องหน้าสวัสดีครับ