qidao123.com ToB IT社区-企服评测·应用市场

 找回密码
 立即注册

Kubernetes Charts资源包管理工具之Heml学习总结

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
实践环境

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 应用的资源模板与设置封装为一个可复用的单位。其目次结构如下:
  1. my-chart/
  2. ├── Chart.yaml          # 必须:Chart 的元数据(名称、版本、描述、依赖等)
  3. ├── values.yaml         # 必须:默认配置值(如副本数、镜像标签、资源限制)
  4. ├── templates/          # 必须:Kubernetes 资源模板(带 Go 模板语法,如 deployment.yaml、service.yaml)
  5. ├── charts/             # 可选:依赖的子 Chart(如应用依赖的数据库 Chart)
  6. └── 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安装

二进制安装
  1. # tar -zxvf helm-v4.0.0-linux-amd64.tar.gz
  2. # mv linux-amd64/helm /usr/local/bin/helm
复制代码
下载地点:https://github.com/helm/helm/releases
参考链接:https://helm.sh/docs/intro/install
镜像安装(基于sealos)
  1. # 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
文件构造结构
  1. my-minimal-nginx/
  2. ├── Chart.yaml          # Chart 元数据
  3. ├── values.yaml         # 可配置参数(Deployment/Service 核心配置
  4. └── templates/
  5.     ├── deployment.yaml # Deployment 模板
  6.     └── service.yaml    # Service 模板(暴露外部 IP)
复制代码
📄 1. Chart.yaml(Chart 元数据)

界说 Chart 名称、版本、形貌等根本信息:
  1. apiVersion: v2
  2. name: my-minimal-nginx  # Chart 名称(部署后资源会带此前缀)
  3. description: A simplified Helm chart to deploy Nginx with NodePort
  4. version: 0.1.0          # Chart 版本(语义化版本,便于迭代)
复制代码
📄 2. values.yaml(焦点可设置参数)

存储 Deployment 和 Service 的默认设置(摆设时可通过 -f覆盖):
  1. image:
  2.   repository: nginx       # Nginx 镜像仓库(用 Docker Hub 官方镜像,简化依赖)
  3.   tag: latest             # 镜像标签(版本)
  4. replicaCount: 1           # Nginx Pod 副本数(高可用,可按需调整)
  5. service:
  6.   type: NodePort          # 服务类型改为 NodePort
  7.   port: 80                # Service 对外暴露的逻辑端口(集群内/外访问统一用 80)
  8.   targetPort: 80          # 转发到 Nginx Pod 的端口
  9.   nodePort: 30080         # (可选)指定节点上的端口,范围 30000-32767;不填则 K8s 自动分配
复制代码
📄 3. templates/deployment.yaml(Deployment 模板)

Go 模板语法 动态天生 Kubernetes Deployment YAML:
  1. {{- /*
  2.   deployment.yaml:定义 Nginx Deployment 资源
  3.   模板逻辑:通过 {{ .Values.XXX }} 读取 values.yaml 配置,通过 {{ .Chart.XXX }}读取Chart.yaml配置,动态生成 YAML
  4. - */ -}}
  5. apiVersion: apps/v1
  6. kind: Deployment
  7. metadata:
  8.   name: {{ .Release.Name }}-deployment  # 资源名 = 发布名 + 固定后缀
  9.   labels:
  10.     app: {{ .Chart.Name }}                    # 标签:关联 Chart 名称(my-minimal-nginx)
  11. spec:
  12.   replicas: {{ .Values.replicaCount }}        # 副本数(从 values.yaml 读取)
  13.   selector:
  14.     matchLabels:
  15.       app: {{ .Chart.Name }}                  # Selector:匹配 Pod 标签(必须和 Pod 模板一致)
  16.   template:
  17.     metadata:
  18.       labels:
  19.         app: {{ .Chart.Name }}                # Pod 标签(必须和 selector.matchLabels 一致)
  20.     spec:
  21.       containers:
  22.       - name: nginx-container                 # 容器
  23.         image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"  # 镜像地址(仓库 + 标签)
  24.         ports:
  25.         - containerPort: {{ .Values.service.targetPort }}  # 容器暴露的端口(从 values.yaml 读取)
