some basic concepts
chart
- one helm package
- it containers all
resources definitionsnecessary to run one application, tool, or service inside of a k8s cluster
repository
- one place where charts can be collected and shared
release
- one instance of a chart running in k8s clutster
当我们理解这些概念,我们脑海中可以有这样的印象
- 如果我们想要找charts,可以去chart的仓库,即repository
- 当我们找到对应的charts后,我们去安装charts,即将charts中的资源部署到 k8s集群中,这样就产生了一个release
quickStart
# 安装helm
brew install helm
#给helm添加repo
helm repo add bitnami https://charts.bitnami.com/bitnami
#从所有的本地repo中查询mysql关键字的charts
helm search repo mysql #查看带有mysql这个key words的charts
helm search bitnami | grep mysql #查看name中有mysql的charts
#从Artifacts Hub中搜索
helm search hub nginx-controller
#安装一个charts
helm repo update
helm install bitnami/mysql --generate-name
#查看helm状态
helm status
#查看release
helm list --all
#卸载charts
helm uninstall mysql-1612624192
#校验helm语法
helm lint
go template语法
简单讲讲 go的template语法,这对后续看helm的chart文件很有帮助
1. 基础语法理解
- 你需要熟悉 Go Template 的基本语法,例如变量定义、管道、条件判断和循环等,这些是 Helm 模板中最常用的语法。例如:
- 如何通过 {{ .Values.key }}
访问变量; - 使用 {{ if }}, {{ range }}, {{ with }} 等
控制结构来处理数据和逻辑。
2. 管道操作
- Helm 模板中
管道(|) 用得很多。管道可以将一个表达式的输出传递给下一个函数,这是 Helm 模板中的重要特性。常见用法包括: - 使用 default 设置
默认值:{{ .Values.image.repository | default “nginx” }} - 使用 quote、upper 等
内置函数进行字符串处理。
3. 模板嵌套与文件分割
- 在 Helm 中通常会将模板分散到多个文件,因此了解 template 和 define 的用法很重要。Helm 使用 include 和 required 来
嵌套调用模板和判断关键值。
{{ include "mychart.labels" . }}
4. 错误处理
- 了解 required 函数,这在 Helm 中用于确保必需的值被传递进来:
{{ required "A valid .Values.service.name is required" .Values.service.name }}
5. 理解 Helm 特有的扩展
- 除了 Go Template 的基础语法,Helm 还增加了一些自己定义的模板函数,例如 lookup、tpl 等。这些函数的使用和 Helm 的上下文机制有关,理解这些函数的用途会对编写 Helm 模板有帮助。
深入讲解
customize your Chart before installing
若想在update、install时自定义,可以有以下方式配置(优先级从低到高)
-
Chart自带的value.yaml
helm install my-release ./my-chart-0.1.0.tgz -
使用-f 指定的自定义values.yaml 文件,按顺序加载,在后面的文件优先级更高
helm install my-release ./my-chart -f values1.yaml -f values2.yaml -
命令行
—set的参数helm install my-release ./my-chart --set service.type=NodePort -
命令行
—set-file的参数。当你想倒入一个大文本文件作为配置项时,比—set和values.yaml优先级更高helm install my-release ./my-chart --set-file config.json=path/to/config.json
—set的使用
#简答的key-value
--set name=value
#多个简单的key-value
--set a=b,c=d
#嵌套类型
--set outer.innner=value
#数组
--set name={a,b,c}
#数组中的某个字段
--set servers[0].port=80
#数组中的多个字段
--set servers[0].port=80,servers[0].host=example
#转义字符
--set name="values1\,value2"
--set nodeselector."kubernetes\.io/role"=master
Crete your own Charts
#创建一个Chart
➜ demo helm create my-chart
Creating my-chart
#一个chart的目录结构
➜ my-chart tree
.
├── Chart.yaml
├── charts
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── service.yaml
│ ├── serviceaccount.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
4 directories, 10 files
- NOTES.txt是chart的帮助文本,helm install的提示信息就是来自这里
- _helper.tpl描述了chart可以复用的模版对象
- values.yaml 将记录的值传给chart,进行模版渲染
可以用—debug和—dry-run 观察模版是如何渲染的
helm install puppy ./chart-demo --dry-run --debug
helm install puppy ./chart-demo --dry-run --debug --set favorit.food='noodles' --set favorit.drink='water'
具体内容
➜ helm helm install --debug puppy ./chart-demo --dry-run
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /Users/Zhuanz/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /Users/Zhuanz/.kube/config
install.go:224: 2024-11-02 13:05:37.9171 +0800 CST m=+0.067566126 [debug] Original chart version: ""
install.go:241: 2024-11-02 13:05:37.917401 +0800 CST m=+0.067867876 [debug] CHART PATH: /Users/Zhuanz/go/helm/chart-demo
NAME: puppy
LAST DEPLOYED: Sat Nov 2 13:05:37 2024
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
affinity: {}
autoscaling:
enabled: false
maxReplicas: 100
minReplicas: 1
targetCPUUtilizationPercentage: 80
favorite:
drink: water
food: noodles
fullnameOverride: ""
image:
pullPolicy: IfNotPresent
repository: nginx
tag: ""
imagePullSecrets: []
ingress:
annotations: {}
className: ""
enabled: false
hosts:
- host: chart-example.local
paths:
- path: /
pathType: ImplementationSpecific
tls: []
livenessProbe:
httpGet:
path: /
port: http
nameOverride: ""
nodeSelector: {}
podAnnotations: {}
podLabels: {}
podSecurityContext: {}
readinessProbe:
httpGet:
path: /
port: http
replicaCount: 1
resources: {}
securityContext: {}
service:
port: 80
type: ClusterIP
serviceAccount:
annotations: {}
automount: true
create: true
name: ""
tolerations: []
volumeMounts: []
volumes: []
HOOKS:
MANIFEST:
---
# Source: chart-demo/templates/config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: null
name: cm-demo
data:
myvalue: puppy-configmap
food: noodles
drink: water
#打包helm Chart,结果为一个tgz压缩包
➜ charts helm package my-chart
Successfully packaged chart and saved it to: /Users/Zhuanz/go/charts/my-chart-0.1.0.tgz
#安装Chart
➜ charts helm install my-charts ./my-chart-0.1.0.tgz
NAME: my-charts
LAST DEPLOYED: Mon Oct 28 21:59:19 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=my-chart,app.kubernetes.io/instance=my-charts" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
#根据上面的提示,我们设置一下环境变量
➜ charts kubectl --namespace default port-forward my-charts-69dc4c4678-nvbtf 8080:$CONTAINER_PORT
➜ charts export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=my-chart,app.kubernetes.io/instance=my-charts" -o jsonpath="{.items[0].metadata.name}")
➜ charts export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
➜ charts kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
Handling connection for 8080
Handling connection for 8080
访问

