Qingular

Helm 和 Kustomize

·CKAk8s练习

Helm 和 Kustomize 是 Kubernetes 生态中最常用的应用包管理和配置定制工具,用于简化应用部署和环境差异化管理。

← 返回 CKA 练习目录

概述

Helm 和 Kustomize 是 Kubernetes 中管理应用部署的两大工具。Helm 使用 Chart 作为包格式,支持模板化部署和版本管理;Kustomize 则通过 overlay 机制实现配置定制,无需模板。两者在 CKA 考试中虽然不是重点,但在实际工作中非常重要。


第一部分:Helm

1. Helm 基础概念

1.1 Helm 核心术语

术语说明
ChartHelm 包,包含部署应用所需的 YAML 模板和配置
ReleaseChart 在集群中的一次部署实例
RepositoryChart 存储仓库
Values传递给模板的配置值
Templates生成 Kubernetes 清单的 Go 模板文件

1.2 Chart 目录结构

mychart/
├── Chart.yaml          # Chart 元数据(名称、版本、描述)
├── values.yaml         # 默认配置值
├── values.schema.json  # values 的 JSON Schema 验证
├── charts/             # 子 Chart 依赖
├── crds/               # CRD 定义
├── templates/          # Kubernetes 清单模板
│   ├── NOTES.txt       # 安装后的使用说明
│   ├── _helpers.tpl    # 模板辅助函数
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   └── hpa.yaml
└── README.md

2. Helm 安装与仓库管理

# 安装 Helm
# Linux
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# macOS
brew install helm

# Windows (choco)
choco install kubernetes-helm

# 验证安装
helm version

# 添加 Helm 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo add jetstack https://charts.jetstack.io

# 更新仓库
helm repo update

# 列出仓库
helm repo list

# 搜索 Chart
helm search hub nginx                 # Artifact Hub 搜索
helm search repo nginx                # 本地仓库搜索
helm search repo bitnami/nginx --versions  # 列出所有版本

# 查看 Chart 信息
helm show chart bitnami/nginx
helm show values bitnami/nginx
helm show readme bitnami/nginx
helm show all bitnami/nginx

3. Helm 基本操作

3.1 安装与卸载

# 安装 Chart(创建 Release)
helm install my-nginx bitnami/nginx

# 指定命名空间安装
helm install my-nginx bitnami/nginx --namespace my-namespace --create-namespace

# 使用自定义 values 文件安装
helm install my-nginx bitnami/nginx -f custom-values.yaml

# 直接设置 values
helm install my-nginx bitnami/nginx --set replicaCount=3 --set service.type=NodePort

# 从本地 Chart 安装
helm install my-app ./mychart/

# 安装前模拟(dry-run)
helm install my-nginx bitnami/nginx --dry-run --debug

# 卸载 Release
helm uninstall my-nginx
helm uninstall my-nginx --namespace my-namespace

# 查看已安装的 Release
helm list
helm list --all-namespaces
helm list -n my-namespace

3.2 升级与回滚

# 升级 Release
helm upgrade my-nginx bitnami/nginx

# 升级并指定新 values
helm upgrade my-nginx bitnami/nginx --set replicaCount=5
helm upgrade my-nginx bitnami/nginx -f new-values.yaml

# 升级前模拟
helm upgrade my-nginx bitnami/nginx --dry-run --debug

# 检查升级状态
helm status my-nginx

# 查看 Release 历史
helm history my-nginx

# 回滚到上一版本
helm rollback my-nginx

# 回滚到指定版本
helm rollback my-nginx 1

# 查看 Release 版本差异
helm get manifest my-nginx --revision 1 > v1.yaml
helm get manifest my-nginx --revision 2 > v2.yaml
diff v1.yaml v2.yaml

3.3 Release 信息查看

# 获取 Release 状态
helm status my-nginx

# 获取渲染后的清单
helm get manifest my-nginx

# 获取 values
helm get values my-nginx

# 获取所有信息
helm get all my-nginx

# 获取 NOTES.txt 内容
helm get notes my-nginx

# 获取指定版本的清单
helm get manifest my-nginx --revision 2

4. values.yaml 定制

4.1 values 覆盖优先级

--set 指定值 > --set-file/--set-string > -f values 文件 > values.yaml 默认值

4.2 values 文件示例

# my-values.yaml
replicaCount: 3

image:
  repository: nginx
  tag: "1.25"
  pullPolicy: IfNotPresent

service:
  type: NodePort
  port: 80

ingress:
  enabled: true
  hostname: example.com

resources:
  limits:
    cpu: 500m
    memory: 512Mi
  requests:
    cpu: 250m
    memory: 256Mi

persistence:
  enabled: true
  size: 8Gi
# 使用 values 文件安装
helm install my-nginx bitnami/nginx -f my-values.yaml

# 多个 values 文件合并
helm install my-nginx bitnami/nginx -f base.yaml -f production.yaml

# 设置复杂值
helm install my-nginx bitnami/nginx \
    --set replicaCount=3 \
    --set image.tag="1.25" \
    --set service.type=ClusterIP \
    --set ingress.enabled=true \
    --set ingress.hostname=myapp.example.com