复制代码
📄 4. templates/service.yaml(Service 模板)

用 Go 模板天生 Kubernetes Service YAML,实现外部 IP 袒露
  1. {{- /*
  2.   service.yaml:定义 Service 资源,支持 NodePort/LoadBalancer 暴露
  3.   - NodePort:通过节点 IP + nodePort 访问(如 192.168.88.139:30080)
  4.   - LoadBalancer:通过云厂商负载均衡器 IP 访问
  5. - */ -}}
  6. apiVersion: v1
  7. kind: Service
  8. metadata:
  9.   name: {{ .Release.Name }}-service   # 服务名 = 发布名 + 固定后缀
  10.   labels:
  11.     app: {{ .Chart.Name }}                  # 标签:关联 Chart 名称
  12. spec:
  13.   type: {{ .Values.service.type }}          # 服务类型(从 values.yaml 读取:NodePort/LoadBalancer)
  14.   selector:
  15.     app: {{ .Chart.Name }}                  # 关联 Pod 标签(必须和 Deployment 模板的 labels 一致)
  16.   ports:
  17.   - protocol: TCP
  18.     port: {{ .Values.service.port }}        # Service 逻辑端口(集群内访问用)
  19.     targetPort: {{ .Values.service.targetPort }}  # 转发到 Pod 的端口
  20.     {{- if eq .Values.service.type "NodePort" }}  # 仅 NodePort 类型时添加 nodePort 字段
  21.     nodePort: {{ .Values.service.nodePort }}    # 节点上暴露的端口(范围 30000-32767,可选配置)
  22.     {{- end }}
复制代码
🔧 摆设 & 验证(焦点步调)

1. 摆设到 Kubernetes 集群

进入 my-minimal-nginx所在目次,实行 helm install:
  1. # helm install my-nginx ./my-minimal-nginx
  2. NAME: my-nginx-release
  3. LAST DEPLOYED: Sun Jan 18 22:44:32 2026
  4. NAMESPACE: default
  5. STATUS: deployed
  6. REVISION: 1
  7. TEST SUITE: None
复制代码
my-nginx是本次摆设的发布(自界说,集群内唯一)。
2. 检察 Service 状态(确认 NodePort)

摆设完成后,实行以下下令检察 Service 状态(重点看 EXTERNAL-IP):
  1. # kubectl get svc -A
  2. NAMESPACE     NAME               TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                  AGE
  3. default       kubernetes         ClusterIP   10.96.0.1     <none>        443/TCP                  35h
  4. default       my-nginx-service   NodePort    10.96.2.4     <none>        80:30080/TCP             57s
  5. kube-system   hubble-peer        ClusterIP   10.96.2.226   <none>        443/TCP                  35h
  6. kube-system   kube-dns           ClusterIP   10.96.0.10    <none>        53/UDP,53/TCP,9153/TCP   35h
  7. # kubectl get svc my-nginx-service
  8. NAME                             TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
  9. my-nginx-service   NodePort   10.96.0.178   <none>        80:30080/TCP   3m47s
复制代码
3. 检察pod状态
  1. # kubectl get pod -o wide
  2. NAME                                  READY   STATUS    RESTARTS   AGE     IP          NODE             NOMINATED NODE   READINESS GATES
  3. my-nginx-deployment-ff65df8fb-j6ct7   1/1     Running   0          2m25s   10.0.1.54   192-168-88-140   <none>           <none>
复制代码
4. 访问验证

![image-20260118234921918](images/k8s Charts资源包管理工具之Heml学习总结/image-20260118234921918.png)
Helm焦点下令

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录

QQ|手机版|qidao123.com IT社区;IT企服评测▪应用市场 ( 浙ICP备20004199|浙ICP备20004199号 )|网站地图

GMT+8, 2026-2-8 16:01 , Processed in 0.247572 second(s), 30 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表