10 minute read

kubernetes 中 類似docker compose的工具

抽象物件跟 container類似, 可以理解成cluster的image & container

資源名稱對照,

名詞 對照
chart image
release container

實際佈署時會將 values.yaml 與 template/*.yaml 的config 進行變數替換, 產生最終的k8s yaml檔案

目錄結構

── demo_chart
   ├── charts    # 子chart, 本project 依賴chart
   ├── Chart.yaml  # Chart metadata, name,version,description ...
   ├── templates   # 模板文件目錄
   │   ├── deployment.yaml
   │   ├── _helpers.tpl
   │   ├── hpa.yaml
   │   ├── ingress.yaml
   │   ├── NOTES.txt  # 提示訊息文件
   │   ├── serviceaccount.yaml
   │   ├── service.yaml
   │   └── tests  # 測試文件目錄
   │       └── test-connection.yaml
   └── values.yaml    # 變數目錄  

Variable

變數格式
.<Object>.<Field0>.<Field1>

apiVersion: v1
kind: ConfigMap
metadata:
  name: "mychart-"
data:
  Hello: "World "
kubectl get configmap
#NAME               DATA   AGE
#kube-root-ca.crt   1      3d19h
#mychart-mychart    2      92s

kubectl describe cm mychart-mychart
#Name:         mychart-mychart
#Namespace:    default
#Labels:       app.kubernetes.io/managed-by=Helm
#Annotations:  meta.helm.sh/release-name: mychart
#              meta.helm.sh/release-namespace: default
#
#Data
#====
#Hello:
#----
#World demo
#v1:
#----
#default false 1 Helm
#
#BinaryData
#====
#
#Events:  <none>

chart install

  • 直接從官方 install release
  • 直接下載chart壓縮包 install
  • 直接下載chart包 ,解壓成目錄, install
  • 直接從網路chart壓縮包 install

Object

以下是以Markdown格式列出的Helm中各个对象及其字段的表格,每个对象分开列出:

Values

chart中的values.yaml文件中的field

Release

字段 描述
Release.Name release name
Release.Namespace release namespace
Release.IsUpgrade 當前release 若是rollback or upgrade, return true
Release.Revision 初始值1, rollback 與 upgrade , 數值+1
Release.Service template中 Service name

Chart

chart中的Chart.yaml文件中的field

Capabilities

查看版本, 以及是否支援特定API

字段 描述
Capabilities.APIVersions 一個包含集群中可用的API版本的字符串列表。可以用來檢查集群是否支持某個特定的Kubernetes API版本。
Capabilities.APIVersions.Has "apps/v1" 如果集群 apps/v1這個API版本 是否可用
Capabilities.KubeVersion 一個對象,其中包含有關集群Kubernetes版本的詳細信息。
Capabilities.KubeVersion.Major Kubernetes主版本號。
Capabilities.KubeVersion.Minor Kubernetes次版本號。
Capabilities.KubeVersion.Version Kubernetes的完整版本字符串。

Template

字段 描述
Template.Name 當前模板文件的路徑 e.g. demo_chart/templates/mytemplate.yaml
Template.BasePath 模板文件的基礎路徑 e.g. demo_chart/templates/

repo Command

command description
helm repo add 新增repo
helm repo list 列出所有repo
helm repo update 更新repo
helm search repo 查詢repo
helm repo remove 刪除repo

add repo

helm repo add <repo_name> <repo_url>
# 新增 repo
helm repo add bitnami https://charts.bitnami.com/bitnami
# "bitnami" has been added to your repositories

list repo

helm repo list
helm repo list
#NAME    URL                               
#bitnami https://charts.bitnami.com/bitnami

update repo

helm repo update
helm repo update
#Hang tight while we grab the latest from your chart repositories...
#...Successfully got an update from the "bitnami" chart repository
#Update Complete. ⎈Happy Helming!⎈

search repo

helm search
helm search repo nginx
#NAME                                    CHART VERSION   APP VERSION     DESCRIPTION
#bitnami/nginx                           18.0.1          1.27.0          NGINX Open Source is a web server that can be a...
#bitnami/nginx-ingress-controller        11.3.5          1.10.1          NGINX Ingress Controller is an Ingress controll...
#bitnami/nginx-intel                     2.1.15          0.4.9           DEPRECATED NGINX Open Source for Intel is a lig...

remove repo

helm repo remove <repo_name>
helm repo remove bitnami
# "bitnami" has been removed from your repositories

chart/release command

command description
helm pull 下載chart
helm create 創建chart template
helm install 安裝chart
helm list 列出release
helm uninstall 刪除release

pull chart

helm pull <repo_name>/<chart_name> --untar --version <version>
## 拉取chart ,類似 docker pull, 只是pull下來是一個目錄  
## --untar 解壓縮, chart 預設是壓縮檔
## --version 版本號

create chart

helm create <pj_name>
helm create demo_chart

demo configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-hello
data:
  Hello: "World"
├── charts
├── Chart.yaml
├── templates
│   └── configmap.yaml
└── values.yaml

create release from chart

helm install <release name> <chart path>
helm install mychart ./demo_chart
#NAME: mychart
#LAST DEPLOYED: Fri Jun  7 00:56:45 2024
#NAMESPACE: default
#STATUS: deployed
#REVISION: 1
#TEST SUITE: None

調適模式, 不實際執行

helm install mychart ./demo_chart --debug --dry-run

list release

upgrade release

helm upgrade <release name> <chart path>

helm upgrade <release name> <chart name> -f <value.yaml path>

helm upgrade <release name> <chart nane> set <key>=<value>
# key value 為 values.yaml 中的key value

參數說明

helm list
#NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
#mychart default         1               2024-06-07 00:56:45.406359762 +0800 CST deployed        demo_chart-0.1.0        1.16.0 

# release name = mychart
# chart name = demo_chart

方案1

vim values.yaml

Hello: "demo2"
helm upgrade mychart  ./demo_chart/
#Release "mychart" has been upgraded. Happy Helming!
#NAME: mychart
#LAST DEPLOYED: Mon Jun 10 21:27:13 2024
#NAMESPACE: default
#STATUS: deployed
#REVISION: 2
#TEST SUITE: None

方案2

Hello: "demo3"
helm upgrade mychart  demo_chart -f ./demo_chart/values.yaml
#Release "mychart" has been upgraded. Happy Helming!
#NAME: mychart
#LAST DEPLOYED: Mon Jun 10 21:38:38 2024
#NAMESPACE: default
#STATUS: deployed
#REVISION: 3
#TEST SUITE: None

方案3

helm upgrade mychart demo_chart --set Hello=demo4
#Release "mychart" has been upgraded. Happy Helming!
#NAME: mychart
#LAST DEPLOYED: Mon Jun 10 21:40:26 2024
#NAMESPACE: default
#STATUS: deployed
#REVISION: 4
#TEST SUITE: None

history

helm history <release name>
helm history mychart
#REVISION        UPDATED                         STATUS          CHART                   APP VERSION     DESCRIPTION     
#1               Mon Jun 10 21:14:30 2024        superseded      demo_chart-0.1.0        1.16.0          Install complete
#2               Mon Jun 10 21:27:13 2024        superseded      demo_chart-0.1.0        1.16.0          Upgrade complete
#3               Mon Jun 10 21:38:38 2024        superseded      demo_chart-0.1.0        1.16.0          Upgrade complete
#4               Mon Jun 10 21:40:26 2024        deployed        demo_chart-0.1.0        1.16.0          Upgrade complete

get release info

從release中取得config資訊

command description
all 取得所有資訊
hooks 取得hook資訊
manifest 取得helm install後, template與values 結合創建資源的yaml
notes 取得templates/NOTES.txt 資訊
values 取得values資訊
helm get <command> <release name>
helm get manifest mychart
# Source: demo_chart/templates/configmap.yaml
#apiVersion: v1
#kind: ConfigMap
#metadata:
#  name: "mychart-mychart"
#data:
#  Hello: "World demo4"
#  v1: "default true 4 Helm

helm get values mychart
#USER-SUPPLIED VALUES:
#Hello: demo4

helm get all mychart
#NAME: mychart
#LAST DEPLOYED: Mon Jun 10 21:40:26 2024
#NAMESPACE: default
#STATUS: deployed
#REVISION: 4
#CHART: demo_chart
#VERSION: 0.1.0
#APP_VERSION: 1.16.0
#TEST SUITE: None
#USER-SUPPLIED VALUES:
#Hello: demo4
#
#COMPUTED VALUES:
#Hello: demo4
#
#HOOKS:
#MANIFEST:
#---
## Source: demo_chart/templates/configmap.yaml
#apiVersion: v1
#kind: ConfigMap
#metadata:
#  name: "mychart-mychart"
#data:
#  Hello: "World demo4"
#  v1: "default true 4 Helm

rollback

helm rollback <release name> <revision number>
helm history mychart
#REVISION        UPDATED                         STATUS          CHART                   APP VERSION     DESCRIPTION     
#1               Mon Jun 10 21:14:30 2024        superseded      demo_chart-0.1.0        1.16.0          Install complete
#2               Mon Jun 10 21:27:13 2024        superseded      demo_chart-0.1.0        1.16.0          Upgrade complete
#3               Mon Jun 10 21:38:38 2024        superseded      demo_chart-0.1.0        1.16.0          Upgrade complete
#4               Mon Jun 10 21:40:26 2024        deployed        demo_chart-0.1.0        1.16.0          Upgrade complete

helm get values mychart
#USER-SUPPLIED VALUES:
#Hello: demo4

helm rollback mychart 1
#Rollback was a success! Happy Helming!

helm get all mychart
#NAME: mychart
#LAST DEPLOYED: Mon Jun 10 22:08:35 2024
#NAMESPACE: default
#STATUS: deployed
#REVISION: 8
#CHART: demo_chart
#VERSION: 0.1.0
#APP_VERSION: 1.16.0
#TEST SUITE: None
#USER-SUPPLIED VALUES:
#null
#
#COMPUTED VALUES:
#Hello: demo
#
#HOOKS:
#MANIFEST:
#---
## Source: demo_chart/templates/configmap.yaml
#apiVersion: v1
#kind: ConfigMap
#metadata:
#  name: "mychart-mychart"
#data:
#  Hello: "World demo"
#  v1: "default false 1 Helm"


list template yaml config

helm get manifest <release name>
helm get manifest mychart
## Source: demo_chart/templates/configmap.yaml
#apiVersion: v1
#kind: ConfigMap
#metadata:
#  name: mychart-hello
#data:
#  Hello: "World"

remove release

helm unintall <release name>
helm unintall mychart
#release "mychart" uninstalled

debug / dryrun

可以輸出 value.yaml 與 templates/*.yaml 的結果 並install dry run, 確認是否正確

helm install demo demochart2 --debug --dry-run
#install.go:222: [debug] Original chart version: ""
#install.go:239: [debug] CHART PATH: /home/hccuse/Insync/y40103@gmail.com/Google Drive/hccuse/hccuse/learn/kind/helm/demochart2
#
#NAME: demo
#LAST DEPLOYED: Tue Jun 11 00:45:04 2024
#NAMESPACE: default
#STATUS: pending-install
#REVISION: 1
#TEST SUITE: None
#USER-SUPPLIED VALUES:
#{}
#
#COMPUTED VALUES:
#name: DeMo1
#
#HOOKS:
#MANIFEST:
#---
## Source: demochart2/templates/configmap.yaml
#apiVersion: v1
#kind: ConfigMap
#metadata:
#  name: demo-configmap
#data:
#  value1: "demo1"
#  value2: 'DEMO1'

helm function

可在template中使用helm function調用變數

function description
quote 將值加上雙引號
squote 將值加上單引號
lower 將值轉換為小寫
upper 將值轉換為大寫
repeat 重複值
helm create demochart
# 創建demo chart template 
# 並清除 templates/*.yaml  

quote / squote

單雙引號 values

templates/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: demo-configmap
data:
  value1: { { .Values.name | quote } }
  value2: { { .Values.name | squote } }

values.yaml

name: "DeMo1"
helm install demo demochart2 --debug --dry-run
#install.go:222: [debug] Original chart version: ""
#install.go:239: [debug] CHART PATH: /home/hccuse/Insync/y40103@gmail.com/Google Drive/hccuse/hccuse/learn/kind/helm/demochart2
#
#NAME: demo
#LAST DEPLOYED: Tue Jun 11 00:49:13 2024
#NAMESPACE: default
#STATUS: pending-install
#REVISION: 1
#TEST SUITE: None
#USER-SUPPLIED VALUES:
#{}
#
#COMPUTED VALUES:
#name: DeMo1
#
#HOOKS:
#MANIFEST:
#---
## Source: demochart2/templates/configmap.yaml
#apiVersion: v1
#kind: ConfigMap
#metadata:
#  name: demo-configmap
#data:
#  value1: "DeMo1" # 雙引號
#  value2: 'DeMo1' # 單引號

lower/upper

大小寫轉換

templates/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: demo-configmap
data:
  value1: { { .Values.name | lower | quote } }
  value2: { { .Values.name | upper |  squote } }

values.yaml

name: "DeMo1"
helm install demo demochart2 --debug --dry-run
# 套用模板, 但不實際安裝  

#install.go:222: [debug] Original chart version: ""
#install.go:239: [debug] CHART PATH: /home/hccuse/Insync/y40103@gmail.com/Google Drive/hccuse/hccuse/learn/kind/helm/demochart2
#
#NAME: demo
#LAST DEPLOYED: Tue Jun 11 00:45:04 2024
#NAMESPACE: default
#STATUS: pending-install
#REVISION: 1
#TEST SUITE: None
#USER-SUPPLIED VALUES:
#{}
#
#COMPUTED VALUES:
#name: DeMo1
#
#HOOKS:
#MANIFEST:
#---
## Source: demochart2/templates/configmap.yaml
#apiVersion: v1
#kind: ConfigMap
#metadata:
#  name: demo-configmap
#data:
#  value1: "demo1"  # 小寫
#  value2: 'DEMO1'  # 大寫

repeat

重複多次數值

templates/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: demo-configmap
data:
  value1: { { .Values.name | repeat 3 | quote } }
  value2: { { .Values.name | repeat 2 |  squote } }

values.yaml

name: "DeMo1"
helm install demo demochart2 --debug --dry-run
#install.go:222: [debug] Original chart version: ""
#install.go:239: [debug] CHART PATH: /home/hccuse/Insync/y40103@gmail.com/Google Drive/hccuse/hccuse/learn/kind/helm/demochart2
#
#NAME: demo
#LAST DEPLOYED: Tue Jun 11 00:52:53 2024
#NAMESPACE: default
#STATUS: pending-install
#REVISION: 1
#TEST SUITE: None
#USER-SUPPLIED VALUES:
#{}
#
#COMPUTED VALUES:
#name: DeMo1
#
#HOOKS:
#MANIFEST:
#---
## Source: demochart2/templates/configmap.yaml
#apiVersion: v1
#kind: ConfigMap
#metadata:
#  name: demo-configmap
#data:
#  value1: "DeMo1DeMo1DeMo1" # 重複3次
#  value2: 'DeMo1DeMo1'      # 重複2次

default

values.yaml 該數值不存在時, 使用預設值

templates/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: demo-configmap
data:
  value1: { { .Values.testdefault | default "foo" | quote } }
  value2: { { .Values.name | squote } }

values.yaml

name: "DeMo1"
helm install demo demochart2 --debug --dry-run
#install.go:222: [debug] Original chart version: ""
#install.go:239: [debug] CHART PATH: /home/hccuse/Insync/y40103@gmail.com/Google Drive/hccuse/hccuse/learn/kind/helm/demochart2
#
#NAME: demo
#LAST DEPLOYED: Tue Jun 11 00:58:45 2024
#NAMESPACE: default
#STATUS: pending-install
#REVISION: 1
#TEST SUITE: None
#USER-SUPPLIED VALUES:
#{}
#
#COMPUTED VALUES:
#name: DeMo1
#
#HOOKS:
#MANIFEST:
#---
## Source: demochart2/templates/configmap.yaml
#apiVersion: v1
#kind: ConfigMap
#metadata:
#  name: demo-configmap
#data:
#  value1: "foo"     # 自動帶入default 
#  value2: 'DeMo1'

lookup

類似kubectl get, 調用kubernetes的API ,

kubectl lookup
kubectl get pod -n kube-system lookup “v1” “Pod” “kube-system” “”
kubectl get configmap -n default lookup “v1” “Configmap” “default” “”
kubectl get pods -all-namespace lookup “v1” “Pod” “” “”
kubectl get namsepace look “v1” “Namesapce” “” “”

templates/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: demo-configmap
data:
  value1: { { lookup "v1" "Namespace" "" "" | quote } }
helm install demo demochart2
#kubectl get ns 
#NAME                 STATUS   AGE
#default              Active   7d19h
#kube-node-lease      Active   7d19h
#kube-public          Active   7d19h
#kube-system          Active   7d19h
#local-path-storage   Active   7d19h
#helm get manifest demo | grep "kube-public"
#  value1: "map[apiVersion:v1 items:[map[apiVersion:v1 kind:Namespace metadata:map[creationTimestamp:2024-06-02T21:58:35Z labels:map[kubernetes.io/metadata.name:default] managedFields:[map[apiVersion:v1 fieldsType:FieldsV1 fieldsV1:map[f:metadata:map[f:labels:map[.:map[] f:kubernetes.io/metadata.name:map[]]]] manager:kube-apiserver operation:Update time:2024-06-02T21:58:35Z]] name:default resourceVersion:37 uid:84ffb388-421e-43b1-b796-145ffb27202b] spec:map[finalizers:[kubernetes]] status:map[phase:Active]] map[apiVersion:v1 kind:Namespace metadata:map[creationTimestamp:2024-06-02T21:58:35Z labels:map[kubernetes.io/metadata.name:kube-node-lease] managedFields:[map[apiVersion:v1 fieldsType:FieldsV1 fieldsV1:map[f:metadata:map[f:labels:map[.:map[] f:kubernetes.io/metadata.name:map[]]]] manager:kube-apiserver operation:Update time:2024-06-02T21:58:35Z]] name:kube-node-lease resourceVersion:29 uid:f37665f3-cee5-4b87-a948-75b1ccbed592] spec:map[finalizers:[kubernetes]] status:map[phase:Active]] map[apiVersion:v1 kind:Namespace metadata:map[creationTimestamp:2024-06-02T21:58:35Z labels:map[kubernetes.io/metadata.name:kube-public] managedFields:[map[apiVersion:v1 fieldsType:FieldsV1 fieldsV1:map[f:metadata:map[f:labels:map[.:map[] f:kubernetes.io/metadata.name:map[]]]] manager:kube-apiserver operation:Update time:2024-06-02T21:58:35Z]] name:kube-public resourceVersion:19 uid:b4304859-7eb1-48e8-9f3a-e09b7ebb3633] spec:map[finalizers:[kubernetes]] status:map[phase:Active]] map[apiVersion:v1 kind:Namespace metadata:map[creationTimestamp:2024-06-02T21:58:35Z labels:map[kubernetes.io/metadata.name:kube-system] managedFields:[map[apiVersion:v1 fieldsType:FieldsV1 fieldsV1:map[f:metadata:map[f:labels:map[.:map[] f:kubernetes.io/metadata.name:map[]]]] manager:kube-apiserver operation:Update time:2024-06-02T21:58:35Z]] name:kube-system resourceVersion:11 uid:99e6bf67-7e5d-4756-90e2-f4201f6bc9df] spec:map[finalizers:[kubernetes]] status:map[phase:Active]] map[apiVersion:v1 kind:Namespace metadata:map[annotations:map[kubectl.kubernetes.io/last-applied-configuration:{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"local-path-storage\"}}\n] creationTimestamp:2024-06-02T21:58:39Z labels:map[kubernetes.io/metadata.name:local-path-storage] managedFields:[map[apiVersion:v1 fieldsType:FieldsV1 fieldsV1:map[f:metadata:map[f:annotations:map[.:map[] f:kubectl.kubernetes.io/last-applied-configuration:map[]] f:labels:map[.:map[] f:kubernetes.io/metadata.name:map[]]]] manager:kubectl-client-side-apply operation:Update time:2024-06-02T21:58:39Z]] name:local-path-storage resourceVersion:266 uid:a6f1942f-474b-4061-b8f1-0728576e52bd] spec:map[finalizers:[kubernetes]] status:map[phase:Active]]] kind:NamespaceList metadata:map[resourceVersion:1014521]]"

helm logic / flow control function

運算符 說明
eq 等於
ne 不等於
lt 小於
gt 大於
le 小於等於
ge 大於等於
and 且 , 兩者非空為真, bool
or 或, 輸入為三個數值, 前兩個若其中非空, 返回該非空, 否則返回第三個數值
not
empty 判斷是否為空 ,bool
default 預設
coalesce 輸入為列表, 返回該列表第一個非空數值
ternary 三元運算符
  • 非空: “”, 0, [], {}, false, null

templates/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: demo-configmap
data:
  value1:   # 1==1 
  value2:   # 1!=1
  value3:   # 1<1
  value4:   # 1>1
  value5:   # 1<=1
  value6:   # 1>=1
  value7:  # 1 and 1
  value8:  # "" or "" , 否則 "777"
  value9:   # "" or 2 , 否則 "777"
  value10:  # 1 or "" , 否則 "777"
  value11:  # "" 是否為空  
  value13:   # 不存在則使用預設值
  value14:  # "2" 0 "demo"`返回第一個非空數值
  value15:  # "" false "demo" 返回第一個非空數值
helm install demo demochart2 --debug --dry-run
#install.go:222: [debug] Original chart version: ""
#install.go:239: [debug] CHART PATH: /home/hccuse/Insync/y40103@gmail.com/Google Drive/hccuse/hccuse/learn/kind/helm/demochart2
#
#NAME: demo
#LAST DEPLOYED: Tue Jun 11 02:04:34 2024
#NAMESPACE: default
#STATUS: pending-install
#REVISION: 1
#TEST SUITE: None
#USER-SUPPLIED VALUES:
#{}
#
#COMPUTED VALUES:
#name: DeMo1
#
#HOOKS:
#MANIFEST:
#---
## Source: demochart2/templates/configmap.yaml
#apiVersion: v1
#kind: ConfigMap
#metadata:
#  name: demo-configmap
#data:
#  value1: "true"  # 1==1
#  value2: "false"  # 1!=1
#  value3: "false"  # 1<1
#  value4: "false"  # 1>1
#  value5: "true"  # 1<=1
#  value6: "true"  # 1>=1
#  value7: "1" # 1 and 1
#  value8: "777" # "" or "" , 否則 "777"
#  value9: "2"  # "" or 2 , 否則 "777"
#  value10: "1" # 1 or "" , 否則 "777"
#  value11: "true" # "" 是否為空
#  value13: "defult value"  # 不存在則使用預設值
#  value14: "2" # "2" 0 "demo"`返回第一個非空數值
#  value15: "demo" # "" false "demo" 返回第一個非空數值