5. Chart 创建与管理

# 创建 Chart
helm create mychart

# 打包 Chart
helm package mychart/

# 验证 Chart 语法
helm lint mychart/

# 查看 Chart 依赖
helm dependency list mychart/

# 更新 Chart 依赖
helm dependency update mychart/

# 将 Chart 推送到仓库
helm push mychart-0.1.0.tgz my-repo

第二部分:Kustomize

6. Kustomize 基础

Kustomize 从 Kubernetes 1.14 开始内置在 kubectl 中,通过 kubectl apply -k 直接使用。

6.1 Kustomize 核心概念

概念说明
kustomization.yamlKustomize 配置文件(必需)
base基础配置目录
overlay环境覆盖配置(dev/staging/prod)
patch对资源的局部修改
transformer全局修改(labels/annotations/names 等)
generator动态生成资源(ConfigMap/Secret)

6.2 典型目录结构

project/
├── base/
│   ├── kustomization.yaml
│   ├── deployment.yaml
│   ├── service.yaml
│   └── hpa.yaml
├── overlays/
│   ├── dev/
│   │   ├── kustomization.yaml
│   │   ├── patch-replicas.yaml
│   │   └── configmap-dev.yaml
│   ├── staging/
│   │   ├── kustomization.yaml
│   │   └── patch-resources.yaml
│   └── production/
│       ├── kustomization.yaml
│       ├── patch-ingress.yaml
│       └── secret-generator.yaml

7. Kustomize 典型用法

7.1 base/kustomization.yaml

# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

# 引用的资源文件
resources:
- deployment.yaml
- service.yaml
- hpa.yaml

# 给所有资源统一添加标签
commonLabels:
  app: my-app
  managed-by: kustomize

# 给所有资源统一添加注解
commonAnnotations:
  environment: base
  project: my-project

# 命名空间
namespace: my-namespace

# 名称前缀
namePrefix: myapp-

7.2 overlays/dev/kustomization.yaml

# overlays/dev/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

# 继承 base
resources:
- ../../base

# 名称后缀
nameSuffix: -dev

# 环境标签
commonLabels:
  env: dev

# 补丁(Patches)
patches:
# 战略合并补丁
- path: patch-replicas.yaml
  target:
    kind: Deployment
    name: my-app

# JSON 补丁(6902 格式)
- patch: |-
    - op: replace
      path: /spec/replicas
      value: 1
  target:
    kind: Deployment
    name: my-app

# 替换镜像
images:
- name: nginx
  newName: myregistry.io/myapp
  newTag: dev-latest

# 生成 ConfigMap
configMapGenerator:
- name: app-config
  literals:
  - ENV=dev
  - LOG_LEVEL=debug
  files:
  - configs/app.properties

# 生成 Secret
secretGenerator:
- name: app-secret
  literals:
  - DB_PASSWORD=dev-password
  type: Opaque

7.3 patches 示例

# overlays/dev/patch-replicas.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
  template:
    spec:
      containers:
      - name: app
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 200m
            memory: 256Mi
# overlays/production/patch-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
  - hosts:
    - app.example.com
    secretName: app-tls
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-app-service
            port:
              number: 80

8. Kustomize 命令

# 构建并输出 YAML
kubectl kustomize base/
kubectl kustomize overlays/dev/
kustomize build overlays/production/

# 应用配置
kubectl apply -k base/
kubectl apply -k overlays/dev/

# 删除配置
kubectl delete -k overlays/dev/

# 查看差异
kubectl diff -k overlays/dev/

# 构建并保存到文件
kubectl kustomize overlays/production/ > production-manifest.yaml
kubectl apply -f production-manifest.yaml

9. Helm vs Kustomize 对比

特性HelmKustomize
概念包管理器(Chart)配置定制(Overlay)
模板Go 模板(template)无模板(原生 YAML)
版本管理内置(Release 版本)需配合 Git
回滚helm rollbackRollback via Git
参数化values.yaml + --setpatches + generators
学习曲线较陡(模板语法)较平缓(纯 YAML)
依赖管理支持子 Chart不支持(需要用 Helm)
共享Helm Hub / ArtifactHub需 Git 仓库
内置 kubectl否(需要 helm 命令)是(kubectl apply -k)
最佳场景第三方应用部署内部应用环境管理

选择建议

# 适合用 Helm 的场景:
# - 部署第三方/社区应用(nginx-ingress, prometheus, cert-manager)
# - 需要版本管理和回滚的应用
# - 需要参数化部署的复杂应用

# 适合用 Kustomize 的场景:
# - 管理多个环境(dev/staging/prod)的配置差异
# - 团队偏好纯 YAML 而非模板
# - 已有大量原生 Kubernetes YAML 文件
# - 需要与 CI/CD 管道集成

10. 日常操作快速参考

# --- Helm 速查 ---
helm repo add <name> <url>
helm repo update
helm search repo <keyword>
helm install <release> <chart> -f values.yaml --set key=value
helm upgrade <release> <chart> -f new-values.yaml
helm rollback <release> <revision>
helm uninstall <release>
helm list
helm history <release>

