Kubernetes 包工具- Helm 入门到企业实战
20.1 Helm概述
20.1.1 基本介绍
官方chart站点:https://github.com/vmware-tanzu/kubeapps/
Helm中的一些概念:
helm:命令行客户端工具,主要用于Kubernetes应用中的chart的创建、打包、发布和管理。Chart:helm程序包,一系列用于描述k8s资源相关文件的集合,比方说我们部署nginx,需要deployment的yaml,需要service的yaml,这两个清单文件就是一个helm程序包,在k8s中把这些yaml清单文件叫做chart图表。
- Helm 是 Kubernetes 应用的包管理工具,主要用来管理 Charts,类似 Linux 系统的 yum。
- Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata,以便于应用程序的分发。
- 对于应用发布者而言
- 通过 Helm 打包应用、管理应用依赖关系、管理应用版本并发布应用到软件仓库。
- 对于使用者而言
- 使用 Helm 后可以以简单的方式在 Kubernetes 上查找、安装、升级、回滚、卸载应用程序

20.1.2 K8s版本支持的各个helm版本对照表:
https://helm.sh/zh/docs/topics/version_skew/

20.1.3 helm常用操作
| 命令 | 描述 |
|---|---|
| create | 创建一个 chart 并指定名字 |
| dependency | 管理 chart 依赖 |
| get | 下载一个 release。可用子命令:all、hooks、manifest、notes、values |
| history | 获取 release 历史 |
| install | 安装一个 chart |
| list | 列出 release |
| package | 将 chart 目录打包到 chart 存档文件中 |
| pull | 从远程仓库中下载 chart 并解压到本地 # helm pull stable/mysql -- untar |
| repo | 添加,列出,移除,更新和索引 chart 仓库。可用子命令:add、index、 list、remove、update |
| rollback | 从之前版本回滚 |
| search | 根据关键字搜索 chart。可用子命令:hub、repo |
| show | 查看 chart 详细信息。可用子命令:all、chart、readme、values |
| status | 显示已命名版本的状态 |
| template | 本地呈现模板 |
| uninstall | 卸载一个 release |
| upgrade | 更新一个 release |
| version | 查看 helm 客户端版本 |
20.2 部署Helm 4.00
开源地址:https://github.com/helm/helm/releases/tag/v4.0.0
20.2.1 安装helm软件
bash
[root@k8s-master1 ~]# wget https://get.helm.sh/helm-v4.0.0-linux-amd64.tar.gz
[root@k8s-master1 ~]# tar zxf helm-v4.0.0-linux-amd64.tar.gz
[root@k8s-master1 ~]# cp linux-amd64/helm /bin
[root@k8s-master1 ~]# helm version
version.BuildInfo{Version:"v4.0.0", GitCommit:"99cd1964357c793351be481d55abbe21c6b2f4ec", GitTreeState:"clean", GoVersion:"go1.25.3", KubeClientVersion:"v1.34"}
20.2.2 添加/删除chart仓库地址
- 阿里云仓库:https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
- 微软仓库:http://mirror.azure.cn/kubernetes/charts/
bash
[root@k8s-master1 ~]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
[root@k8s-master1 ~]# helm repo add microsoft http://mirror.azure.cn/kubernetes/charts/
helm repo remove xxx
20.2.3 查看仓库列表
bash
[root@k8s-master1 ~]# helm repo list
NAME URL
aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
microsoft http://mirror.azure.cn/kubernetes/charts/
20.2.4 查看仓库存储helm清单
bash
[root@k8s-master1 ~]# helm search repo aliyun
20.2.5 更新chart仓库
bash
[root@k8s-master1 ~]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "aliyun" chart repository
...Successfully got an update from the "microsoft" chart repository
Update Complete. ⎈Happy Helming!⎈
20.3 Helm基本使用
20.3.1 搜索并下载chart
bash
[root@k8s-master1 ~]# helm search repo aliyun | grep memcached
aliyun/mcrouter 0.1.0 0.36.0
aliyun/memcached 2.0.1
# 查看chart信息
[root@k8s-master1 ~]# helm show chart aliyun/memcached
apiVersion: v1
description: Free & open source, high-performance, distributed memory object caching
system.
home: http://memcached.org/
icon: https://upload.wikimedia.org/wikipedia/en/thumb/2/27/Memcached.svg/1024px-Memcached.svg.png
keywords:
- memcached
- cache
maintainers:
- email: gtaylor@gc-taylor.com
name: Greg Taylor
name: memcached
sources:
- https://github.com/docker-library/memcached
version: 2.0.1
bash
[root@k8s-master1 ~]# helm pull aliyun/memcached
[root@k8s-master1 ~]# tar zxf memcached-2.0.1.tgz
[root@k8s-master1 ~]# cd memcached/
[root@k8s-master1 memcached]# ls
Chart.yaml README.md templates values.yaml
1.Chart.yaml: chart的基本信息,包括版本名字之类
2.templates: 存放k8s的部署资源模板,通过渲染变量得到部署文件
3.values.yaml:存放全局变量,templates下的文件可以调用
[root@k8s-master1 memcached]# cd templates/
[root@k8s-master1 templates]# ls
_helpers.tpl NOTES.txt pdb.yaml statefulset.yaml svc.yaml
1._helpers.tpl 存放能够复用的模板
2.NOTES.txt 为用户提供一个关于chart部署后使用说明的文件
20.3.2 部署chart
20.3.2.1 helm部署memcached服务
bash
[root@k8s-node1 ~]# docker pull library/memcached:1.4.36
[root@k8s-node1 ~]# docker save -o memcached-1.4.36.tar.gz memcached:1.4.36
[root@k8s-node1 ~]# ctr -n k8s.io images import memcached-1.4.36.tar.gz
unpacking docker.io/library/memcached:1.4.36
# 也可以直接这样
[root@k8s-master1 ~]# ctr -n k8s.io image pull docker.io/library/memcached:1.4.36-alpine
bash
[root@k8s-master1 ~]# cd memcached/
[root@k8s-master1 memcached]# rm -rf templates/pdb.yaml
# 修改一些东西(apiversion,selector,affinity)
[root@k8s-master1 memcached]# vim templates/statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: {{ template "memcached.fullname" . }}
labels:
app: {{ template "memcached.fullname" . }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: "{{ .Release.Name }}"
heritage: "{{ .Release.Service }}"
spec:
selector:
matchLabels:
app: {{ template "memcached.fullname" . }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: "{{ .Release.Name }}"
heritage: "{{ .Release.Service }}"
serviceName: {{ template "memcached.fullname" . }}
replicas: {{ .Values.replicaCount }}
template:
metadata:
labels:
app: {{ template "memcached.fullname" . }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: "{{ .Release.Name }}"
heritage: "{{ .Release.Service }}"
spec:
containers:
- name: {{ template "memcached.fullname" . }}
image: {{ .Values.image }}
imagePullPolicy: {{ default "" .Values.imagePullPolicy | quote }}
command:
- memcached
- -m {{ .Values.memcached.maxItemMemory }}
{{- if .Values.memcached.extendedOptions }}
- -o
- {{ .Values.memcached.extendedOptions }}
{{- end }}
{{- if .Values.memcached.verbosity }}
- -{{ .Values.memcached.verbosity }}
{{- end }}
ports:
- name: memcache
containerPort: 11211
livenessProbe:
tcpSocket:
port: memcache
initialDelaySeconds: 30
timeoutSeconds: 5
readinessProbe:
tcpSocket:
port: memcache
initialDelaySeconds: 5
timeoutSeconds: 1
resources:
{{ toYaml .Values.resources | indent 10 }}
bash
[root@k8s-master1 memcached]# helm install memcached ./
bash
[root@k8s-master1 memcached]# kubectl get pods
NAME READY STATUS RESTARTS AGE
memcached-memcached-0 1/1 Running 0 10m
memcached-memcached-1 1/1 Running 0 10m
memcached-memcached-2 1/1 Running 0 10m
20.3.3 release相关操作
bash
[root@k8s-master1 ~]# helm list
[root@k8s-master1 ~]# helm delete memcached
# 删除release会把release下对应的资源也删除
[root@k8s-master1 ~]# kubectl get pods
20.4 自定义Chart模版
20.4.1 自定义Chart
bash
[root@k8s-master1 ~]# helm create myapp
[root@k8s-master1 ~]# cd myapp/
[root@k8s-master1 myapp]# ls
charts Chart.yaml templates values.yaml
[root@k8s-master1 myapp]# yum install -y tree
[root@k8s-master1 myapp]# tree ./
./
├── charts
├── Chart.yaml # 描述这个 Chart 的相关信息、包括名字、描述信息、版本等
├── templates # 模板目录,保留创建k8s的资源清单文件
│ ├── deployment.yaml # deployment资源的go模板文件
│ ├── _helpers.tpl # 模板助手文件,定义的值可在模板中使用
│ ├── hpa.yaml # 水平pod自动扩缩容go模板文件
│ ├── httproute.yaml
│ ├── ingress.yaml # 七层代理
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml # 模板的值文件,这些值会在安装时应用到 GO 模板生成部署文件
20.4.2 部署release
bash
[root@k8s-node1 ~]# crictl pull nginx:latest
[root@k8s-master1 myapp]# helm install nginx ./
[root@k8s-master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-myapp-7c4fd57446-glhq2 1/1 Running 0 10m
[root@k8s-master1 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4h32m
nginx-myapp ClusterIP 10.104.207.50 <none> 80/TCP 11m
20.4.2.2 upgrade升级release及版本回滚rollback
bash
[root@k8s-master1 ~]# kubectl get svc
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4h32m
nginx-myapp ClusterIP 10.104.207.50 <none> 80/TCP 11m
[root@k8s-master1 ~]# helm upgrade --set service.type="NodePort" nginx myapp
[root@k8s-master1 ~]# kubectl get svc
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP
nginx-myapp NodePort 10.104.207.50 <none> 80:31380/TCP
[root@k8s-master1 ~]# helm history nginx
[root@k8s-master1 ~]# helm rollback nginx 1
[root@k8s-master1 ~]# helm history nginx
20.4.2.3 打包Chart
bash
[root@k8s-master1 ~]# helm package /root/myapp/
Successfully packaged chart and saved it to: /root/myapp-0.1.0.tgz
[root@k8s-master1 ~]# ll myapp-0.1.0.tgz
-rw-r--r-- 1 root root 4938 Mar 18 21:16 myapp-0.1.0.tgz