- vừa được xem lúc

Sử dụng Helm Chart

0 0 15

Người đăng: Dương Anh Tuấn

Theo Viblo Asia

Cài đặt:

#https://helm.sh/docs/intro/install/ curl -k -O https://get.helm.sh/helm-canary-linux-amd64.tar.gz
tar -xvzf helm-canary-linux-amd64.tar.gz
cd linux-amd64/
mv helm /usr/bin/
chmod 755 /usr/bin/helm

#Bash Complete for helm

yum install bash-completion -y helm completion bash > /etc/bash_completion.d/helm
Thoát session ssh và vào lại hoặc

P1: Làm quen Helm Chart

# Add Repo
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add stable https://charts.helm.sh/stable --force-update
(Note: khi add repo, helm sẽ tạo file config tại ~/.config/helm/repositories.yaml)
helm repo list #(liệt kê repo)
helm repo update #(cập nhập repo)
helm search repo nginx #(search nginx từ các repo đã add)

1.1 Tải helm chart từ ArtifactHub

https://artifacthub.io/ chứa rất nhiều helm được chia sẻ từ cộng đồng.

helm pull bitnami/nginx
helm pull bitnami/nginx --untar

1.2 Run helm chart

- Chạy helm trực tiếp từ repo internet
# helm install first-chart1 bitnami/nginx -n tuanda --create-namespace
# helm ls -A - Chạy helm từ folder đã pull về
# helm pull bitnami/nginx --untar
# cd nginx
# helm template first-chart2 . --namespace=tuanda #(Kiểm tra helm)
# helm install first-chart2 . --namespace=tuanda --create-namespace #(install nginx bitnami)
# helm ls -A - Xóa helm chart
helm status first-chart2 -n tuanda
helm uninstall first-chart2 -n tuanda

1.3 Test Chart

Ta có 3 cách kiểm tra config helm đã đúng chưa:

cd nginx
helm template .
helm lint .
helm install nginx . --dry-run --debug

1.4 Show thông tin của chart trên ArtifactHub

helm show chart bitnami/nginx
helm show values bitnami/nginx

1.5 Liệt kê chart nào đang chạy

helm ls -n tuanda #(-n là namespace)
helm ls -A

P2: Tự tạo Helm Chart

2.1 Tạo self chart

# helm create nginx-test2 > Cấu trúc thư mục helm như sau:
├── charts
├── Chart.yaml
├── templates (chứa toàn bộ thông tin yaml để deploy k8s)
│ ├── deployment.yaml (Chứa deployment k8s)
│ ├── _helpers.tpl (chứa teamplate / include)
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml (chứ tham số để thay vào file yaml trong thư mục template) 

2.2 Upgrade Chart

Nếu Chart yaml có update (ví dụ thêm biến ở configmap, thay đổi image deployment), ta chạy như sau:

helm template nginx-test2 . --namespace=tuanda
helm install nginx-test2 . -n tuanda #Ta tăng số pod lên 5 và thử chạy upgrade
(vim values.yaml và sửa replicaCount: 5)
helm upgrade nginx-test2 . -n tuanda

2.3 Rollback Chart

$ helm history nginx-test2 -n tuanda
REVISION	UPDATED STATUS CHART APP VERSION	DESCRIPTION 1 Sat Oct 15 10:57:24 2022	superseded	nginx-test2-0.1.0	1.16.0 Install complete
2 Sat Oct 15 10:59:37 2022	deployed nginx-test2-0.1.0	1.16.0 Upgrade complete $ helm rollback nginx-test2 -n tuanda (về bản trước đó)
$ helm rollback nginx-test2 1 -n tuanda (về bản chỉ định)

P3: .Values / .Chart

Để chuẩn bị cho các bài test từ phần 3,4... trở đi, ta thực hiện xóa vài thư mục sau

