- Deploy ระบบบน Kubernetes ด้วย Helm
- 3. สิ่งที่ต้องเตรียม
- 4. ติดตั้ง Helm
- 5. สร้าง Helm Chart
- 6. สร้าง Chart.yaml
- 7. สร้าง values.yaml
- 8. สร้าง Deployment Template
- 9. สร้าง Service Template
- 10. เพิ่ม Ingress แบบ Optional
- 11. แยก Configuration ตาม Environment
- 12. ตรวจสอบ Chart ก่อน Deploy
- 13. Deploy ระบบครั้งแรก
- 14. รูปแบบที่แนะนำ: helm upgrade --install
- 15. รอให้ระบบ Ready และ Rollback เมื่อ Deploy ล้มเหลว
- 16. Upgrade Application
- 17. ตรวจสอบประวัติ Release
- 18. Rollback
- 19. ลบระบบ
- 20. การ Override Values
- 21. Secret ไม่ควรเก็บใน values.yaml แบบ Plain Text
- 22. ConfigMap ด้วย Helm
- 23. Health Check
- 24. Autoscaling
- 25. แนวทาง Versioning
- 26. Package Helm Chart
- 27. ใช้ OCI Registry
- 28. ใช้ Helm กับ CI/CD
- 29. ตัวอย่าง GitHub Actions
- 30. Helm กับ GitOps
- 31. Best Practices
- 1. ใช้ Chart เดียว หลาย Values
- 2. Run helm lint ทุกครั้ง
- 3. Render ก่อน Deploy
- 4. Pin Image Version
- 5. ใช้ Resource Requests / Limits
- 6. ใช้ Probes
- 7. แยก Secret ออกจาก Chart
- 8. ใช้ --wait และ --rollback-on-failure ใน Production
- 9. ใช้ quote / toYaml / nindent อย่างเหมาะสม
- 10. ตรวจสอบ Release History
- 32. คำสั่ง Helm ที่ใช้บ่อย
- 33. Workflow ที่แนะนำสำหรับ Production
- 34. Helm Deployment Architecture
- 35. สรุป
- References
#Deploy ระบบบน Kubernetes ด้วย Helm
เมื่อระบบเริ่มมี Kubernetes Manifest หลายไฟล์ เช่น Deployment, Service, ConfigMap, Secret, Ingress และทรัพยากรอื่น ๆ การจัดการไฟล์ YAML แบบแยกไฟล์สำหรับ Development, Staging และ Production จะเริ่มซับซ้อนอย่างรวดเร็ว
Helm ช่วยแก้ปัญหานี้โดยทำหน้าที่เป็น Package Manager สำหรับ Kubernetes เราสามารถรวม Kubernetes Manifest ที่เกี่ยวข้องเข้าด้วยกันเป็นแพ็กเกจที่เรียกว่า Chart จากนั้นใช้ values.yaml เพื่อกำหนดค่าที่แตกต่างกันในแต่ละ Environment และจัดการวงจรชีวิตของระบบด้วยคำสั่ง เช่น install, upgrade, rollback และ uninstall
บทความนี้อ้างอิงแนวทางของ Helm 4 โดยตัวอย่างหลักยังใช้ Chart API
v2ซึ่งใช้งานได้ทั่วไปและเหมาะสำหรับ Production ในปัจจุบัน
#1. Helm คืออะไร
ถ้า Kubernetes เปรียบเสมือนระบบปฏิบัติการสำหรับ Container แล้ว Helm ก็มีบทบาทใกล้เคียงกับ apt, dnf, Homebrew หรือ package manager ของระบบปฏิบัติการ
Helm ช่วยให้เราสามารถ:
- Package Kubernetes resources เป็น Chart
- Deploy แอปด้วยคำสั่งเดียว
- ใช้ Chart เดียวกันกับหลาย Environment
- Override configuration ผ่าน Values
- Upgrade ระบบโดยไม่ต้องแก้ Manifest ทีละไฟล์
- เก็บประวัติแต่ละ Release
- Rollback กลับไปยัง Revision ก่อนหน้า
- จัดการ Dependency ของระบบ
- ใช้ร่วมกับ CI/CD และ GitOps
แนวคิดหลักคือ
Kubernetes YAML
│
▼
Helm Templates
│
+── values.yaml
+── values-dev.yaml
+── values-prod.yaml
│
▼
Helm Release
│
▼
Kubernetes Cluster
#2. คำศัพท์สำคัญของ Helm
#Chart
แพ็กเกจที่รวม Template และ Configuration สำหรับสร้าง Kubernetes resources
ตัวอย่าง:
webapp/
├── Chart.yaml
├── values.yaml
├── values-dev.yaml
├── values-prod.yaml
└── templates/
├── deployment.yaml
├── service.yaml
└── ingress.yaml
#Release
Instance ของ Chart ที่ถูกติดตั้งลงใน Kubernetes
ตัวอย่าง:
helm install webapp-dev ./webapp
webapp-dev คือชื่อ Release
Chart เดียวสามารถติดตั้งได้หลาย Release เช่น
webapp-dev
webapp-staging
webapp-prod
#Values
ค่าที่ส่งเข้าไปใน Template
ตัวอย่าง:
replicaCount: 2
image:
repository: ghcr.io/example/webapp
tag: "1.0.0"
แล้วนำไปใช้ใน Template:
replicas: {{ .Values.replicaCount }}
#Repository / OCI Registry
สถานที่จัดเก็บ Helm Chart
ปัจจุบันสามารถเก็บ Chart ใน OCI Registry ได้ เช่น
ghcr.io
Azure Container Registry
Amazon ECR
Google Artifact Registry
Harbor
#3. สิ่งที่ต้องเตรียม
ก่อนใช้งาน Helm ควรมี
- Kubernetes Cluster
kubectl- Helm CLI
- Container Image ของ Application
- สิทธิ์ในการ Deploy resource ลง Cluster
ตรวจสอบ Kubernetes:
kubectl cluster-info
ตรวจสอบ Helm:
helm version
#4. ติดตั้ง Helm
#macOS
brew install helm
#Windows ด้วย Chocolatey
choco install kubernetes-helm
#Windows ด้วย Scoop
scoop install helm
#Linux
บน Distribution ที่รองรับ package manager สามารถติดตั้งผ่าน package manager ได้ หรือดาวน์โหลด binary จาก Helm Release โดยตรง
ตรวจสอบหลังติดตั้ง:
helm version
#5. สร้าง Helm Chart
สร้าง Chart ใหม่:
helm create webapp
Helm จะสร้างโครงสร้างเริ่มต้นให้
webapp/
├── Chart.yaml
├── charts/
├── templates/
├── values.yaml
└── ...
สำหรับการเรียนรู้ เราสามารถลด Chart ให้เหลือไฟล์สำคัญดังนี้
webapp/
├── Chart.yaml
├── values.yaml
├── values-dev.yaml
├── values-prod.yaml
└── templates/
├── deployment.yaml
├── service.yaml
└── ingress.yaml
#6. สร้าง Chart.yaml
ไฟล์ Chart.yaml
apiVersion: v2
name: webapp
description: Helm chart for web application
type: application
version: 0.1.0
appVersion: "1.0.0"
ความหมาย:
| Field | ความหมาย |
|---|---|
apiVersion |
API ของ Helm Chart |
name |
ชื่อ Chart |
description |
รายละเอียด |
type |
ประเภท Chart |
version |
Version ของ Chart |
appVersion |
Version ของ Application |
ควรแยกความหมายของ version กับ appVersion
Chart version = Version ของ deployment package
App version = Version ของ application
#7. สร้าง values.yaml
ไฟล์ values.yaml ทำหน้าที่เป็นค่า Default ของ Chart
replicaCount: 2
image:
repository: nginx
tag: "1.27-alpine"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
containerPort: 80
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
ingress:
enabled: false
className: nginx
host: app.example.com
ข้อดีคือ Kubernetes Manifest ไม่ต้อง hard-code ค่าที่เปลี่ยนแปลงบ่อย
#8. สร้าง Deployment Template
สร้างไฟล์
templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}
labels:
app.kubernetes.io/name: {{ .Chart.Name | quote }}
app.kubernetes.io/instance: {{ .Release.Name | quote }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app.kubernetes.io/name: {{ .Chart.Name | quote }}
app.kubernetes.io/instance: {{ .Release.Name | quote }}
template:
metadata:
labels:
app.kubernetes.io/name: {{ .Chart.Name | quote }}
app.kubernetes.io/instance: {{ .Release.Name | quote }}
spec:
containers:
- name: {{ .Chart.Name | quote }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: {{ .Values.containerPort }}
protocol: TCP
resources:
{{- toYaml .Values.resources | nindent 12 }}
ตัวแปรสำคัญ:
.Values
.Chart
.Release
ตัวอย่าง:
{{ .Values.replicaCount }}
{{ .Chart.Name }}
{{ .Release.Name }}
#9. สร้าง Service Template
สร้าง
templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}
labels:
app.kubernetes.io/name: {{ .Chart.Name | quote }}
app.kubernetes.io/instance: {{ .Release.Name | quote }}
spec:
type: {{ .Values.service.type }}
selector:
app.kubernetes.io/name: {{ .Chart.Name | quote }}
app.kubernetes.io/instance: {{ .Release.Name | quote }}
ports:
- name: http
port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
#10. เพิ่ม Ingress แบบ Optional
สร้าง
templates/ingress.yaml
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ .Release.Name }}
spec:
ingressClassName: {{ .Values.ingress.className | quote }}
rules:
- host: {{ .Values.ingress.host | quote }}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: {{ .Release.Name }}
port:
number: {{ .Values.service.port }}
{{- end }}
เปิดใช้งานผ่าน Values:
ingress:
enabled: true
className: nginx
host: app.example.com
Kubernetes ระบุว่า Ingress API ยังคงใช้งานได้ แต่ API ถูก freeze แล้ว และแนะนำให้พิจารณา Gateway API สำหรับระบบใหม่ หาก Infrastructure ของ Cluster รองรับ
#11. แยก Configuration ตาม Environment
จุดแข็งของ Helm คือใช้ Template ชุดเดียว แต่ใช้ Values ต่างกัน
#Development
values-dev.yaml
replicaCount: 1
image:
repository: ghcr.io/example/webapp
tag: "dev"
resources:
requests:
cpu: 50m
memory: 64Mi
limits:
cpu: 200m
memory: 128Mi
ingress:
enabled: true
className: nginx
host: dev.example.com
#Production
values-prod.yaml
replicaCount: 3
image:
repository: ghcr.io/example/webapp
tag: "1.0.0"
resources:
requests:
cpu: 250m
memory: 256Mi
limits:
cpu: "1"
memory: 512Mi
ingress:
enabled: true
className: nginx
host: app.example.com
ดังนั้น Architecture จะเป็น
┌───────────────────┐
│ Helm Chart │
└─────────┬─────────┘
│
┌──────────────────┼──────────────────┐
│ │ │
▼ ▼ ▼
values-dev.yaml values-staging.yaml values-prod.yaml
│ │ │
▼ ▼ ▼
DEV Cluster STAGING Cluster PROD Cluster
#12. ตรวจสอบ Chart ก่อน Deploy
ก่อน Deploy จริงควรตรวจสอบ Chart อย่างน้อย 2 ขั้นตอน
#Helm Lint
helm lint ./webapp
ใช้ตรวจสอบโครงสร้าง Chart และข้อผิดพลาดพื้นฐาน
#Render Manifest
helm template webapp ./webapp
หากใช้ Development Values:
helm template webapp ./webapp \
-f ./webapp/values-dev.yaml
หรือ Render พร้อม Namespace:
helm template webapp ./webapp \
--namespace webapp-dev \
-f ./webapp/values-dev.yaml
ข้อดีคือเห็น Kubernetes YAML ที่ Helm สร้างขึ้นก่อนส่งไป Cluster
#13. Deploy ระบบครั้งแรก
Deploy Development:
helm install webapp-dev ./webapp \
--namespace webapp-dev \
--create-namespace \
-f ./webapp/values-dev.yaml
ตรวจสอบ Release:
helm list -n webapp-dev
ตรวจสอบ Kubernetes resources:
kubectl get all -n webapp-dev
ตรวจสอบ Pod:
kubectl get pods -n webapp-dev
ตรวจสอบ Service:
kubectl get svc -n webapp-dev
#14. รูปแบบที่แนะนำ: helm upgrade --install
ในการทำ CI/CD นิยมใช้คำสั่ง
helm upgrade --install webapp-dev ./webapp \
--namespace webapp-dev \
--create-namespace \
-f ./webapp/values-dev.yaml
ข้อดี:
- ถ้ายังไม่มี Release → Install
- ถ้ามี Release แล้ว → Upgrade
จึงเหมาะสำหรับ Pipeline เพราะใช้คำสั่งเดียวได้ทั้ง First Deployment และ Deployment รอบถัดไป
#15. รอให้ระบบ Ready และ Rollback เมื่อ Deploy ล้มเหลว
สำหรับ Helm 4 สามารถใช้
helm upgrade --install webapp-prod ./webapp \
--namespace webapp-prod \
--create-namespace \
-f ./webapp/values-prod.yaml \
--wait \
--rollback-on-failure \
--timeout 5m
ความหมาย:
--wait
รอจน resource พร้อมใช้งาน
--rollback-on-failure
rollback หาก upgrade ไม่สำเร็จ
--timeout 5m
กำหนดเวลารอสูงสุด
ใน Helm 4 ชื่อ flag ใหม่คือ
--rollback-on-failure
แทนชื่อเดิม
--atomic
โดย flag เดิมยังมีไว้เพื่อ compatibility แต่ถูก deprecate
#16. Upgrade Application
สมมติเปลี่ยน Image จาก
1.0.0
เป็น
1.1.0
สามารถสั่ง
helm upgrade webapp-prod ./webapp \
--namespace webapp-prod \
-f ./webapp/values-prod.yaml \
--set image.tag=1.1.0 \
--wait \
--rollback-on-failure
หรือแก้ไฟล์
image:
tag: "1.1.0"
แล้วรัน
helm upgrade webapp-prod ./webapp \
-n webapp-prod \
-f ./webapp/values-prod.yaml
#17. ตรวจสอบประวัติ Release
helm history webapp-prod -n webapp-prod
ตัวอย่างแนวคิด:
REVISION STATUS CHART APP VERSION
1 superseded webapp-0.1.0 1.0.0
2 deployed webapp-0.2.0 1.1.0
ดูสถานะ:
helm status webapp-prod -n webapp-prod
ดู Values ที่ Release ใช้งาน:
helm get values webapp-prod -n webapp-prod
ดู Manifest ที่ถูก Deploy:
helm get manifest webapp-prod -n webapp-prod
#18. Rollback
ถ้า Version ใหม่มีปัญหา
helm rollback webapp-prod 1 \
-n webapp-prod
ตรวจสอบ:
helm history webapp-prod -n webapp-prod
จุดสำคัญคือ Helm จะเก็บ Revision history ของ Release ทำให้การ rollback ทำได้สะดวกกว่าการแก้ Manifest ด้วยมือ
#19. ลบระบบ
helm uninstall webapp-dev \
-n webapp-dev
ถ้าต้องการลบ Namespace:
kubectl delete namespace webapp-dev
#20. การ Override Values
Helm รองรับหลายวิธี
#ใช้ values file
helm upgrade --install webapp ./webapp \
-f values-prod.yaml
#ใช้ --set
helm upgrade --install webapp ./webapp \
--set replicaCount=4
#ใช้หลาย Values files
helm upgrade --install webapp ./webapp \
-f values.yaml \
-f values-prod.yaml \
-f secrets-prod.yaml
ไฟล์ด้านขวาจะมี priority สูงกว่าเมื่อ key ซ้ำกัน
แนวคิด:
values.yaml
↓ override
values-prod.yaml
↓ override
--set
#21. Secret ไม่ควรเก็บใน values.yaml แบบ Plain Text
หลีกเลี่ยง
database:
password: super-secret-password
โดยเฉพาะเมื่อไฟล์ถูก commit เข้า Git
ทางเลือกที่เหมาะกว่า เช่น
- Kubernetes Secret
- External Secrets Operator
- HashiCorp Vault
- AWS Secrets Manager
- Azure Key Vault
- Google Secret Manager
- Sealed Secrets
- SOPS
ตัวอย่างอ้าง Secret จาก Deployment:
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: database-secret
key: password
#22. ConfigMap ด้วย Helm
Values:
config:
APP_ENV: production
LOG_LEVEL: info
สร้าง
templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-config
data:
APP_ENV: {{ .Values.config.APP_ENV | quote }}
LOG_LEVEL: {{ .Values.config.LOG_LEVEL | quote }}
นำไปใช้:
envFrom:
- configMapRef:
name: {{ .Release.Name }}-config
#23. Health Check
Production workload ควรมี readinessProbe และ livenessProbe
Values:
health:
path: /
port: 80
Deployment:
readinessProbe:
httpGet:
path: {{ .Values.health.path | quote }}
port: {{ .Values.health.port }}
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: {{ .Values.health.path | quote }}
port: {{ .Values.health.port }}
initialDelaySeconds: 15
periodSeconds: 20
ประโยชน์:
- Pod ที่ยังไม่ Ready จะไม่รับ Traffic
- Kubernetes ตรวจสอบ Process ที่ไม่ตอบสนองได้
helm --waitสามารถประเมิน readiness ของ resource ได้มีประสิทธิภาพขึ้น
#24. Autoscaling
สามารถสร้าง HorizontalPodAutoscaler เป็น Helm Template ได้
ตัวอย่าง Values:
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 70
แล้วใช้เงื่อนไข:
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
...
{{- end }}
ทำให้ DEV สามารถปิด Autoscaling แต่ Production เปิดได้ด้วย Chart ชุดเดียว
#25. แนวทาง Versioning
ควร Version ทั้ง Chart และ Application
ตัวอย่าง:
version: 0.4.0
appVersion: "2.1.3"
แนะนำใช้ Semantic Versioning
MAJOR.MINOR.PATCH
ตัวอย่าง:
1.0.0
1.1.0
1.1.1
2.0.0
และหลีกเลี่ยงการ Deploy Production ด้วย Image Tag เช่น
latest
dev
main
ควรใช้ immutable tag เช่น
1.4.2
git-a82d9cf
sha256 digest
#26. Package Helm Chart
สร้าง Package:
helm package ./webapp
จะได้ไฟล์ประมาณ:
webapp-0.1.0.tgz
ตรวจสอบ:
helm show chart webapp-0.1.0.tgz
#27. ใช้ OCI Registry
Login:
helm registry login ghcr.io
Push Chart:
helm push webapp-0.1.0.tgz \
oci://ghcr.io/example/charts
ติดตั้งจาก OCI:
helm install webapp \
oci://ghcr.io/example/charts/webapp \
--version 0.1.0
แนวทางนี้เหมาะเมื่อองค์กรมี Container Registry อยู่แล้วและต้องการเก็บ Container Image กับ Helm Chart ใน Infrastructure เดียวกัน
#28. ใช้ Helm กับ CI/CD
Workflow ทั่วไป:
Developer
│
▼
Git Push
│
▼
CI
├── Unit Test
├── Build Image
├── Security Scan
└── Push Image
│
▼
Helm Lint
│
▼
Helm Template
│
▼
Helm Upgrade --Install
│
▼
Kubernetes
│
▼
Health Check
ตัวอย่างขั้นตอน Deploy:
helm lint ./helm/webapp
helm template webapp ./helm/webapp \
-f ./helm/webapp/values-prod.yaml \
--set image.tag="${IMAGE_TAG}"
helm upgrade --install webapp ./helm/webapp \
--namespace webapp \
--create-namespace \
-f ./helm/webapp/values-prod.yaml \
--set image.tag="${IMAGE_TAG}" \
--wait \
--rollback-on-failure \
--timeout 5m
#29. ตัวอย่าง GitHub Actions
name: Deploy
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Helm
uses: azure/setup-helm@v4
- name: Helm lint
run: helm lint ./helm/webapp
- name: Render chart
run: |
helm template webapp ./helm/webapp \
-f ./helm/webapp/values-prod.yaml
- name: Deploy
run: |
helm upgrade --install webapp ./helm/webapp \
--namespace webapp \
--create-namespace \
-f ./helm/webapp/values-prod.yaml \
--wait \
--rollback-on-failure \
--timeout 5m
ในระบบจริง Kubernetes credentials ควรถูกจัดการด้วยวิธีที่ปลอดภัย เช่น
- OIDC
- Workload Identity
- Cloud IAM
- Short-lived credentials
หลีกเลี่ยงการเก็บ kubeconfig ระยะยาวเป็น Plain Text Secret หากมีวิธีที่ปลอดภัยกว่า
#30. Helm กับ GitOps
Helm สามารถใช้ร่วมกับ
- Argo CD
- Flux CD
Architecture:
Application Repo
│
▼
Build Image
│
▼
Container Registry
GitOps Repo
│
├── Helm Chart
└── Values
│
▼
Argo CD / Flux
│
▼
Kubernetes
ข้อแตกต่างหลักคือ
CI/CD แบบ Push:
Pipeline → Kubernetes
GitOps แบบ Pull:
Git → Argo CD / Flux → Kubernetes
สำหรับ Production ขนาดกลางถึงใหญ่ GitOps ช่วยให้ Desired State ของระบบตรวจสอบย้อนหลังและ Audit ได้ง่ายขึ้น
#31. Best Practices
#1. ใช้ Chart เดียว หลาย Values
ควรใช้:
Chart
├── values-dev.yaml
├── values-staging.yaml
└── values-prod.yaml
แทนการ copy Chart แยกหลายชุดโดยไม่จำเป็น
#2. Run helm lint ทุกครั้ง
helm lint ./webapp
#3. Render ก่อน Deploy
helm template ...
#4. Pin Image Version
ควรใช้:
tag: "1.4.2"
หลีกเลี่ยง:
tag: latest
#5. ใช้ Resource Requests / Limits
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
#6. ใช้ Probes
readinessProbe
livenessProbe
startupProbe
#7. แยก Secret ออกจาก Chart
Chart ควรอ้าง Secret มากกว่าฝังค่า Secret โดยตรง
#8. ใช้ --wait และ --rollback-on-failure ใน Production
--wait
--rollback-on-failure
--timeout 5m
#9. ใช้ quote / toYaml / nindent อย่างเหมาะสม
ค่าที่นำมาแทรกใน YAML ควร render อย่างปลอดภัย
ตัวอย่าง:
name: {{ .Values.name | quote }}
และ Map/List:
{{- toYaml .Values.resources | nindent 12 }}
#10. ตรวจสอบ Release History
helm history RELEASE -n NAMESPACE
#32. คำสั่ง Helm ที่ใช้บ่อย
| Command | ใช้งาน |
|---|---|
helm create |
สร้าง Chart |
helm lint |
ตรวจ Chart |
helm template |
Render Manifest |
helm install |
ติดตั้ง Release |
helm upgrade |
Upgrade Release |
helm upgrade --install |
Install หรือ Upgrade |
helm list |
ดู Release |
helm status |
ดูสถานะ |
helm history |
ดู Revision |
helm rollback |
Rollback |
helm get values |
ดู Values |
helm get manifest |
ดู Manifest |
helm package |
Package Chart |
helm push |
Push Chart |
helm uninstall |
ถอน Release |
#33. Workflow ที่แนะนำสำหรับ Production
1. Developer Push Code
↓
2. Run Tests
↓
3. Build Container Image
↓
4. Scan Image
↓
5. Push Image ไป Registry
↓
6. helm lint
↓
7. helm template
↓
8. Deploy ด้วย helm upgrade --install
↓
9. --wait
↓
10. Health Check / Smoke Test
↓
11. Success
│
└── หาก Failure → Rollback
คำสั่ง Deploy:
helm upgrade --install webapp ./helm/webapp \
-n production \
--create-namespace \
-f ./helm/webapp/values-prod.yaml \
--set image.tag="${IMAGE_TAG}" \
--wait \
--rollback-on-failure \
--timeout 5m
#34. Helm Deployment Architecture
Git Repository
│
▼
Application Source
│
▼
CI Pipeline
┌────────┴────────┐
▼ ▼
Build Image Helm Lint
│ │
▼ ▼
Container Registry Helm Template
│ │
└────────┬────────┘
▼
helm upgrade --install
│
▼
Kubernetes API
│
┌───────────────┼──────────────┐
▼ ▼ ▼
Deployment Service Ingress/Gateway
│
▼
Pods
#35. สรุป
Helm ช่วยยกระดับการ Deploy Kubernetes จากการจัดการ YAML แบบ Manual ไปสู่ระบบ Packaging และ Release Management ที่เป็นระบบมากขึ้น
แก่นสำคัญของ Helm คือ:
Chart
+
Templates
+
Values
=
Release
ถ้าต้อง Deploy ระบบจริง แนวทางที่แนะนำคือ
helm lint
จากนั้น
helm template
และ Deploy ด้วย
helm upgrade --install
พร้อม
--wait
--rollback-on-failure
เมื่อใช้งานร่วมกับ CI/CD, OCI Registry และ GitOps เช่น Argo CD หรือ Flux จะทำให้การ Deploy ระบบ Kubernetes มีความสามารถด้าน Versioning, Reproducibility, Auditability และ Rollback ที่ดีขึ้นอย่างมาก
#References
- Helm Documentation: https://helm.sh/docs/
- Helm Introduction: https://helm.sh/docs/intro/introduction/
- Helm Quickstart: https://helm.sh/docs/intro/quickstart/
- Helm Charts: https://helm.sh/docs/topics/charts/
- Helm Upgrade: https://helm.sh/docs/helm/helm_upgrade/
- Kubernetes Ingress: https://kubernetes.io/docs/concepts/services-networking/ingress/