Kubernetes Chart 简单开发测试

k8s Chart简单开发测试

Kubernetes Chart(即 Helm Chart)是用于管理 Kubernetes 应用的打包格式。它类似于 Docker 镜像,封装了 Kubernetes 资源(Deployment、Service、Ingress 等)以及配置模板,使应用的部署和管理更加方便。以下是 Helm Chart 开发指南:


1. Helm Chart 基础

Helm 是 Kubernetes 的包管理工具,Helm Chart 是 Helm 的打包格式,包含 Kubernetes 资源的 YAML 模板。Helm Chart 主要由以下部分组成:

mychart/
│── charts/              # 依赖的子 Chart
│── templates/           # Kubernetes 资源模板文件
│   ├── deployment.yaml  # Deployment 资源
│   ├── service.yaml     # Service 资源
│   ├── _helpers.tpl     # 变量定义及模板函数
│   ├── ingress.yaml     # 可选,Ingress 资源
│   ├── NOTES.txt        # 安装后输出的提示信息
│── values.yaml          # 变量默认值
│── Chart.yaml           # Chart 元信息(名称、版本等)
│── README.md            # 说明文档

2. 编写 Chart

2.1 创建 Chart

使用 helm create 命令生成一个基本的 Helm Chart:

helm create mychart

生成的 Chart 目录结构如下:

mychart/
├── charts/
├── templates/
├── values.yaml
├── Chart.yaml
└── README.md

2.2 修改 Chart.yaml

Chart.yaml 定义了 Chart 的元信息:

apiVersion: v2
name: mychart
description: A Helm chart for deploying my application
type: application
version: 1.0.0
appVersion: "1.16.0"

2.3 编写 values.yaml

values.yaml 主要用于定义 Chart 的默认变量:

replicaCount: 3

image:
  repository: myregistry/myapp
  tag: latest
  pullPolicy: IfNotPresent

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: false
  hostname: myapp.local

2.4 编写 templates/deployment.yaml

Helm 使用 Go 模板语法({{ .Values }})动态生成 YAML 资源:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}
    spec:
      containers:
        - name: myapp
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - containerPort: 80

2.5 编写 templates/service.yaml

apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}
spec:
  type: {{ .Values.service.type }}
  selector:
    app: {{ .Release.Name }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: 80

3. 测试与调试

3.1 运行 Lint 检查

helm lint mychart

3.2 预览模板渲染

helm template mychart

3.3 安装 Chart

helm install myapp mychart

3.4 升级 Chart

修改 values.yaml 之后,可以执行:

helm upgrade myapp mychart

3.5 卸载 Chart

helm uninstall myapp

4. Helm Chart 进阶

4.1 使用 _helpers.tpl 定义通用变量

templates/_helpers.tpl 中定义公共标签:

{{- define "mychart.labels" -}}
app: {{ .Release.Name }}
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
{{- end }}

然后在 deployment.yaml 里引用:

metadata:
  labels:
    {{- include "mychart.labels" . | nindent 4 }}

4.2 添加 ConfigMap 和 Secret

ConfigMap (configmap.yaml)

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-config
data:
  ENV_VAR: "production"

Secret (secret.yaml)

apiVersion: v1
kind: Secret
metadata:
  name: {{ .Release.Name }}-secret
type: Opaque
data:
  password: {{ "my-secret-password" | b64enc }}

5. 依赖管理

5.1 添加子 Chart

Chart.yaml 里定义依赖:

dependencies:
  - name: redis
    version: "17.3.2"
    repository: "https://charts.bitnami.com/bitnami"

然后执行:

helm dependency update

6. Helm Chart 打包与发布

6.1 打包 Chart

helm package mychart

会生成 mychart-1.0.0.tgz

6.2 发布到 Helm 仓库

可以将 .tgz 文件上传到 S3、GCS 或 Helm 兼容的 Chart 仓库(如 ChartMuseum)。

本地搭建 ChartMuseum:

docker run -d -p 8080:8080 --name chartmuseum \
  -v $(pwd)/charts:/charts \
  -e STORAGE=local \
  -e STORAGE_LOCAL_ROOTDIR=/charts \
  chartmuseum/chartmuseum

推送 Chart:

helm push mychart-1.0.0.tgz oci://myregistry.com/helm-charts

7. 总结

  • helm create mychart 创建基础结构
  • values.yaml 定义默认变量
  • templates/ 目录编写 Kubernetes 资源模板
  • 使用 helm template 预览渲染结果
  • 通过 helm installhelm upgradehelm uninstall 部署和管理应用
  • 使用 _helpers.tpl 进行模板优化
  • 通过 dependencies 添加子 Chart
  • 通过 helm packagehelm push 发布 Chart
posted @ 2025-03-13 09:49  蒲公英PGY  阅读(72)  评论(0)    收藏  举报