สำหรับ Helm Essential มี 4 ตอนนะครับ
คำพวกนี้มาจากไหน
PS C:\Users\Chatr> helm upgrade wp1 bitnami/wordpress --version 22.4.20 Release "wp1" has been upgraded. Happy Helming! NAME: wp1 LAST DEPLOYED: Thu Sep 12 19:28:14 2024 NAMESPACE: default STATUS: deployed REVISION: 3 TEST SUITE: None NOTES: CHART NAME: wordpress CHART VERSION: 22.4.20 APP VERSION: 6.5.5
ดูจากใน Note เลย https://github.com/bitnami/charts/blob/main/bitnami/wordpress/templates/NOTES.txt
เรื่องของ Helm Status
PS C:\Users\Chatr> helm history wp1 REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Thu Sep 12 19:21:51 2024 superseded wordpress-23.0.1 6.5.5 Install complete 2 Thu Sep 12 19:27:19 2024 superseded wordpress-23.1.10 6.6.1 Upgrade complete 3 Thu Sep 12 19:28:14 2024 deployed wordpress-22.4.20 6.5.5 Upgrade complete
อันนี้ลองไปดู doc และก็สงสัยเหมือนกันนะ ไม่แน่ใจว่าเอามาจาก Helm Status เจอคำว่า superseded
state of the release (can be: unknown, deployed, uninstalled, superseded, failed, uninstalling, pending-install, pending-upgrade or pending-rollback)
Ref: Helm | Helm Status
ลอง helm uninstall
อยากรุ้ว่าจะขึ้น uninstalling / uninstalled กับ WordPress ไม่ขึ้นนะ หรือมันเร็วมาก และ ไปไล่ดูที่ Secret สะอาดเลย ผมงงๆ ว่ามันโผล่มาตอนไหน หรือ ต้องไปกำหนด ใน Chart Hook ลอง helm ls --uninstalled
Note: Chart Hook - Step Rollback ต้องทำ Rollout Plan / Rollback Plan ด้วย .. to be continue
Force Set Image ได้ไหม ?
helm upgrade nginx bitnami/nginx --set image.tag=1.26.debian-12
ทำได้ เหมาะกับการทดสอบ เพราะถ้าทำแบบนี้ APP Version มันไม่ตรงกับ image จริง แต่ระบบมันเตือนนะ
How to use Helm
จดๆไปว่าที่เรียน กับที่ไปงูๆปลาๆ มาดู Step ที่สอนกันบ้าง
- search google หรือ https://artifacthub.io/
- ลองดูแนวคิดของคนที่ทำ Chart ขึ้นมา (Intention) >> ความเป็นจริงไม่อ่าน เจอ Tools แล้วข้ามไป 555
- ลองเล่น Chart ในเคสต่าง install / upgrade / rollback / uninstall ลองให้ครบ lifecycle จะได้พบปัญหาที่เกิดขึ้น ก่อนใช้จริง >> ความเป็นจริง ผม Install ตัดแปะตาม Blog ที่สอน แล้วตัดจบเลย
- พวกค่าที่แก้ไข value.yaml ที่เรากำหนดให้ต่างตาม Site / ENV ให้จัดเก็บด้วย ภาพที่เข้าใจตอนฟัง
- value_dev.yaml
- value_qa.yaml
- value_prod_AAA.yaml
- value_prod_BBB.yaml - จัดทำเอกสาร อาจจะอิงตาม Template ของตัว Architectural Decision Record (ADR) ก็ดีจะได้มีประวัติศาสตร์ให้คนรุ่นหลังใช้งาน ว่าทำไมถึงเลือก Helm อันนี้ บางทีตัว Tools เดียวกัน มีคนทำ Helm หลายเจ้า แต่ละเจ้ามีแนวคิดการทำต่างกันออกไป
- ติดตามข้อมูลใหม่ Feed อย่างตัว https://artifacthub.io/ จะมีเปิดให้ subscription ผ่านตัว RSS Feed ได้ น่าจะอารมณ์แบบยิง jenkins atom เข้า Grafrana แต่สวนใหญ่ตามจาก social 55 ขยับเพราะ CVE
แนวคิดของคนที่ทำ Chart มีหลายตัวที่จะบอกว่าทำแบบนี้เค้าไม่ได้ออกแบบนะ
- postgres ที่มาจาก binami ติด assign credential ลองไปอ่าน Blog ของคุณนครได้ครับ บันทึกการเรียนรู้ K3S และ Helm. Medium นี้ เป็นบันทึกการเรียนรู้ K3S… | by Nakorn Rientrakrunchai | T. T. Software Solution | Sep, 2024 | Medium
- อีกตัวผมลองหลังเขียน Blog ตอนแรก WordPress Blog นี้ใช้ WordPress นะ 12ปี ++ และ ลอง Helm และเอา Post แปะ พอลองขยับ เจอแบบที่คุณโจ้สอนเลย ขยับ Version มันฟ้อง WordPress Password เหมือนกัน
ถ้า Application เราเป็น Stateful หรือ ลำดับ ความสัมพันธ์ เช่น พวก DB ต้องมาคิดเรื่องพวกนี้ด้วย อย่างเคส WordPress คนทำก็ต้องใส่ Pass มาเองนะ เราไม่ Auto ให้หมดนะ
ถ้าจัดการ State Helm มีพวก Chart Hook มาช่วย มีเขียนบอกได้ ต้องจัดการ DB ลบทิ้ง เอา Data ออกมา แล้วใส่ใหม่หลังขยับ เป็นต้น
App เดียวกัน พวก Chart มีหลายเจ้านะ อย่าง bitnami ที่ครองโลกสมัย XAMMP (ไม่แน่ใจว่าใช้ยังใช้อยู่ไหมนะ เพิ่งเอาออกไป เป็น Container 55) และคนอื่นๆด้วย ตัว postgres มีเป็นร้อย หรือไม่ไปใช้ Tools อื้่นๆ อย่าง CloudNativePG - PostgreSQL Operator for Kubernetes (cloudnative-pg.io)
Helm Environment
มาตัวที่ทาง CLI จะใช้งานเก็บค่าตั้งต้นต่างๆ ก่อนจะ Apply ไปลง K8S เช่น
- HELM_REPOSITORY_CACHE - บอกตัวที่ทดของเราว่า ข้อมูล repo ต่างๆ เก็บข้อมูลที่ไหน ถ้าเทียบกับ Git Path Fetch / Pull ลงมาไว้
- HELM_REPOSITORY_CONFIG - บอกว่าเก็บของที่ไหน
- HELM_REGISTRY_CONFIG - บอกว่า HELM_REPOSITORY_CONFIG ใช้ Credential อะไร เผื่อเราทำ repo เอง น่าจะ คำสั่ง docker pattern เลย
helm registry login helm registry logout
- HELM_DEBUG - เผื่อพัง
- ที่เหลือลองไปดูจาก
helm env [flags]
ตัว ENV ที่มีดูจาก Helm: Environment variables | Helm
ถ้าหลัง Apply ไปแล้ว มันจะไปเก็บใน Secret ของ K8S แทน
Helm Command 02
สำหรับในส่วนแรกลองไปดู Blog ก่อนหน้าได้ครับ ตอนนี้เขียนเสริมจากที่ได้เรียนมาครับ
- Hub / Repo
- helm search repo <your_keyword> ตอน Search มันจะเก็บข้อมูลเป็น index ลงใน "HELM_REPOSITORY_CACHE"
- xxx-index.yaml
- xxx.tgz
อารมณ์เหมือนพวก copy maven / nuget config ให้เพื่อนเลย
- helm search hub <your_keyword>
- helm repo add
- hem repo update ด้วย ทำเสมอนะ เพราะอาจจะมี update definition ใหม่ ใน CI/CD ต้องใส่คำสั่งนี้ให้มันดึงของใหม่ หรือ Lock Version กันแตก ถ้ามันมีของใหม่ แล้วเราไม่ได้ Update มันจะมี Error แนวๆนี้
PS C:\Users\Chatr> helm install wp1 bitnami/wordpress --version 23.1.13 Error: INSTALLATION FAILED: chart "wordpress" matching 23.1.13 not found in bitnami index. (try 'helm repo update'): no chart version found for wordpress-23.1.13
- helm repo rm <repo_name> ปลอดภัยกว่าการเข้าไปลบใน repository cache พวก tgz มันยังไม่ลบนะ
- Install
- helm install ลองเพิ่มหน่อย รอบที่แล้วลืม ใส่ชื่อซ้ำ มันด่าตามระเบียบ
PS C:\Users\Chatr> helm install wp1 bitnami/wordpress Error: INSTALLATION FAILED: cannot re-use a name that is still in use
helm install <release_name> <path_to_chart> -f [your_value.yaml] --dependency update
-f บอกว่าเอาค่า config จากไหนมาทับ
--dependency check สำหรับ helm ซ้อน helm (sub chart) มี helm อื่นมาเป็นส่วนประกอบ บอกใหัมันตรวจ common และ update ด้วย
- Upgrade
helm update มันจะเอาไป tgz local ก่อนถ้ามี
helm upgrade <release_name> <path_to_chart>
helm upgrade <release_name> <path_to_chart> -f [your_value.yaml] --atomic
atomic ถ้า fail มันจะ rollback ตัวที่ fail ให้helm upgrade <release_name> <path_to_chart> -f [your_value.yaml] --cleanup-on-fail
ถ้ามันพัง แล้วมันจะได้ Clean พวกที่ทำไมสำเร็จด้วย เคสที่พังมาเช่น DB Migration แล้ว Script หาย
อันนี้ ลองมาจด Blog แล้วเอ๊ะ พวก --atomic / --cleanup-on-fail แบบเคส DB พัง เราต้องไปทำ Step ถอยไว้ก่อนด้วย หรือ ป่าว เช่น เตรียม backup ไว้ path x ถ้าไม่เตรียมน่าจะแตกไป
kubectl มี --dry-run=client แลัว Helm ?
สรุปว่ามีนะ
helm install nginx bitnami/nginx --dry-run=client
ถ้าลอง Run Output จะยาวหน่อย มัน print manifest ออกมาให้ อีกจุกดที่สังเกตุ status pending-install
ถ้าลอง Upgrade เหมือนกันนะ status pending-upgrade
แต่ rollback --dry-run=client ไม่มีนะ --dry-run เฉยๆ เข้าใใจว่าในบน server แล้ว แต่ output สั้นๆดี
PS C:\Users\Chatr> helm history nginx REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Sat Sep 14 21:24:22 2024 superseded nginx-16.0.5 1.25.5 Install complete 2 Sat Sep 14 21:29:11 2024 deployed nginx-17.0.0 1.26.0 Upgrade complete PS C:\Users\Chatr> helm rollback nginx 1 --dry-run=client Error: invalid argument "client" for "--dry-run" flag: strconv.ParseBool: parsing "client": invalid syntax PS C:\Users\Chatr> helm rollback nginx 1 --dry-run Rollback was a success! Happy Helming!
delete เหมือน rollback เลย ไม่มี = client
PS C:\Users\Chatr> helm uninstall nginx --dry-run release "nginx" uninstalled
ส่งการบ้าน ลอง Delete secret
- Case1: ลบบางอัน มันนับ max + 1
PS C:\Users\Chatr> helm ls NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION nginx default 3 2024-09-14 20:23:26.1672747 +0700 +07 deployed nginx-18.1.11 1.27.1 wp1 default 3 2024-09-12 19:28:14.2343184 +0700 +07 deployed wordpress-22.4.20 6.5.5 PS C:\Users\Chatr> kubectl get secret NAME TYPE DATA AGE nginx-tls kubernetes.io/tls 3 8d sh.helm.release.v1.nginx.v1 helm.sh/release.v1 1 3m22s sh.helm.release.v1.nginx.v2 helm.sh/release.v1 1 41s sh.helm.release.v1.nginx.v3 helm.sh/release.v1 1 12s sh.helm.release.v1.wp1.v1 helm.sh/release.v1 1 2d1h sh.helm.release.v1.wp1.v2 helm.sh/release.v1 1 2d sh.helm.release.v1.wp1.v3 helm.sh/release.v1 1 2d wp1-mariadb Opaque 2 2d1h wp1-wordpress Opaque 1 2d1h PS C:\Users\Chatr> kubectl delete secret sh.helm.release.v1.nginx.v3 secret "sh.helm.release.v1.nginx.v3" deleted PS C:\Users\Chatr> kubectl get secret NAME TYPE DATA AGE nginx-tls kubernetes.io/tls 3 8d sh.helm.release.v1.nginx.v1 helm.sh/release.v1 1 3m38s sh.helm.release.v1.nginx.v2 helm.sh/release.v1 1 57s PS C:\Users\Chatr> helm upgrade nginx bitnami/nginx Release "nginx" has been upgraded. Happy Helming! ... PS C:\Users\Chatr> kubectl get secret NAME TYPE DATA AGE nginx-tls kubernetes.io/tls 3 8d sh.helm.release.v1.nginx.v1 helm.sh/release.v1 1 3m51s sh.helm.release.v1.nginx.v2 helm.sh/release.v1 1 70s sh.helm.release.v1.nginx.v3 helm.sh/release.v1 1 5s
- Case2: ลบหมด Secret หาย แต่ของยังอยู่ครับ
PS C:\Users\Chatr> kubectl delete secret -l owner=helm,name=nginx secret "sh.helm.release.v1.nginx.v1" deleted secret "sh.helm.release.v1.nginx.v2" deleted secret "sh.helm.release.v1.nginx.v3" deleted PS C:\Users\Chatr> kubectl get pod NAME READY STATUS RESTARTS AGE nginx-789f58f69c-gkd45 1/1 Running 0 5m10s ..
ข้อสงสัยของผมเองแหละ
ผมเคยเจอเคสหยิบ Container ผิดเวอร์มาขึ้น (docker compose) แล้วมันไม่ match กับ DB
อันนี้ตัว Helm สามารถดักได้ไหมครับ ว่าถ้าขยับ V2.0.0 (Breaking Change ตัดการ Support DB เก่า และใหม่ )
ผ่านไปสัก 6-12 เดือน แล้วอยู่ๆ มีการถอยกลับ V1.8.0 อยากให้มันจะไม่ยอมครับ เตือนไว้ อันตรายนะ แบบนี้
- แนวทางแรก ถ้าอยากไม่ให้ Delete secret ทำให้ revision history หายไป
- แนวทางสอง chart hooks อันนี้ผมลองอ่านเพิ่มมา มัน State หลายๆอัน ผมลองวาดภาพจากการอ่านก่อนนะ และแน่นนอน
- ช่วง rollback ให้ เขียน Script ตรวจและ และเข้าไปดู Version ของ image ใน deployment ถ้ามันถอยไปจาก Ver ที่มัน breaking change ให้มันหยุดการทำงาน หรือจะดูจาก Chart Version
- อีกจุดที่คิดว่าควรเพิ่ม upgrade ทำแบบเดียวกัน เท่าที่ลอง upgrade แบบใช้ Version เก่า
ปล. อาจจะเขียนผิดก็ได้ 5555 ภาพประมาณนี้
Helm revision history มันใหญ่กว่าตัว revision history limit ใน deployment หรือป่าว ?
แปะไว้ก่อน มีเวลาลองไหม อีกเรื่อง 555
อื่นๆ
- OCI Registry As Storage | OCI Registry As Storage (oras.land) - เข้าใจว่าเป็นตัว CLI ที่มาเชื่อมกับ Registry ที่ทุกเจ้า ถ้าทำตาม Standard OCI //ตอนแรกฟังเป็น OLAF ของ Frozen
- DefectDojo - Tools สำหรับ Asset Management + Vulnerability Management ลองหาๆดูมันมีทั้ง
- https://defectdojo.com/community
- https://www.defectdojo.org/ (demo)
- https://github.com/DefectDojo/django-DefectDojo - Tools เก็บ Chart gitlab / gitlab / nexus / chartmusuem
- Colima - ตัว Container Runtime แบบ docker desktop windows ลงใน wsl ได้นะ เบากว่า docker desktop ลงได้ด้วย start k8s
colima start --kubernetes
แปะโป้งไว้ก่อน ตอนนี้ลองพวก Rancher Desktop - stateful > hl =headless service มันจะไปจัดการข้างหลังของ statefull แต่หลังๆ อาจจะเป็น deploymeny แทนพวก DB มันไปทาง Distribure DB มากขึ้น
- PodDisruptionBudget - บอก K8s ทำยังไง ก็ได้ ต้องเหลือ Pod กี่ตัว ห้ามตาย
Blog ของท่านอื่นๆ
- ทดลองเล่น K0S และศึกษา Helm (ครั้งที่ 2) | by Nakorn Rientrakrunchai | T. T. Software Solution | Sep, 2024 | Medium
- สรุป Helm essential course — day2 | by Supanut Laddayam | Sep, 2024 | Medium
ปล ภาพ Cover จะเอาอันนี้ 122115706 (1280×720) (dek-d.com) แต่ไม่แน่ใจว่าติดลิขสิทธ์ไหม เลยให้ AI GEN เอา
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.