一、安装
Github 仓库
Github Release竟然没有编译好的包。
- 下载
1
| wget https://get.helm.sh/helm-v4.2.0-linux-amd64.tar.gz
|
- 解压
1
| tar xf helm-v4.2.0-linux-amd64.tar.gz
|
- 移动
1
| mv linux-amd64/helm /usr/local/bin
|
合并2、3
1
| tar xf helm-v4.2.0-linux-amd64.tar.gz -C /usr/local/bin --strip-components=1 linux-amd64/helm
|
- 验证
- 自动补全
1 2
| helm completion bash >> ~/.bashrc source ~/.bashrc
|
二、问题
2.1 helm 命令补全乱码
解决方案:安装 bash-completion
1
| dnf install -y bash-completion
|
安装完成后,需要让当前 shell 加载它:
1
| source /etc/profile.d/bash_completion.sh
|
或者直接重新登录一下终端。
三、命令速查
3.1 概念
Charts 是一组 k8s 资源清单文件,Release 是一个个运行的实例。
3.2 仓库
- 仓库管理
1 2 3 4 5 6
| helm repo add <名字> <仓库URL> helm repo list helm repo update helm repo update <名字> helm repo remove <名字> helm repo index <目录>
|
- 搜索 chart
1 2 3
| helm search repo <关键词> helm search repo <关键词> -l helm search hub <关键词>
|
Artifact Hub(artifacthub.io):CNCF 官方的发现门户,相当于 chart 界的搜索引擎。它是上一代 Helm Hub 的继任者。先来这搜,它告诉你该 add 哪个地址。
3.3 chart
- 查看 chart 内容(安装前先看清楚)
1 2 3 4 5 6 7 8 9 10
| helm show chart <仓库/chart> helm show values <仓库/chart> helm show readme <仓库/chart> helm show all <仓库/chart>
helm show values bitnami/redis --version 19.0.0
helm show values ingress-nginx/ingress-nginx > my-values.yaml
|
- values 赋值的几种方式
1 2 3 4 5 6 7
| -f values.yaml --set key=value --set-string key=value --set-file key=文件路径
helm install myapp ./myapp -f values.yaml -f values-prod.yaml --set image.tag=v1.2.3
|
3.4 渲染和调试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| helm template <release名> <chart> -f values.yaml
helm template myapp ./myapp -s templates/deployment.yaml
helm install myapp ./myapp --dry-run --debug
helm lint ./myapp
helm get manifest <release名> helm get values <release名> helm get notes <release名> helm get all <release名>
helm plugin install https://github.com/databus23/helm-diff helm diff upgrade <release名> <chart> -f values.yaml
|
经验:改完模板 / values,先 helm template 肉眼看渲染,再 helm diff upgrade 看变更,最后才 helm upgrade。
3.5 安装 / 升级 / 回滚 / 卸载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| helm install <release名> <仓库/chart> helm install <release名> ./mychart helm install <release名> ./mychart-1.0.0.tgz helm install <release名> oci://registry/xxx/chart --version 1.0.0
-n <命名空间> --create-namespace --version <版本> --atomic --wait --timeout 5m
helm upgrade --install <release名> <chart> -f values.yaml -n <ns>
helm list -n <ns> helm status <release名> helm history <release名>
helm rollback <release名> helm rollback <release名> 3
helm uninstall <release名> -n <ns> helm uninstall <release名> --keep-history
|
3.6 开发 chart
标准目录结构:
1 2 3 4 5 6
| mychart/ ├── Chart.yaml # 元信息:name / version / appVersion / dependencies ├── values.yaml # 默认取值 ├── charts/ # 依赖的子 chart 会放在这(dependency update 后出现) ├── templates/ # 模板(_helpers.tpl 放复用片段,NOTES.txt 是安装提示) └── .helmignore
|
1 2 3 4 5
| helm lint ./mychart helm template ./mychart helm package ./mychart helm package ./mychart -d ./dist helm package ./mychart --version 1.2.3
|
固定版本:chart 的版本由 Chart.yaml 里的 version: 决定。每次改 chart 就 +1,打出来的 tgz 文件名自带版本号,这就是“固定版本”的来源。
3.7 依赖管理
在 Chart.yaml 里声明依赖:
1 2 3 4 5 6 7 8
| dependencies: - name: redis version: "19.0.0" repository: "https://charts.bitnami.com/bitnami" condition: redis.enabled - name: common version: "2.x.x" repository: "https://..."
|
1 2 3
| helm dependency list <chart> helm dependency update <chart> helm dependency build <chart>
|
- subchart / umbrella:父 chart 把 redis、postgresql 等当依赖一起装。父的 values 里用
redis: {...} 这个 key 覆盖子 chart 的值。
- library chart(
type: library):本身装不出任何东西,只导出模板片段,被别的 chart 用 {{ include "common.xxx" . }} 调用。这通常就是团队里那个“基础设施 chart”。
Chart.lock 锁定依赖的精确版本,提交进 git,保证每个人 / CI 拉到的依赖一致。
3.8 拉取 / 推送 / OCI 仓库
1 2 3 4 5 6 7 8 9 10 11 12 13
| helm pull <仓库/chart> helm pull <仓库/chart> --version 1.0.0 helm pull <仓库/chart> --untar helm pull oci://registry-1.docker.io/bitnamicharts/redis
helm registry login <registry地址> -u <用户> helm push mychart-1.2.3.tgz oci://<registry>/<项目> helm pull oci://<registry>/<项目>/mychart --version 1.2.3 helm install myapp oci://<registry>/<项目>/mychart --version 1.2.3 helm show values oci://<registry>/<项目>/mychart --version 1.2.3 helm registry logout <registry地址>
|
传统 HTTP 仓库的发布方式(了解即可):helm package → helm repo index . 生成 index.yaml → 把 tgz 和 index.yaml 一起放到一个能 HTTP 访问的地方(如 GitHub Pages / Nginx)。新项目建议直接用 OCI,不用再维护 index.yaml。
3.9 典型工作流串一遍
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update helm show values ingress-nginx/ingress-nginx > my-values.yaml helm template ing ingress-nginx/ingress-nginx -f my-values.yaml helm upgrade --install ing ingress-nginx/ingress-nginx \ -f my-values.yaml -n ingress --create-namespace --version 4.x.x
helm create myapp
helm lint ./myapp helm template ./myapp helm dependency update ./myapp helm package ./myapp helm push myapp-0.1.0.tgz oci://<registry>/<项目> helm install myapp ./myapp-0.1.0.tgz
helm history myapp helm rollback myapp 2
|