之前章节学习了K8S中各种各样的资源对象,现在提出一个问题,让你来创建一个可以对外提供访问的MYSQL服务,你会怎么做?我想了下大概有5个步骤如下:
- 创建一个mysql-secret.yaml 用于定义mysql的账号密码
- 创建一个mysql-volume.yaml 创建pv/pvc用于存储mysql持久化的数据
- 创建一个mysql-deployment.yaml 用于创建mysql的pod服务
- 创建一个mysql-service.yaml 用于提供对外服务
- 使用kubectl apply -f 命令依次去应用上述yaml文件
看起来都头大,为什么用了K8S,比在物理机上安装要麻烦这么多?而且这还只是一个mysql应用,当环境中有100个应用,那该怎么办?难道每个应用都要按照上述流程走一次?能不能使用一个 apt install mysql-server 就安装好一个服务呢?答案当然是有,Helm
就相当于kubernetes
环境下的apt
包管理工具。
什么是HELM
Helm 是 Kubernetes 生态中的核心包管理工具,旨在简化应用的打包、部署和生命周期管理。
一、Helm 的核心概念
-
Chart
- 定义:Helm 的“软件包”,包含应用部署所需的所有 Kubernetes 资源模板(如 Deployment、Service)及默认配置(
values.yaml
)。 - 目录结构:
Chart.yaml
:元数据文件(名称、版本、依赖等)。templates/
:存放 Kubernetes 资源模板(支持 Go 模板语法)。values.yaml
:默认配置参数,支持动态注入。
- 定义:Helm 的“软件包”,包含应用部署所需的所有 Kubernetes 资源模板(如 Deployment、Service)及默认配置(
-
Release
- 实例化:每次通过 Helm 安装 Chart 会生成唯一的 Release,记录版本状态和配置差异。
- 版本追踪:支持查看历史版本及回滚(如
helm rollback <release> <version>
)。
-
Repository
- 仓库类型:公共仓库(如
stable
、bitnami
)和私有仓库(如 Harbor),用于存储和分发 Chart。 - 仓库管理:通过
helm repo add/update
添加或同步仓库索引。
- 仓库类型:公共仓库(如
二、Helm 的核心功能与优势
-
简化复杂应用部署
- 模板化配置:通过变量替换(如
{{ .Values.image.tag }}
)实现多环境配置复用。 - 依赖管理:支持定义子 Chart(
charts/
目录)及版本约束。
- 模板化配置:通过变量替换(如
-
生命周期管理
- 安装/升级:使用
helm install/upgrade
部署或更新应用,自动处理资源顺序。 - 回滚机制:基于版本快照快速恢复至历史状态(依赖
helm history
和helm rollback
)。
- 安装/升级:使用
-
动态资源生成
- 钩子(Hooks):在部署生命周期中插入自定义操作(如预检查、数据库迁移)。
- 条件渲染:根据参数动态生成资源(如
if .Values.ingress.enabled
控制 Ingress 创建)。
三、Helm 的安装与使用
1.安装 Helm
Helm
现在主要使用v3
版:
Helm
官方网址:https://helm.sh/zh/
Helm
国内镜像:http://mirror.rancher.cn/
或http://mirror.cnrancher.com/
本章采用最新版3.17.2(202503最新版)
- 下载Helm
# 创建临时目录并下载
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...
2.使用Helm
创建一个新的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大部分:
- Chart.yaml、
- values.yaml
- templates目录下的其他yaml文件
这些文件有什么作用,会在后面的章节详细讲解,现在首先编辑values.yaml,发现默认是一个nginx的镜像,由于默认dockerhub仓库国内无法访问,将nginx镜像修改为镜像仓库。为了后面访问方便,将Service 的类型也改成 NodePort。
修改镜像地址:
修改service类型为NodePort:
3.创建首个helm应用
在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
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
......
4.载这个helm 应用
使用命令 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.