马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
实践环境
registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.16
registry.cn-shanghai.aliyuncs.com/labring/helm:v3.8.2
简介
Helm 是 Kubernetes 生态体系中最焦点的包管理工具,被誉为“Kubernetes 的 apt/yum”,其操持目标是简化 Kubernetes 应用的摆设、管理与分发,通过尺度化的“包”格式(Chart)办理 Kubernetes 原生资源设置复杂、复用性差的痛点。
一、Helm 的焦点定位:Kubernetes 应用的“包管理器”
Helm 的本质是将 Kubernetes 应用的全部资源(Deployment、Service、ConfigMap、Secret 等)打包成一个可复用的“Chart”,并通过“Release”机制管理应用的生命周期(安装、升级、回滚、卸载)。其焦点类比:
- Chart:相当于 Linux 中的 .deb/.rpm包,或 Python 中的 pip包,包罗应用运行所需的全部 Kubernetes 资源模板与默认设置;
- Release:相当于“安装后的应用实例”,每个 Chart 可在集群中安装多次,天生多个独立的 Release(如同一 MySQL Chart 可摆设“开辟库”与“测试库”两个 Release);
- Repository:相当于“应用市肆”,用于存储与共享 Chart(如公共的 Artifact Hub,或企业内部私有堆栈)。
二、Helm 的焦点概念剖析
要明白 Helm 的工作方式,必须把握以下四个焦点概念:
1. Chart:应用的“蓝图”
Chart 是 Helm 的打包格式,用于将 Kubernetes 应用的资源模板与设置封装为一个可复用的单位。其目次结构如下:- my-chart/
- ├── Chart.yaml # 必须:Chart 的元数据(名称、版本、描述、依赖等)
- ├── values.yaml # 必须:默认配置值(如副本数、镜像标签、资源限制)
- ├── templates/ # 必须:Kubernetes 资源模板(带 Go 模板语法,如 deployment.yaml、service.yaml)
- ├── charts/ # 可选:依赖的子 Chart(如应用依赖的数据库 Chart)
- └── README.md # 可选:Chart 的说明文档
复制代码
- templates/:存放带模板语法的 Kubernetes 资源文件,通过 values.yaml中的值动态渲染(如 {{ .Values.replicaCount }}会被更换为现实的副本数);
- values.yaml:提供模板的默认值,用户安装时可覆盖(如 helm install --set replicaCount=3)。
2. Release:Chart 的“运行实例”
Release 是Chart 在 Kubernetes 集群中的详细运行实例。每实行一次 helm install,Helm 会根据 Chart 天生一个唯一的 Release(如 my-nginx-release),并记录其版本汗青(通过 helm history 检察)。Release 的焦点特性:
- 唯一性:同一 Chart 可在同一集群中安装多次,每个 Release 有独立的名称与资源;
- 版本管理:Helm 会记录每个 Release 的全部变动(如升级、回滚),支持一键回滚到恣意汗青版本(如 helm rollback 1)。
3. Repository:Chart 的“存储与共享中央”
Repository 是存储 Chart 的堆栈,雷同于 Docker Hub 或 PyPI。其焦点作用是:
- 共享 Chart:公共 Repository(如 Artifact Hub)提供数千个现成的 Chart(如 Nginx、MySQL、Redis),用户可直接搜索并安装;
- 私有摆设:企业可搭建内部 Repository(如通过 Harbor 或 ChartMuseum),用于存储内部应用的 Chart,实现尺度化分发。
Helm 支持添加多个 Repository(如 helm repo add bitnami https://charts.bitnami.com/bitnami),并通过 helm repo update同步最新 Chart 列表。
4. Helm Client:下令行工具
Helm Client 是用户与 Helm 交互的紧张方式,通过下令行指令(如 helm install、helm upgrade、helm rollback)管理 Chart 与 Release。与 Kubernetes 原生的 kubectl差别,Helm Client 聚焦应用级别的管理(而非单个资源),比方:
- helm install my-nginx bitnami/nginx:安装 Bitnami 提供的 Nginx Chart,天生名为 my-nginx的 Release;
- helm upgrade my-nginx bitnami/nginx --set replicaCount=3:升级 my-nginx的副本数为 3;
- helm rollback my-nginx 1:回滚 my-nginx到版本 1。
三、Helm 的焦点代价:办理 Kubernetes 管理的痛点
Kubernetes 原生摆设应用须要编写大量 YAML 文件(如 Deployment、Service、ConfigMap),且需手动管理这些文件的版本、依靠与回滚,服从低且易堕落。Helm 针对这些痛点提供了以下焦点代价:
1. 简化摆设流程
通过 Chart 封装全部资源,用户只需实行一条下令(helm install)即可摆设复杂应用(如包罗前端、后端、数据库的微服务),无需手动创建多个 YAML 文件。
2. 尺度化与复用
Chart 将应用的资源设置尺度化(如同一的目次结构、模板语法),企业可将内部应用的 Chart 存储在私有 Repository 中,实现跨部分复用(如“付出服务”Chart 可被多个业务线利用)。
3. 版本控制与回滚
Helm 记录每个 Release 的全部变动(如升级时的设置修改),支持一键回滚到恣意汗青版本(如升级失败后回滚到稳固版本),低落生产环境的风险。
4. 依靠管理
Chart 可通过 requirements.yaml(Helm 2)或 Chart.yaml(Helm 3)声明依靠(如应用依靠 MySQL 数据库),Helm 会自动下载并安装依靠的 Chart,无需手动处置处罚
Helm安装
二进制安装- # tar -zxvf helm-v4.0.0-linux-amd64.tar.gz
- # mv linux-amd64/helm /usr/local/bin/helm
复制代码 下载地点:https://github.com/helm/helm/releases
参考链接:https://helm.sh/docs/intro/install
镜像安装(基于sealos)- # sealos run registry.cn-shanghai.aliyuncs.com/labring/helm:v3.8.2
复制代码 阐明:基于 OCI 镜像的安装方式,通过 Sealos 工具将预打包的 Helm v3.8.2 镜像摆设到 Kubernetes 集群
入门示例--Nginx服务摆设
Chart资源包构造--极简版 Bitnami Nginx Helm Chart
参考毗连: https://github.com/bitnami/charts/tree/main/bitnami/nginx
文件构造结构
- my-minimal-nginx/
- ├── Chart.yaml # Chart 元数据
- ├── values.yaml # 可配置参数(Deployment/Service 核心配置)
- └── templates/
- ├── deployment.yaml # Deployment 模板
- └── service.yaml # Service 模板(暴露外部 IP)
复制代码 📄 1. Chart.yaml(Chart 元数据)
界说 Chart 名称、版本、形貌等根本信息:- apiVersion: v2
- name: my-minimal-nginx # Chart 名称(部署后资源会带此前缀)
- description: A simplified Helm chart to deploy Nginx with NodePort
- version: 0.1.0 # Chart 版本(语义化版本,便于迭代)
复制代码 📄 2. values.yaml(焦点可设置参数)
存储 Deployment 和 Service 的默认设置(摆设时可通过 -f覆盖):- image:
- repository: nginx # Nginx 镜像仓库(用 Docker Hub 官方镜像,简化依赖)
- tag: latest # 镜像标签(版本)
- replicaCount: 1 # Nginx Pod 副本数(高可用,可按需调整)
- service:
- type: NodePort # 服务类型改为 NodePort
- port: 80 # Service 对外暴露的逻辑端口(集群内/外访问统一用 80)
- targetPort: 80 # 转发到 Nginx Pod 的端口
- nodePort: 30080 # (可选)指定节点上的端口,范围 30000-32767;不填则 K8s 自动分配
复制代码 📄 3. templates/deployment.yaml(Deployment 模板)
用 Go 模板语法 动态天生 Kubernetes Deployment YAML:- {{- /*
- deployment.yaml:定义 Nginx Deployment 资源
- 模板逻辑:通过 {{ .Values.XXX }} 读取 values.yaml 配置,通过 {{ .Chart.XXX }}读取Chart.yaml配置,动态生成 YAML
- - */ -}}
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: {{ .Release.Name }}-deployment # 资源名 = 发布名 + 固定后缀
- labels:
- app: {{ .Chart.Name }} # 标签:关联 Chart 名称(my-minimal-nginx)
- spec:
- replicas: {{ .Values.replicaCount }} # 副本数(从 values.yaml 读取)
- selector:
- matchLabels:
- app: {{ .Chart.Name }} # Selector:匹配 Pod 标签(必须和 Pod 模板一致)
- template:
- metadata:
- labels:
- app: {{ .Chart.Name }} # Pod 标签(必须和 selector.matchLabels 一致)
- spec:
- containers:
- - name: nginx-container # 容器名
- image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" # 镜像地址(仓库 + 标签)
- ports:
- - containerPort: {{ .Values.service.targetPort }} # 容器暴露的端口(从 values.yaml 读取)
复制代码 📄 4. templates/service.yaml(Service 模板)
用 Go 模板天生 Kubernetes Service YAML,实现外部 IP 袒露:- {{- /*
- service.yaml:定义 Service 资源,支持 NodePort/LoadBalancer 暴露
- - NodePort:通过节点 IP + nodePort 访问(如 192.168.88.139:30080)
- - LoadBalancer:通过云厂商负载均衡器 IP 访问
- - */ -}}
- apiVersion: v1
- kind: Service
- metadata:
- name: {{ .Release.Name }}-service # 服务名 = 发布名 + 固定后缀
- labels:
- app: {{ .Chart.Name }} # 标签:关联 Chart 名称
- spec:
- type: {{ .Values.service.type }} # 服务类型(从 values.yaml 读取:NodePort/LoadBalancer)
- selector:
- app: {{ .Chart.Name }} # 关联 Pod 标签(必须和 Deployment 模板的 labels 一致)
- ports:
- - protocol: TCP
- port: {{ .Values.service.port }} # Service 逻辑端口(集群内访问用)
- targetPort: {{ .Values.service.targetPort }} # 转发到 Pod 的端口
- {{- if eq .Values.service.type "NodePort" }} # 仅 NodePort 类型时添加 nodePort 字段
- nodePort: {{ .Values.service.nodePort }} # 节点上暴露的端口(范围 30000-32767,可选配置)
- {{- end }}
复制代码 🔧 摆设 & 验证(焦点步调)
1. 摆设到 Kubernetes 集群
进入 my-minimal-nginx所在目次,实行 helm install:- # helm install my-nginx ./my-minimal-nginx
- NAME: my-nginx-release
- LAST DEPLOYED: Sun Jan 18 22:44:32 2026
- NAMESPACE: default
- STATUS: deployed
- REVISION: 1
- TEST SUITE: None
复制代码 my-nginx是本次摆设的发布名(自界说,集群内唯一)。
2. 检察 Service 状态(确认 NodePort)
摆设完成后,实行以下下令检察 Service 状态(重点看 EXTERNAL-IP):- # kubectl get svc -A
- NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 35h
- default my-nginx-service NodePort 10.96.2.4 <none> 80:30080/TCP 57s
- kube-system hubble-peer ClusterIP 10.96.2.226 <none> 443/TCP 35h
- kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 35h
- # kubectl get svc my-nginx-service
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- my-nginx-service NodePort 10.96.0.178 <none> 80:30080/TCP 3m47s
复制代码 3. 检察pod状态
- # kubectl get pod -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- my-nginx-deployment-ff65df8fb-j6ct7 1/1 Running 0 2m25s 10.0.1.54 192-168-88-140 <none> <none>
复制代码 4. 访问验证

Helm焦点下令
1. 添加 Chart 堆栈
- # 添加官方仓库(推荐 Bitnami)
- # helm repo add bitnami https://charts.bitnami.com/bitnami
- "bitnami" has been added to your repositories
- # 更新仓库索引
- # helm repo update
- Hang tight while we grab the latest from your chart repositories...
- ...Successfully got an update from the "bitnami" chart repository
- Update Complete. ⎈Happy Helming!⎈
复制代码 2. 搜索 Chart
- # 搜索 Nginx Chart
- # helm search repo nginx
- NAME CHART VERSION APP VERSION DESCRIPTION
- bitnami/nginx 22.4.3 1.29.4 NGINX Open Source is a web server that can be a...
- bitnami/nginx-ingress-controller 12.0.7 1.13.1 NGINX Ingress Controller is an Ingress controll...
- bitnami/nginx-intel 2.1.15 0.4.9 DEPRECATED NGINX Open Source for Intel is a lig...
复制代码 3. 安装 Chart
- # 基础安装(使用默认配置)
- helm install my-nginx bitnami/nginx
- # 自定义配置(通过 values.yaml 覆盖默认值)
- helm install my-nginx bitnami/nginx -f values.yaml
- # 安装时指定名称空间--指定安装到哪个名称空间
- # helm install my-nginx-release ./my-minimal-nginx -n base_app
- # helm install my-nginx-release ./my-minimal-nginx --namespace base_app
- # 安装本地自定义Chart
- # helm install my-nginx-release ./my-minimal-nginx
- NAME: my-nginx-release
- LAST DEPLOYED: Sun Jan 18 22:44:32 2026
- NAMESPACE: default
- STATUS: deployed
- REVISION: 1
- TEST SUITE: None
复制代码 阐明:偶然间实行卸载下令,再次安装时会报错:- Error: INSTALLATION FAILED: cannot re-use a name that is still in use
复制代码 此时实行helm list -n 看不到对应名称的发布。
办理方法:- # 查找残留的 Secret(Helm 3 默认存储方式)
- kubectl get secrets -n <命名空间> | grep "sh.helm.release.v1.your-custom-release-name"
- # 删除残留 Secret
- kubectl delete secret sh.helm.release.v1.your-custom-release-name.v1 -n <命名空间>
复制代码 4. 检察已摆设的 Release
- #列出所有 Release
- # helm list
- NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
- my-nginx default 3 2026-01-18 23:54:01.031035787 +0800 CST deployed my-minimal-nginx-0.1.0
- #查看 Release 详情
- # helm status my-nginx
- NAME: my-nginx
- LAST DEPLOYED: Sun Jan 18 23:54:01 2026
- NAMESPACE: default
- STATUS: deployed
- REVISION: 3
- TEST SUITE: None
复制代码 5. 升级 Release
- # 修改 values.yaml 后升级
- helm upgrade my-nginx bitnami/nginx -f values.yaml
- # 修改本地自定义Chart后升级
- # helm upgrade my-nginx-release ./my-minimal-nginx
- Release "my-nginx-release" has been upgraded. Happy Helming!
- NAME: my-nginx-release
- LAST DEPLOYED: Sun Jan 18 22:58:51 2026
- NAMESPACE: default
- STATUS: deployed
- REVISION: 2
- TEST SUITE: None
复制代码 6. 回滚 Release
- # 查看 Release 历史版本
- helm history my-nginx
- # 回滚到指定版本(如 revision 2)
- helm rollback my-nginx 2
复制代码 7. 卸载 Release
- # helm uninstall my-nginx
- release "my-nginx" uninstalled
复制代码 注意:如果Release不在默认名称空间下,则须要表现指定,如下:- helm uninstall my-nginx -n your_space_name
复制代码 免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金. |