之前章节学习了K8S中各种各样的资源对象,现在提出一个问题,让你来创建一个可以对外提供访问的MYSQL服务,你会怎么做?我想了下大概有5个步骤如下:
看起来都头大,为什么用了K8S,比在物理机上安装要麻烦这么多?而且这还只是一个mysql应用,当环境中有100个应用,那该怎么办?难道每个应用都要按照上述流程走一次?能不能使用一个 apt install mysql-server 就安装好一个服务呢?答案当然是有,Helm
就相当于kubernetes
环境下的apt
包管理工具。
Helm 是 Kubernetes 生态中的核心包管理工具,旨在简化应用的打包、部署和生命周期管理。
Chart
values.yaml
)。Chart.yaml
:元数据文件(名称、版本、依赖等)。templates/
:存放 Kubernetes 资源模板(支持 Go 模板语法)。values.yaml
:默认配置参数,支持动态注入。Release
helm rollback
)。Repository
stable
、bitnami
)和私有仓库(如 Harbor),用于存储和分发 Chart。helm repo add/update
添加或同步仓库索引。简化复杂应用部署
{{ .Values.image.tag }}
)实现多环境配置复用。charts/
目录)及版本约束。生命周期管理
helm install/upgrade
部署或更新应用,自动处理资源顺序。helm history
和 helm rollback
)。动态资源生成
if .Values.ingress.enabled
控制 Ingress 创建)。Helm
现在主要使用v3
版:
Helm
官方网址:https://helm.sh/zh/
Helm
国内镜像:http://mirror.rancher.cn/
或 http://mirror.cnrancher.com/
本章采用最新版3.17.2(202503最新版)
# 创建临时目录并下载
root@k8s-master:~# mkdir -vp helm
mkdir: created directory 'helm'
root@k8s-master:~# cd helm/
root@k8s-master:~/helm# wget https://rancher-mirror.rancher.cn/helm/v3.17.2/helm-v3.17.2-linux-amd64.tar.gz
# 解压并将二进制文件移至/usr/local/bin
root@k8s-master:~/helm# tar zxvf helm-v3.17.2-linux-amd64.tar.gz
linux-amd64/
linux-amd64/LICENSE
linux-amd64/helm
linux-amd64/README.md
root@k8s-master:~/helm# cd linux-amd64/
root@k8s-master:~/helm/linux-amd64# ls
helm LICENSE README.md
root@k8s-master:~/helm/linux-amd64# mv helm /usr/local/bin/
# 版本验证
root@k8s-master:~/helm/linux-amd64# helm version
version.BuildInfo{Version:"v3.17.2", GitCommit:"cc0bbbd6d6276b83880042c1ecb34087e84d41eb", GitTreeState:"clean", GoVersion:"go1.23.7"}
由于helm默认仓库是使用国外镜像,所以会导致很多时候速度慢甚至无法下载,将镜像仓库修改为阿里云仓库
# 查看仓库源 为空
helm repo list
# 新增仓库源,可以添加多个地址,
helm repo add azure http://mirror.azure.cn/kubernetes/charts/
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 配置国内Chart仓库
阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts) #已经很久不更新
微软仓库(http://mirror.azure.cn/kubernetes/charts/) #推荐
官方仓库(https://hub.kubeapps.com/charts/incubator)官方chart仓库,国内有点不好使。
# 搜索redis镜像
# helm search repo redis
NAME CHART VERSION APP VERSION DESCRIPTION
aliyun/redis 1.1.15 4.0.8 Open source, advanced key-value store. It is of...
aliyun/redis-ha 2.0.1 Highly available Redis cluster with multiple se...
azure/prometheus-redis-exporter 3.5.1 1.3.4 DEPRECATED Prometheus exporter for Redis metrics
azure/redis 10.5.7 5.0.7 DEPRECATED Open source, advanced key-value stor...
azure/redis-ha 4.4.6 5.0.6 DEPRECATED - Highly available Kubernetes implem...
aliyun/sensu 0.2.0 Sensu monitoring framework backed by the Redis ...
azure/sensu 0.2.5 0.28 DEPRECATED Sensu monitoring framework backed by...
创建一个新的helm Chart
# 创建一个myapp的自定义应用
root@k8s-master:~/helm# helm create myapp
Creating myapp
# 进入目录
root@k8s-master:~/helm# cd myapp/
# 查看目录结构
root@k8s-master:~/helm/myapp# tree
.
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
3 directories, 10 files
这里从目录结构可以看出来,可以总共分为3大部分:
这些文件有什么作用,会在后面的章节详细讲解,现在首先编辑values.yaml,发现默认是一个nginx的镜像,由于默认dockerhub仓库国内无法访问,将nginx镜像修改为镜像仓库。为了后面访问方便,将Service 的类型也改成 NodePort。
修改镜像地址:
在myapp目录的上一层,使用命令 helm install myapp myapp 安装,这里第一个myapp 为创建后的deployments的名字,第二个myapp为刚create的目录名。
在install后,提示我们可以运行后续命令,可以获取对应的服务暴露IP和端口,也就是可以通过 $NODE_IP:$NODE_PORT
来访问myapp这个服务。
root@k8s-master:~/helm# ls
helm-v3.17.2-linux-amd64.tar.gz linux-amd64 myapp
root@k8s-master:~/helm# helm install myapp myapp
NAME: myapp
LAST DEPLOYED: Thu Apr 3 14:28:31 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services myapp)
export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
查看helm 下的应用,查看deployment,查看pod
root@k8s-master:~/helm# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
myapp default 1 2025-04-03 14:33:46.58464117 +0800 CST deployed myapp-0.1.0 1.16.0
root@k8s-master:~/helm# kubectl get deployments,pod
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/myapp 1/1 1 1 21s
NAME READY STATUS RESTARTS AGE
pod/myapp-6c5df5768-nvvcg 1/1 Running 0 21s
查看nginx服务是否对外正常
# 获取端口
root@k8s-master:~/helm# echo $(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services myapp)
32117
# 获取IP
root@k8s-master:~/helm# echo $(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
172.21.176.3
# 通过curl 访问测试
root@k8s-master:~/helm# curl 172.21.176.3:32117
Welcome to nginx!
......
使用命令 helm uninstall myapp
即可卸载,这里只需要有应用名即可。不需要带目录名,卸载后发现pod也消失了。
root@k8s-master:~/helm# helm uninstall myapp
release "myapp" uninstalled
root@k8s-master:~/helm# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
root@k8s-master:~/helm# kubectl get deployments,pod
No resources found in default namespace.