Kubernetes (K8s) 应用的部署往往涉及大量的 YAML 文件,管理和升级复杂。Helm 是 K8s 的包管理器,它通过 Chart 实现了应用定义的封装、版本控制和快速部署,极大地简化了 K8s 应用的管理流程,使其像在手机上安装 App 一样简单。
本文将聚焦于如何定制化 Helm Chart 包,并将其发布到一个可供团队使用的仓库中。
1. 环境准备
确保你已安装了 Helm 3 并配置了 K8s 集群访问权限。
# 检查 Helm 版本
helm version
# 确保 kubectl 可以连接到集群
kubectl cluster-info
2. 创建并探索基础 Chart
我们将创建一个名为 my-custom-nginx 的基础 Chart。
# 创建 Chart 骨架
helm create my-custom-nginx
cd my-custom-nginx
# 查看目录结构
tree -L 2
.
├── Chart.yaml
├── values.yaml
├── charts
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── ingress.yaml
│ ├── service.yaml
│ └── serviceaccount.yaml
└── tests
Chart 的核心在于 values.yaml(配置项)和 templates/ 目录下的 K8s 资源模板。
3. 定制化 Chart:配置与模板
定制化 Chart 的核心是修改 values.yaml 来暴露配置项,并在 templates/*.yaml 中使用 Go 模板语法引用这些配置。
3.1 修改 values.yaml
我们修改默认的 values.yaml,将 Nginx 的副本数设置为 3,并指定一个固定的镜像标签。
# my-custom-nginx/values.yaml
# 默认副本数为 3
replicaCount: 3
image:
repository: nginx
# 使用具体的版本标签
tag: 1.25.3
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
...
3.2 修改 deployment.yaml 引用配置
确保 deployment.yaml 正确引用了我们在 values.yaml 中设置的 replicaCount 和 image.tag。
# my-custom-nginx/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
...
spec:
# 引用 values.yaml 中的 replicaCount
replicas: {{ .Values.replicaCount }}
selector:
...
template:
spec:
containers:
- name: {{ .Chart.Name }}
# 引用 values.yaml 中的 image.repository 和 image.tag
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
...
3.3 本地测试渲染效果
在打包之前,可以通过 helm template 命令检查 Chart 渲染出的最终 YAML 文件,确保配置正确生效。
# 渲染并查看结果
helm template my-release . | grep -A 3 'replicas:'
# 预期输出:
# replicas: 3
# selector:
# matchLabels:
# app.kubernetes.io/name: my-custom-nginx
4. 打包和验证 Chart
当定制完成后,需要将 Chart 打包成一个 .tgz 文件。
# 检查 Chart 语法和结构是否合规
helm lint .
# 打包 Chart
helm package .
# 得到 Chart 包
ls *.tgz
# Output: my-custom-nginx-0.1.0.tgz
5. 发布 Chart 到仓库
为了让团队成员能够方便地访问和安装这个定制的 Chart,我们需要将其发布到一个 Helm 仓库。最简单和常用的方法之一是使用 HTTP 服务器或 GitHub Pages。
5.1 搭建本地 Helm 仓库
Helm 仓库的核心是一个包含所有 Chart 包和 index.yaml 文件(索引文件)的目录。
# 1. 创建仓库目录
mkdir helm-repo
# 2. 将打包好的 Chart 移动到仓库目录
mv my-custom-nginx-0.1.0.tgz helm-repo/
# 3. 生成索引文件 (index.yaml)。--url 指定了未来客户端访问该仓库的地址
cd helm-repo
helm repo index . --url https://my-organization.github.io/helm-charts/
# index.yaml 已生成,包含 Chart 的元数据
5.2 托管与发布
如果你使用 GitHub Pages,只需将 helm-repo 目录的内容推送到 GitHub Pages 分支即可。对于生产环境,可以使用 Artifact Hub、ChartMuseum 或 Amazon S3/Google Cloud Storage。
6. 使用已发布的 Chart
一旦 Chart 发布成功,任何拥有访问权限的用户都可以通过以下步骤安装它。
# 1. 添加新的仓库地址 (假设托管地址为 my-repo)
helm repo add my-repo https://my-organization.github.io/helm-charts/
# 2. 更新本地仓库缓存
helm repo update
# 3. 搜索新发布的 Chart
helm search repo my-repo/my-custom-nginx
# 4. 安装定制的 Chart
# 我们可以覆盖 values.yaml 中的默认配置
helm install prod-nginx my-repo/my-custom-nginx --set replicaCount=5
# 5. 验证部署
kubectl get deployments prod-nginx -o jsonpath='{.spec.replicas}'
# Output: 5
通过这种方式,我们成功地将复杂的 K8s 配置封装成一个可定制、可版本化、易于分享的“应用包”,极大地提升了部署效率和规范性。
汤不热吧