[筆記] Helm 基礎使用
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" 返回第一個非空數值