版本迭代控制
chart的每次安装或升级都会创建新的release版本,可以看chart.yaml 的描述,看到就的版本信息。
回滚到指定版本
#查看历史版本
helm history myapp
#回滚到指定版本 helm rollback [release] [version]
helm rollback myapp 1 #回滚到版本1
版本历史数据保留
#配置最大历史的版本数
helm install myapp ./mychart --history-max 10
#清理历史版本
helm delete myapp --purge
备份恢复
#导出当前配置
helm get values myapp >myapp-values.yaml
#使用备份配置进行重新部署
helm upgrade myapp ./mychart -f myapp-values.yaml
helm的资源构建顺序
具体顺序
- Namespace - NetworkPolicy - ResourceQuota - LimitRange - PodSecurityPolicy - PodDisruptionBudget - ServiceAccount - Secret - SecretList - ConfigMap - StorageClass - PersistentVolume - PersistentVolumeClaim - CustomResourceDefinition - ClusterRole - ClusterRoleList - ClusterRoleBinding - ClusterRoleBindingList - Role - RoleList - RoleBinding - RoleBindingList - Service - DaemonSet - Pod - ReplicationController - ReplicaSet - Deployment - HorizontalPodAutoscaler - StatefulSet - Job - CronJob - Ingress - APIServiceref
- some tricks to use helm
- quick-start helm
- detailed Explanation in chart