2 min read

มาลองสร้าง Helm Chart กัน

มาลองสร้าง Helm Chart กัน

บทความนี้ เกิดจากผมได้โจทย์มาว่าต้อง upgrade version outline ที่ผมเนี่ยแหละลงมันไว้ให้ที่บริษัทได้ใช้กัน โดยผมได้ใช้เจ้า helm ในการลง outline ใน Kubernetes (ซึ่งบทความนี้ผมจะย่อเป็น K8s นะ) ซิ่งการใช้ helm มันง่ายมากๆ แค่ กำหนด value ต่างๆที่จำเป็นให้ แล้วส่ัง install ก็สามารถ service ทั้งหมดขึ้นมาใน K8s ได้แล้ว

แต่ๆ เนื่องจากผมไม่ได้ลงโดยใช้ Chart จากต้นทางทั้งหมด แต่ใช้วิธี Clone Chart มาแก้ config เอง เพื่อให้ deploy กับ K8s ของที่บ. ได้ พอแก้เสดแล้วก็ทำการใช้ helm install จาก local repository ปัญหาคือ เมื่อต้นทางมีการ update version ของ Chart นี้แล้ว ทางเราจะไม่สามารถ update ตามไปได้ ก็เลยต้องมา POC ดูก่อนเพื่อความแน่ใจว่าข้อมูลที่มีการบันทึกไว้แล้วจะไม่หาย 😄

ก่อนจะเริ่มขออธิบายสั้นๆกันก่อน ว่า Helm Chart คืออะไร

ถ้าอธิบายง่ายๆเลย Helm ก็คือ เครื่องมือที่ใช้สำหรับจัดการ configuration file ของ Kubernetes โดยเราสามารถสร้าง template ไว้เพื่อใช้สร้างซ้ำๆ โดยจัดการแค่ value บางค่าเท่านั้น ส่วน Chart คือชื่อเรียก repository ที่ใช้เก็บ template หรือ config files ต่างๆ รายละเอียดอื่นๆสามารถหาอ่านได้ที่ doc นะครับ ผมจะไม่ลงลึก

มาเริ่มกันเลย 🚀

เราต้องมี K8s ก่อน โดยผมจะใช้ minikube จำลอง k8s ขึ้นมาบน local เครื่องผมก่อน จากนั้นก็ลง helm โดยทั้ง 2 ตัวนี้ผมใช้

brew install helm minikube

เริ่มจากสร้าง chart repository กันก่อน

helm create my-example-chart

จะได้ประมาณนี้ ส่วนรายละเอียดแต่ละไฟล์ไปอ่านกันใน doc นะครับ

├── Chart.yaml
├── charts
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

และสิ่งที่ผมอยากได้ใน chart นี้ก็คือ phpmyadmin กับ mysql ที่สามารถเชื่อมต่อกันได้

เริ่มจากผมปรับ Chart.yaml

apiVersion: v2
name: my-example-chart
version: 0.0.1
description: my chart for test phpmyadmin connect to mysql
type: application

appVersion: "5.2.0"

dependencies:
  - name: mysql
    version: "9.19.1"
    repository: oci://registry-1.docker.io/bitnamicharts

maintainers:
- name: trwkc
  url: <https://github.com/trwkc>

ปรับค่าต่างๆประมาณนี้ครับ โดยมีส่วนของ dependencies เพิ่มมา เพราะ ผมจะใช้ chart จากที่อื่นเข้ามาใช้ ไม่ได้ config เองครับ

จากนั้นให้ run

helm dep build

helm จะทำการดึง dependency มาไว้ใน chart เรา charts/mysql-9.19.1.tgz และจะทำการสร้าง Chart.lock ขึ้นมาด้วย

จากนั้นมาสร้าง template กันครับ โดยผมจะสร้าง deployment และ service ตามนี้

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.name }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Values.name }}
  template:
    metadata:
        labels:
          app: {{ .Values.name }}
          release: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Values.name }}
          image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
          - containerPort: {{ .Values.service.port }}
          env:
            - name: PMA_HOST
              value: {{ .Release.Name }}-mysql
            - name: MYSQL_ROOT_PASSWORD
              value: {{ .Values.mysql.auth.rootPassword }}

deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: {{ .Values.name }}
  labels:
    app: {{ .Values.name }}
    release: {{ .Release.Name }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: {{ .Values.name }}

service.yaml

จากนั้นก็ไปสร้าง value โดยผมจะใช้ phpmyadmin version 5.2.0 ก่อน

# Default values for my-example-chart.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
name: my-example
replicaCount: 1

image:
  repository: phpmyadmin
  pullPolicy: IfNotPresent
  # Overrides the image tag whose default is the chart appVersion.
  tag: "5.2.0"

service:
  type: ClusterIP
  port: 80

mysql:
  auth:
    rootPassword: pass12345

values.yaml

เสร็จแล้ว มาลอง install กัน

helm install --debug my-example
chart version 0.0.1 และ app version 5.2.0

forward port kubectl --namespace default port-forward service/my-example 8080:80 ลอง login (user: root, pass: pass12345) แล้วทำการ insert data ลงไปดู

หลังจากนั้น เราจะลองทำการเปลี่ยน version ของ image phpmyadmin ใน values.yaml ให้เป็น 5.2.1 และ ปรับ version ใน Chart.yaml เป็น 0.0.2 และ appVersion เป็น 5.2.1

จากนั้นทำการ upgrade โดยจะใช้ values จากครั้งก่อน นอกจาก image.tag ที่ต้องใส่ค่าไปใหม่ด้วย เพราะไม่งั้นมันจะเอาค่าเก่ามาใส่

helm upgrade --reuse-values --set image.tag=5.2.1 --debug my-example .

พอ upgrade เรียบร้อยแล้ว version ของ release จะเป็น version ใหม่ และจะได้ image version ใหม่ deploy ขึ้นไปด้วย จากนั้นเรามาลองเช็คข้อมูลกัน

chart version 0.0.2 และ app version 5.2.1
image version เปลี่ยนเป็น 5.2.1

เยี่ยมครับ ข้อมูลไม่หาย เอาไปใช้ upgrade ของจริงได้แล้ว 😆

ทิ้งท้าย เรา install และ upgrade ได้แล้ว จากนั้นเราจะ uninstall ทุก service ออกได้ง่ายๆโดย

helm uninstall my-example

เพียงเท่านี้ก็เรียบร้อยละครับ หวังว่าจะเป็นประโยชน์ไม่มากก็น้อยนะครับสำหรับ บทความนี้ถ้าเป็นประโยชน์ยังไงก็แชร์ได้นะครับ

Github: https://github.com/trwkc/my-example-chart
Docs: https://helm.sh/docs/topics/charts/