เรียนๆ จดๆ Helm #02: ENV / More in Command

มีความเอ๊ะ แล้วจะจำได้ดีขึ้น เมื่อเราอยากรู้ อยากเห็น ทำให้สมองตื่นตัว เราจะจำได้ดีขึ้น ลงมือทำ ที่จดจากการเรียนรอบ 2 มีตามนี้

คำพวกนี้มาจากไหน

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 ที่สอนกันบ้าง

  1. search google หรือ https://artifacthub.io/
  2. ลองดูแนวคิดของคนที่ทำ Chart ขึ้นมา (Intention) >> ความเป็นจริงไม่อ่าน เจอ Tools แล้วข้ามไป 555
  3. ลองเล่น Chart ในเคสต่าง install / upgrade / rollback / uninstall ลองให้ครบ lifecycle จะได้พบปัญหาที่เกิดขึ้น ก่อนใช้จริง >> ความเป็นจริง ผม Install ตัดแปะตาม Blog ที่สอน แล้วตัดจบเลย
  4. พวกค่าที่แก้ไข value.yaml ที่เรากำหนดให้ต่างตาม Site / ENV ให้จัดเก็บด้วย ภาพที่เข้าใจตอนฟัง
    - value_dev.yaml
    - value_qa.yaml
    - value_prod_AAA.yaml
    - value_prod_BBB.yaml
  5. จัดทำเอกสาร อาจจะอิงตาม Template ของตัว Architectural Decision Record (ADR) ก็ดีจะได้มีประวัติศาสตร์ให้คนรุ่นหลังใช้งาน ว่าทำไมถึงเลือก Helm อันนี้ บางทีตัว Tools เดียวกัน มีคนทำ Helm หลายเจ้า แต่ละเจ้ามีแนวคิดการทำต่างกันออกไป
  6. ติดตามข้อมูลใหม่ Feed อย่างตัว https://artifacthub.io/ จะมีเปิดให้ subscription ผ่านตัว RSS Feed ได้ น่าจะอารมณ์แบบยิง jenkins atom เข้า Grafrana แต่สวนใหญ่ตามจาก social 55 ขยับเพราะ CVE

แนวคิดของคนที่ทำ Chart มีหลายตัวที่จะบอกว่าทำแบบนี้เค้าไม่ได้ออกแบบนะ

ถ้า 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 ก่อนหน้าได้ครับ ตอนนี้เขียนเสริมจากที่ได้เรียนมาครับ

ไฟล์ diagram ภาพเต็มๆ HelmVisualizeV2l.webp (5000×2225) (debuggingsoft.com)
- 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 ของท่านอื่นๆ

ปล ภาพ Cover จะเอาอันนี้ 122115706 (1280×720) (dek-d.com) แต่ไม่แน่ใจว่าติดลิขสิทธ์ไหม เลยให้ AI GEN เอา


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.