Kubernetes Charts资源包管理工具之Heml学习总结
<h2 id="实践环境">实践环境</h2><p>registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.16</p>
<p>registry.cn-shanghai.aliyuncs.com/labring/helm:v3.8.2</p>
<h2 id="简介">简介</h2>
<p>Helm 是 <strong>Kubernetes 生态系统中最核心的包管理工具</strong>,被誉为“Kubernetes 的 apt/yum”,其设计目标是<strong>简化 Kubernetes 应用的部署、管理与分发</strong>,通过标准化的“包”格式(Chart)解决 Kubernetes 原生资源配置复杂、复用性差的痛点。</p>
<h3 id="一helm-的核心定位kubernetes-应用的包管理器">一、Helm 的核心定位:Kubernetes 应用的“包管理器”</h3>
<p>Helm 的本质是<strong>将 Kubernetes 应用的所有资源(Deployment、Service、ConfigMap、Secret 等)打包成一个可复用的“Chart”</strong>,并通过“Release”机制管理应用的生命周期(安装、升级、回滚、卸载)。其核心类比:</p>
<ul>
<li><strong>Chart</strong>:相当于 Linux 中的 <code>.deb</code>/<code>.rpm</code>包,或 Python 中的 <code>pip</code>包,包含应用运行所需的所有 Kubernetes 资源模板与默认配置;</li>
<li><strong>Release</strong>:相当于“安装后的应用实例”,每个 Chart 可在集群中安装多次,生成多个独立的 Release(如同一 MySQL Chart 可部署“开发库”与“测试库”两个 Release);</li>
<li><strong>Repository</strong>:相当于“应用商店”,用于存储与共享 Chart(如公共的 Artifact Hub,或企业内部私有仓库)。</li>
</ul>
<h3 id="二helm-的核心概念解析"><strong>二、Helm 的核心概念解析</strong></h3>
<p>要理解 Helm 的工作方式,必须掌握以下四个核心概念:</p>
<h4 id="1-chart应用的蓝图">1. <strong>Chart:应用的“蓝图”</strong></h4>
<p>Chart 是 Helm 的<strong>打包格式</strong>,用于将 Kubernetes 应用的资源模板与配置封装为一个可复用的单元。其目录结构如下:</p>
<pre><code class="language-markdown">my-chart/
├── Chart.yaml # 必须:Chart 的元数据(名称、版本、描述、依赖等)
├── values.yaml # 必须:默认配置值(如副本数、镜像标签、资源限制)
├── templates/ # 必须:Kubernetes 资源模板(带 Go 模板语法,如 deployment.yaml、service.yaml)
├── charts/ # 可选:依赖的子 Chart(如应用依赖的数据库 Chart)
└── README.md # 可选:Chart 的说明文档
</code></pre>
<ul>
<li><strong>templates/</strong>:存放带模板语法的 Kubernetes 资源文件,通过 <code>values.yaml</code>中的值动态渲染(如 <code>{{ .Values.replicaCount }}</code>会被替换为实际的副本数);</li>
<li><strong>values.yaml</strong>:提供模板的默认值,用户安装时可覆盖(如 <code>helm install --set replicaCount=3</code>)。</li>
</ul>
<h4 id="2-releasechart-的运行实例">2. <strong>Release:Chart 的“运行实例”</strong></h4>
<p>Release 是<strong>Chart 在 Kubernetes 集群中的具体运行实例</strong>。每执行一次 <code>helm install</code>,Helm 会根据 Chart 生成一个唯一的 Release(如 <code>my-nginx-release</code>),并记录其版本历史(通过 <code>helm history <release-name></code>查看)。Release 的核心特性:</p>
<ul>
<li><strong>唯一性</strong>:同一 Chart 可在同一集群中安装多次,每个 Release 有独立的名称与资源;</li>
<li><strong>版本管理</strong>:Helm 会记录每个 Release 的所有变更(如升级、回滚),支持一键回滚到任意历史版本(如 <code>helm rollback <release-name> 1</code>)。</li>
</ul>
<h4 id="3-repositorychart-的存储与共享中心">3. <strong>Repository:Chart 的“存储与共享中心”</strong></h4>
<p>Repository 是<strong>存储 Chart 的仓库</strong>,类似于 Docker Hub 或 PyPI。其核心作用是:</p>
<ul>
<li>
<p><strong>共享 Chart</strong>:公共 Repository(如 Artifact Hub)提供数千个现成的 Chart(如 Nginx、MySQL、Redis),用户可直接搜索并安装;</p>
</li>
<li>
<p><strong>私有部署</strong>:企业可搭建内部 Repository(如通过 Harbor 或 ChartMuseum),用于存储内部应用的 Chart,实现标准化分发。</p>
<p>Helm 支持添加多个 Repository(如 <code>helm repo add bitnami https://charts.bitnami.com/bitnami</code>),并通过 <code>helm repo update</code>同步最新 Chart 列表。</p>
</li>
</ul>
<h4 id="4-helm-client命令行工具">4. <strong>Helm Client:命令行工具</strong></h4>
<p>Helm Client 是<strong>用户与 Helm 交互的主要方式</strong>,通过命令行指令(如 <code>helm install</code>、<code>helm upgrade</code>、<code>helm rollback</code>)管理 Chart 与 Release。与 Kubernetes 原生的 <code>kubectl</code>不同,Helm Client 聚焦<strong>应用级别的管理</strong>(而非单个资源),例如:</p>
<ul>
<li><code>helm install my-nginx bitnami/nginx</code>:安装 Bitnami 提供的 Nginx Chart,生成名为 <code>my-nginx</code>的 Release;</li>
<li><code>helm upgrade my-nginx bitnami/nginx --set replicaCount=3</code>:升级 <code>my-nginx</code>的副本数为 3;</li>
<li><code>helm rollback my-nginx 1</code>:回滚 <code>my-nginx</code>到版本 1。</li>
</ul>
<h3 id="三helm-的核心价值解决-kubernetes-管理的痛点"><strong>三、Helm 的核心价值:解决 Kubernetes 管理的痛点</strong></h3>
<p>Kubernetes 原生部署应用需要编写大量 YAML 文件(如 Deployment、Service、ConfigMap),且需手动管理这些文件的版本、依赖与回滚,效率低且易出错。Helm 针对这些痛点提供了以下核心价值:</p>
<h4 id="1-简化部署流程">1. <strong>简化部署流程</strong></h4>
<p>通过 Chart 封装所有资源,用户只需执行一条命令(<code>helm install</code>)即可部署复杂应用(如包含前端、后端、数据库的微服务),无需手动创建多个 YAML 文件。</p>
<h4 id="2-标准化与复用">2. <strong>标准化与复用</strong></h4>
<p>Chart 将应用的资源配置标准化(如统一的目录结构、模板语法),企业可将内部应用的 Chart 存储在私有 Repository 中,实现跨部门复用(如“支付服务”Chart 可被多个业务线使用)。</p>
<h4 id="3-版本控制与回滚">3. <strong>版本控制与回滚</strong></h4>
<p>Helm 记录每个 Release 的所有变更(如升级时的配置修改),支持一键回滚到任意历史版本(如升级失败后回滚到稳定版本),降低生产环境的风险。</p>
<h4 id="4-依赖管理">4. <strong>依赖管理</strong></h4>
<p>Chart 可通过 <code>requirements.yaml</code>(Helm 2)或 <code>Chart.yaml</code>(Helm 3)声明依赖(如应用依赖 MySQL 数据库),Helm 会自动下载并安装依赖的 Chart,无需手动处理</p>
<h2 id="helm安装">Helm安装</h2>
<p>二进制安装</p>
<pre><code class="language-shell"># tar -zxvf helm-v4.0.0-linux-amd64.tar.gz
# mv linux-amd64/helm /usr/local/bin/helm
</code></pre>
<p>下载地址:https://github.com/helm/helm/releases</p>
<p>参考链接:https://helm.sh/docs/intro/install</p>
<p>镜像安装(基于sealos)</p>
<pre><code class="language-shell"># sealos run registry.cn-shanghai.aliyuncs.com/labring/helm:v3.8.2
</code></pre>
<p>说明:<strong>基于 OCI 镜像的安装方式</strong>,通过 Sealos 工具将预打包的 Helm v3.8.2 镜像部署到 Kubernetes 集群</p>
<h2 id="入门示例--nginx服务部署">入门示例--Nginx服务部署</h2>
<h3 id="chart资源包构造--极简版-bitnami-nginx-helm-chart">Chart资源包构造--极简版 Bitnami Nginx Helm Chart</h3>
<p>参考连接: https://github.com/bitnami/charts/tree/main/bitnami/nginx</p>
<h4 id="文件组织结构">文件组织结构</h4>
<pre><code class="language-markdown">my-minimal-nginx/
├── Chart.yaml # Chart 元数据
├── values.yaml # 可配置参数(Deployment/Service 核心配置)
└── templates/
├── deployment.yaml # Deployment 模板
└── service.yaml # Service 模板(暴露外部 IP)
</code></pre>
<h4 id="-1-chartyamlchart-元数据">📄 1. <code>Chart.yaml</code>(Chart 元数据)</h4>
<p>定义 Chart 名称、版本、描述等基础信息:</p>
<pre><code class="language-yaml">apiVersion: v2
name: my-minimal-nginx# Chart 名称(部署后资源会带此前缀)
description: A simplified Helm chart to deploy Nginx with NodePort
version: 0.1.0 # Chart 版本(语义化版本,便于迭代)
</code></pre>
<h4 id="-2-valuesyaml核心可配置参数">📄 2. <code>values.yaml</code>(核心可配置参数)</h4>
<p>存储 Deployment 和 Service 的<strong>默认配置</strong>(部署时可通过 <code>-f</code>覆盖):</p>
<pre><code class="language-yaml">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 自动分配
</code></pre>
<h4 id="-3-templatesdeploymentyamldeployment-模板">📄 3. <code>templates/deployment.yaml</code>(Deployment 模板)</h4>
<p>用 <strong>Go 模板语法</strong> 动态生成 Kubernetes Deployment YAML:</p>
<pre><code class="language-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 读取)
</code></pre>
<h4 id="-4-templatesserviceyamlservice-模板">📄 4. <code>templates/service.yaml</code>(Service 模板)</h4>
<p>用 Go 模板生成 Kubernetes Service YAML,实现<strong>外部 IP 暴露</strong>:</p>
<pre><code class="language-yaml">{{- /*
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 }}
</code></pre>
<h2 id="-部署--验证核心步骤">🔧 部署 & 验证(核心步骤)</h2>
<h4 id="1-部署到-kubernetes-集群">1. 部署到 Kubernetes 集群</h4>
<p>进入 <code>my-minimal-nginx</code>所在目录,执行 <code>helm install</code>:</p>
<pre><code class="language-bash"># 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
</code></pre>
<p><code>my-nginx</code>是<strong>本次部署的发布名</strong>(自定义,集群内唯一)。</p>
<h4 id="2-查看-service-状态确认-nodeport">2. 查看 Service 状态(确认 NodePort)</h4>
<p>部署完成后,执行以下命令查看 Service 状态(重点看 <code>EXTERNAL-IP</code>):</p>
<pre><code class="language-bash"># 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
</code></pre>
<h4 id="3-查看pod状态">3. 查看pod状态</h4>
<pre><code class="language-shell"># 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>
</code></pre>
<h4 id="4-访问验证">4. 访问验证</h4>
<p>!(images/k8s Charts资源包管理工具之Heml学习总结/image-20260118234921918.png)</p>
<h2 id="helm核心命令">Helm核心命令</h2>
<h3 id="1-添加-chart-仓库">1. 添加 Chart 仓库</h3>
<pre><code class="language-bash"># 添加官方仓库(推荐 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!⎈
</code></pre>
<h3 id="2-搜索-chart">2. 搜索 Chart</h3>
<pre><code class="language-bash"># 搜索 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...
</code></pre>
<h3 id="3-安装-chart">3. 安装 Chart</h3>
<pre><code class="language-bash"># 基础安装(使用默认配置)
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
</code></pre>
<p>说明:有时候执行卸载命令,再次安装时会报错:</p>
<pre><code>Error: INSTALLATION FAILED: cannot re-use a name that is still in use
</code></pre>
<p>此时执行<code>helm list -n <命名空间></code> 看不到对应名称的发布。</p>
<p>解决方法:</p>
<pre><code class="language-bash"># 查找残留的 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 <命名空间>
</code></pre>
<h3 id="4-查看已部署的-release">4. 查看已部署的 Release</h3>
<pre><code class="language-bash">#列出所有 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
</code></pre>
<h3 id="5-升级-release">5. 升级 Release</h3>
<pre><code class="language-bash"># 修改 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
</code></pre>
<h3 id="6-回滚-release">6. 回滚 Release</h3>
<pre><code class="language-bash"># 查看 Release 历史版本
helm history my-nginx
# 回滚到指定版本(如 revision 2)
helm rollback my-nginx 2
</code></pre>
<h3 id="7-卸载-release">7. 卸载 Release</h3>
<pre><code class="language-bash"># helm uninstall my-nginx
release "my-nginx" uninstalled
</code></pre>
<p>注意:如果Release不在默认名称空间下,则需要显示指定,如下:</p>
<pre><code class="language-shell">helm uninstall my-nginx -n your_space_name
</code></pre>
</div>
<div id="MySignature" role="contentinfo">
<div id="AllanboltSignature">
<p id="PSignature" style="border: #330066 1px dashed; padding: 5px 10px; font-family: 微软雅黑; font-size: 11px">
<span style="margin-left: 5px; font-weight: bold">作者:授客</span>
<br>
<span style="margin-left: 5px; font-weight: bold">微信/QQ:1033553122
<br>
<span style="margin-left: 5px; font-weight: bold">全国软件测试QQ交流群:7156436</span></span>
<br>
<span style="margin-left: 5px; font-weight: bold">Git地址:https://gitee.com/ishouke</span>
<br>
<span style="margin-left: 5px; font-weight: bold">友情提示:<span>限于时间仓促,文中可能存在错误,欢迎指正、评论!</span>
<br>
<span><span style="margin-left: 5px; font-weight: bold; color: red">作者五行缺钱,如果觉得文章对您有帮助,请扫描下边的二维码打赏作者,金额随意</span>,您的支持将是我继续创作的源动力,<span style="margin-left: 10px; font-weight: bold; color: red">打赏后如有任何疑问,请联系我!!!</span></span>
<br>
<span> 微信打赏
支付宝打赏 全国软件测试交流QQ群 <br>
<img src="https://www.cnblogs.com/images/cnblogs_com/shouke/1368383/t_%E5%BE%AE%E4%BF%A1%E6%94%B6%E6%AC%BE%E7%A0%81.bmp">
<img src="https://www.cnblogs.com/images/cnblogs_com/shouke/1368383/t_%E6%94%AF%E4%BB%98%E5%AE%9D%E6%94%B6%E6%AC%BE%E7%A0%81.bmp">
<img src="https://www.cnblogs.com/images/cnblogs_com/shouke/1368383/t_qq%E7%BE%A4.bmp">
</span></span></p>
</div><br><br>
来源:https://www.cnblogs.com/shouke/p/19561762
頁:
[1]