# --- Kustomize 速查 ---
kustomize build overlays/prod/ > output.yaml
kubectl apply -k overlays/dev/
kubectl diff -k overlays/prod/
kubectl delete -k overlays/staging/

CKA 考试要点

  1. Helm 和 Kustomize 在 CKA 中占比很小 -- 但基础知识仍然需要
  2. 知道 Helm 三大概念:Chart、Release、Repository
  3. 知道 Kustomize 两大概念:Base、Overlay
  4. 会用 helm install/upgrade/rollback/uninstall
  5. 会用 kubectl apply -kkustomize build
  6. 能看懂基本的 kustomization.yaml

🧪 完整操作实例:用 Helm 安装 Nginx,用 Kustomize 定制配置

场景描述

使用 Helm 安装 bitnami/nginx Chart,然后使用 Kustomize 创建一个 overlay 对 Deployment 配置进行定制(修改副本数和资源限制)。

前置条件

  • 已安装 Helm v3
  • 集群正常运行
  • kubectl 已配置并可正常访问集群

操作步骤

Step 1: 添加 Helm 仓库并安装 nginx

# 添加 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

# 安装 nginx
helm install my-nginx bitnami/nginx -n default
# NAME: my-nginx
# LAST DEPLOYED: Tue May 27 10:00:00 2026
# NAMESPACE: default
# STATUS: deployed
# REVISION: 1

Step 2: 查看 Helm Release

# 查看已安装的 Release
helm list
# NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART
# my-nginx        default         1               2026-05-27 10:00:00                      deployed        nginx-xx.x.x

# 查看渲染后的 YAML
helm get manifest my-nginx

# 查看 Release 状态
helm status my-nginx

Step 3: 创建 Kustomize 目录结构

# 创建 kustomize 工作目录
mkdir -p ~/kustomize-nginx/base
mkdir -p ~/kustomize-nginx/overlays/production

Step 4: 创建 base kustomization.yaml

cat <<'EOF' > ~/kustomize-nginx/base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
commonLabels:
  app: my-nginx
  managed-by: kustomize
namespace: default
EOF

Step 5: 导出 Helm Deployment 和 Service 作为 base

# 从 Helm Release 导出 YAML 作为 base
helm get manifest my-nginx > ~/kustomize-nginx/base/deployment.yaml
# 或使用 kubectl 导出
kubectl get deployment my-nginx -n default -o yaml --export > ~/kustomize-nginx/base/deployment.yaml 2>/dev/null
kubectl get service my-nginx -n default -o yaml --export > ~/kustomize-nginx/base/service.yaml 2>/dev/null

Step 6: 创建 production overlay

# 创建副本数补丁
cat <<'EOF' > ~/kustomize-nginx/overlays/production/patch-replicas.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 5
  template:
    spec:
      containers:
      - name: nginx
        resources:
          requests:
            cpu: 500m
            memory: 512Mi
          limits:
            cpu: 1
            memory: 1Gi
EOF

# 创建 overlay kustomization.yaml
cat <<'EOF' > ~/kustomize-nginx/overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patches:
- path: patch-replicas.yaml
  target:
    kind: Deployment
    name: my-nginx
nameSuffix: -prod
commonLabels:
  environment: production
EOF

Step 7: 应用 Kustomize overlay

# 预览 Kustomize 构建结果
kubectl kustomize ~/kustomize-nginx/overlays/production/
# ... 查看生成的 YAML(副本数为 5,增加了资源限制)

# 应用 Kustomize 配置
kubectl apply -k ~/kustomize-nginx/overlays/production/
# deployment.apps/my-nginx-prod created
# service/my-nginx-prod created

验证结果

# 验证 Deployment
kubectl get deployment
# NAME              READY   UP-TO-DATE   AVAILABLE   AGE
# my-nginx          1/1     1            1           5m
# my-nginx-prod     5/5     5            5           30s

# 验证副本数
kubectl get deployment my-nginx-prod -o jsonpath='{.spec.replicas}'
# 5

# 验证资源限制
kubectl get deployment my-nginx-prod -o json | jq '.spec.template.spec.containers[0].resources'
# {
#   "limits": { "cpu": "1", "memory": "1Gi" },
#   "requests": { "cpu": "500m", "memory": "512Mi" }
# }

# 验证标签
kubectl get deployment my-nginx-prod --show-labels
# NAME              ...   LABELS
# my-nginx-prod     ...   app=my-nginx,environment=production,managed-by=kustomize

考试提示

  • Helm 和 Kustomize 在 CKA 中占比很小,但要知道基本用法
  • Helm 安装主要记住 helm repo addhelm installhelm listhelm uninstall
  • Kustomize 内置在 kubectl 中,用 kubectl apply -kkubectl kustomize 即可
  • 学会 helm get manifest 将 Helm Release 导出为 YAML,再用 Kustomize 定制
  • kubectl kustomize <dir> 只输出 YAML 到标准输出,不会实际应用到集群

官方文档