欢迎光临
我们一直在努力

利用 Helm 像管理 App 一样管理 K8s 应用:详解 Chart 包的定制与发布

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 中设置的 replicaCountimage.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 配置封装成一个可定制、可版本化、易于分享的“应用包”,极大地提升了部署效率和规范性。

【本站文章皆为原创,未经允许不得转载】:汤不热吧 » 利用 Helm 像管理 App 一样管理 K8s 应用:详解 Chart 包的定制与发布
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址