Helm
Helm คือ package manager สำหรับ Kubernetes ช่วยรวม Kubernetes manifests ที่เกี่ยวข้องเป็น Chart และติดตั้งเป็น Release ได้ รองรับการกำหนดค่าแยกตาม environment, upgrade และ rollback application ได้ง่ายขึ้น
จุดเด่นของ Helm
Section titled “จุดเด่นของ Helm”- Chart — แพ็กเกจที่รวม templates, ค่าเริ่มต้น และ metadata ของ application
- Release — instance ของ Chart ที่ติดตั้งอยู่ใน Kubernetes cluster
- Values — ค่าที่ใช้ปรับแต่ง Chart โดยไม่ต้องแก้ template
- Upgrade และ rollback — เปลี่ยน version หรือย้อนกลับไป revision ก่อนหน้าได้
Chart คือ package ส่วน Release คือ instance ที่ถูกติดตั้งจริงใน cluster เดียวกันจึงติดตั้ง Chart เดิมหลายครั้งด้วยชื่อ Release ต่างกันได้
ติดตั้งและตรวจสอบ Helm
Section titled “ติดตั้งและตรวจสอบ Helm”# ตรวจสอบว่า Helm ติดตั้งแล้วและดู versionhelm version
# แสดง environment ที่ Helm ใช้งานhelm env
# แสดง repository ที่เพิ่มไว้ในเครื่องhelm repo listRepository
Section titled “Repository”Repository เป็นแหล่งเก็บ Chart ที่ใช้ค้นหาและติดตั้ง Chart จากภายนอก
# เพิ่ม Helm repositoryhelm repo add bitnami https://charts.bitnami.com/bitnami
# อัปเดต index ของทุก repositoryhelm repo update
# ค้นหา Chart ใน repository ที่เพิ่มไว้helm search repo nginx
# ค้นหา Chart จาก Artifact Hubhelm search hub nginx
# ลบ repository ที่ไม่ต้องการใช้helm repo remove bitnamiติดตั้ง Chart
Section titled “ติดตั้ง Chart”# ดูค่า default values ของ Charthelm show values bitnami/nginx
# ดู metadata และรายละเอียดของ Charthelm show chart bitnami/nginx
# ติดตั้ง Chart ด้วยชื่อ Release ที่กำหนดhelm install web bitnami/nginx --namespace demo --create-namespace
# ติดตั้งพร้อมกำหนดค่าแบบ inlinehelm install web bitnami/nginx \ --namespace demo \ --set service.type=ClusterIP
# ติดตั้งพร้อมอ่านค่าจากไฟล์ valueshelm install web bitnami/nginx \ --namespace demo \ --values values.yaml ใช้
--values กับไฟล์ที่เก็บใน Git และใช้ --set สำหรับค่าที่ต้อง override เฉพาะครั้งนั้น เช่น image tag หรือ replica count Release
Section titled “Release”# แสดง Release ใน namespace ปัจจุบันhelm list
# แสดง Release ในทุก namespacehelm list --all-namespaces
# แสดงรายละเอียดของ Release รวมถึง values ที่ใช้helm get all web --namespace demo
# แสดง manifest ที่ Helm ส่งเข้า Kuberneteshelm get manifest web --namespace demo
# แสดง history ของ Releasehelm history web --namespace demo
# ถอนการติดตั้ง Releasehelm uninstall web --namespace demoUpgrade และ Rollback
Section titled “Upgrade และ Rollback”# อัปเดต repository ก่อนเลือก Chart version ใหม่helm repo update
# Upgrade Release ด้วย values ไฟล์ใหม่helm upgrade web bitnami/nginx \ --namespace demo \ --values values.yaml
# ติดตั้งถ้ายังไม่มี Release หรือ upgrade ถ้ามีแล้วhelm upgrade --install web bitnami/nginx \ --namespace demo \ --create-namespace \ --values values.yaml
# ดู revision ที่เคย deployhelm history web --namespace demo
# rollback กลับไป revision ที่ระบุhelm rollback web 1 --namespace demo ก่อน rollback ให้ดู
helm history ก่อนเสมอ เพราะ revision อาจไม่ตรงกับ version ของ application หรือ image tag ที่ทีมคาดไว้ สร้าง Chart ใหม่
Section titled “สร้าง Chart ใหม่”# สร้างโครงสร้าง Chart มาตรฐานhelm create my-app
# แสดงไฟล์ใน Chart ที่สร้างขึ้นfind my-app -maxdepth 2 -type f
# ตรวจสอบ syntax และโครงสร้างของ Charthelm lint my-appโครงสร้างหลักของ Chart มีหน้าที่ดังนี้:
Chart.yaml— metadata เช่น ชื่อและ version ของ Chartvalues.yaml— ค่า default ที่ templates นำไปใช้templates/— Kubernetes manifests ที่เขียนด้วย Go templatetemplates/_helpers.tpl— named templates และ helper สำหรับใช้ซ้ำcharts/— dependency ของ Chart อื่นcrds/— CustomResourceDefinition ที่ต้องติดตั้งร่วมกับ Chart
Values และ Templates
Section titled “Values และ Templates”ตัวอย่าง values.yaml:
replicaCount: 2
image: repository: nginx tag: "1.27" pullPolicy: IfNotPresent
service: type: ClusterIP port: 80ตัวอย่างการอ่านค่าใน template:
spec: replicas: {{ .Values.replicaCount }} template: spec: containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }}# Render templates เป็น YAML โดยยังไม่ติดตั้งลง clusterhelm template web ./my-app
# Render โดยใช้ values filehelm template web ./my-app --values values.yaml
# Render และตรวจสอบผลลัพธ์ตาม namespace ที่ต้องการhelm template web ./my-app --namespace demo --values values.yaml
# แสดง diff ก่อน upgrade (ต้องติดตั้ง helm-diff plugin)helm diff upgrade web ./my-app --namespace demo --values values.yaml ใช้
helm template ตรวจ YAML ที่ render แล้วก่อน deploy จริง จะช่วยเจอปัญหา indentation, value path และ resource name ได้เร็ว ตรวจสอบและ Debug
Section titled “ตรวจสอบและ Debug”# ตรวจสอบ Chart และ dependencyhelm lint ./my-app
# แสดง dependency ที่ประกาศไว้helm dependency list ./my-app
# ดาวน์โหลดและอัปเดต dependency ลงใน charts/helm dependency update ./my-app
# แสดง values ที่ Release ใช้งานอยู่helm get values web --namespace demo
# แสดง values ทั้งหมด รวม default valueshelm get values web --namespace demo --all
# ดูสถานะ Releasehelm status web --namespace demo
# แสดง resource ที่ Helm สร้างให้ Releasehelm get manifest web --namespace demoถ้า deploy แล้วพบปัญหา ให้ตรวจทั้ง output จาก Helm และ resource ใน Kubernetes:
# ตรวจสอบ Pod และ event ใน namespacekubectl get pods -n demokubectl get events -n demo --sort-by='.lastTimestamp'
# ดูรายละเอียด resource ที่มีปัญหาkubectl describe pod <pod-name> -n demo
# ดู logs ของ containerkubectl logs <pod-name> -n demoDependency
Section titled “Dependency”ประกาศ dependency ใน Chart.yaml แล้วให้ Helm จัดการ download:
dependencies: - name: postgresql version: 16.x.x repository: https://charts.bitnami.com/bitnami# ดาวน์โหลด dependency ตาม Chart.yamlhelm dependency update ./my-app
# ตรวจสอบว่า dependency ครบและ version ตรงกันhelm dependency build ./my-app