helm create nginx-test3
cd nginx-test3
rm -rf templates/*
cat /dev/null > values.yaml # tạo 2 file MẪU
kubectl create configmap nginx-test3-cfg --from-literal=PORT=80 --dry-run=client -o yaml > templates/configmap.yaml
kubectl create deployment nginx-test3-dpl --image=nginx:alpine --replicas=2 --dry-run=client -o yaml > templates/deployment.yaml

VD1: Load tham số .Values từ values.yaml

B1: Chuẩn bị values.yaml

echo 'replicaCount: 5' > values.yaml

B2: Sửa deployment.yaml

vi templates/deployment.yaml
sửa replicas: 2
thành: replicas: {{ .Values.replicaCount }}

B3: Kết quả

Replicas đã được ghi đè từ 2 lên 5 khi chạy helm template (hoặc install/upgrade)

VD2: Load tham số .Chart từ Chart.yaml

B1: values.yaml

replicaCount: 2
image: repository: nginx:alpine

B2: Sửa deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata: creationTimestamp: null labels: app: {{ .Chart.Name }}-dpl name: {{ .Chart.Name }}-dpl
spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: {{ .Chart.Name }}-dpl strategy: {} template: metadata: creationTimestamp: null labels: app: {{ .Chart.Name }}-dpl spec: containers: - image: {{ .Values.image.repository }} name: {{ .Chart.Name }} resources: {}

B3: Kết quả

Ngoài ra, ta còn có một số Values, chart build-in có sẵn hay sử dụng:

Release.Name
Chart.Name
Chart.ApiVersion
...
URL: https://helm.sh/docs/chart_template_guide/builtin_objects/

P4: Function và Pipeline

Các Function helm ta có thể tìm ở đây: https://helm.sh/docs/chart_template_guide/function_list/#string-functions

VD1: Function

B1: Sửa file values.yaml và Chart.yaml

# vim values.yaml
replicaCount: 2
image: repository: nginx:alpine
-----------------
#vim Chart.yaml
apiVersion: v2
name: nginx-test3
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0" 

B2: Sửa deployment.yaml. Áp dụng function: upper, title, replace, camelcase...

apiVersion: apps/v1
kind: Deployment
metadata: creationTimestamp: null labels: app: {{ upper .Chart.Name }}-dpl name: {{ title .Chart.Name }}-dpl
spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: {{ replace "nginx" "test" .Chart.Name }}-dpl strategy: {} template: metadata: creationTimestamp: null labels: app: {{ camelcase .Chart.Name }}-dpl spec: containers: - image: {{ .Values.image.repository }} name: {{ .Chart.Name }} resources: {}

B3: Kết quả

VD2: Pipeline

Pipeline có kêt quả tương tự như function, ta có thể xem ví dụ dưới đây về upper, title, replace, camelcase...

apiVersion: apps/v1
kind: Deployment
metadata: creationTimestamp: null labels: app: {{ .Chart.Name | upper }}-dpl name: {{ .Chart.Name | title }}-dpl
spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: {{ .Chart.Name | replace "nginx" "test" }}-dpl strategy: {} template: metadata: creationTimestamp: null labels: app: {{ .Chart.Name | camelcase }}-dpl spec: containers: - image: {{ .Values.image.repository }} name: {{ .Chart.Name }} resources: {}

Kết quả:

Phần 5: IF

Chức năng: (1) so sánh, (2) Nếu exist sẽ in ra

VD1: Kiểm tra tồn tại bằng if

B1: File values.yaml

replicaCount: 5

B2: Sửa deployment.yaml

spec: {{- if .Values.replicaCount }} replicas: {{ .Values.replicaCount }} {{- end }}

B3: Kết quả

VD2: Các ví dụ so sánh về IF

{{- if and (eq $.Values.service.type "NodePort") .Values.nodePort }}
> nếu service.type là NodePort -VÀ- nodePort=8080 tồn tại thì thực hiện ... {{- if eq (include "paperless.trash.enabled" .) "true" }}
> nếu template paperless.trash.enabled được khai báo thì thực hiện ... {{- if or .Values.serverBlock .Values.existingServerBlockConfigmap }}
> nếu tồn tại 1 trong 2 value thì thực hiện ... {{- if or (eq .Values.service.type "LoadBalancer") (eq .Values.service.type "NodePort") }}
> nếu svc khai báo là "LoadBalancer hoặc NodePort" thì thực hiện ... {{- if and (or (eq .Values.service.type "NodePort") (eq .Values.service.type "LoadBalancer")) (not (empty .Values.service.nodePorts.http)) }} nodePort: {{ .Values.service.nodePorts.http }} {{- end }}

P6: With

Chức năng:

  • Dùng để rút gọn Chart.
  • Kiểm tra tồn tại nếu có thì insert., nếu ko có thì xóa (giống IF).
  • Dùng để load 1 list string vào trong Chart.

VD1: Rút gọn Chart

B1: File values.yaml

app: mobile: account: taikhoan password: matkhau db: max: 15 min: 5

B2: File configmap.yaml khi chưa sửa

apiVersion: v1
kind: ConfigMap
metadata: name: test
data: account: {{ .Values.app.mobile.acc }} password: {{ .Values.mobile.ui.pwd }} max: {{ .Values.app.db.max }} min: {{ .Values.app.db.min }}

B3: Sửa configmap.yaml rút gọn ".Values.app." đưa vào with

apiVersion: v1
kind: ConfigMap
metadata: name: test
data: {{- with .Values.app. }} account: {{ .mobile.account }} password: {{ .mobile.password }} max: {{ .db.max }} min: {{ .db.min }}

B4: Kết quả

VD2: kiểm tra tồn tại nếu có thì insert., nếu ko có thì xóa (giống IF)

B1: File values.yaml

pod: labels: app: test

B2: Sửa deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata: {{- with .Values.pod.labels }} labels: {{ toYaml . }} {{- end }} name: test
spec: replicas: 3 selector: matchLabels: app: test strategy: {} template: metadata: {{- with .Values.pod.labels }} labels: {{ toYaml . }} {{- end }} spec: containers: - image: nginx name: nginx 

B3: Kết quả

P7: Range (for i)

Range gần giống như with để load values ra, nhưng sử dụng cho array values. Ta có thể xem ví dụ sau

VD1: Range sử dụng để fill array list

B1: File values.yaml

configMapReload: #extraArgs: [] extraArgs: - --webhook-method HEAD - --webhook-retries 5

B2: Sửa deployment.yaml

 args: - --webhook-url=http://127.0.0.1:{{ .Values.ports.http.port }}/-/reload {{- range $i, $val := .Values.configMapReload.extraArgs }} - {{ $val }} {{- end }}

B3: Kết quả

 args: - --webhook-url=http://127.0.0.1:9090/-/reload - --webhook-method HEAD - --webhook-retries 5

VD2: Range with multi values

B1: File values.yaml

env: # -- Timezone for the container. - name: TZ value: UTC - name: VN value: GMT

B2: Sửa deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata: labels: app: test name: test
spec: replicas: 3 selector: matchLabels: app: test strategy: {} template: metadata: labels: app: test spec: containers: - image: nginx name: nginx env: {{- range $i, $val := .Values.env }} - name: {{ $val.name | quote }} value: {{ $val.value | quote }} {{- end }}

B3: Kết quả

VD3: Range without $val

B1: File values.yaml

configMapReload: extraConfigMapMounts: - name: alerts configMap: prometheus-alerts mountPath: /etc/alerts subPath: 'test'

B2: Sửa deployment.yaml

 {{- range .Values.configMapReload.extraConfigMapMounts }} - name: {{ .name }} configMap: name: {{ .configMap }} {{- end }}

B3: Kết quả

 - name: alerts configMap: name: prometheus-alerts

P8: Include/Template

helm create self-chart

B1: File _helper.tpl

{{- define "self-chart.labels" -}}
helm.sh/chart: {{ include "self-chart.chart" . }}
{{ include "self-chart.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}

B2: Trong deployment.yaml có gọi include

apiVersion: apps/v1
kind: Deployment
metadata: name: {{ include "self-chart.fullname" . }} labels: {{- include "self-chart.labels" . | nindent 4 }}
spec:

B3: Kết quả

apiVersion: apps/v1
kind: Deployment
metadata: name: release-name-nginx-test3 labels: helm.sh/chart: nginx-test3-0.1.0 app.kubernetes.io/name: nginx-test3 app.kubernetes.io/instance: release-name app.kubernetes.io/version: "1.16.0" app.kubernetes.io/managed-by: Helm
spec:

P9: Print function

B1: File values.yaml

configProperties: codeString: dynamic

B2: Sửa configmap.yaml

apiVersion: v1
kind: ConfigMap
data: TEST: {{ printf "static-%s" (.Values.configProperties.codeString) -}} 

B3: Kết quả

P10: Default

B1: File values.yaml

imageName: tomcat

B2: Sửa deployment.yaml

 spec: containers: - image: {{- default "nginx" .Values.imageName }} name: {{- default "nginx" .Values.imageName }} resources: {}

B3: Kết quả

P11: Đẩy Helm Chart lên ArtifactHub hoặc Local registry

(updating...)

Bài viết trong phạm vi kiến thức của người viết, có thể các bạn có idea hay hơn, xin hướng dẫn. Cảm ơn!

Bình luận

Bài viết tương tự

- vừa được xem lúc

GitOps Và Sử Dụng FluxCD: Xây dựng thư mục, cấu hình Helm charts và K8s

Lời mở đầu. .

0 0 8