Helm Chart 构建器

helm-chart-builder
分类编程
作者Alireza Rezvani
许可MIT
评分4.70/5
使用2.0K

Helm Chart Builder

> 生产级 Helm charts。合理的默认值。原生安全设计。拒绝盲目跟风。

一套具有主见的 Helm 工作流,旨在将临时的 Kubernetes 清单转换为可维护、可测试且可复用的 charts。涵盖 chart 结构、values 设计、模板模式、依赖管理和安全加固。

这不是一份 Helm 教程,而是一套关于如何构建“运维信任、开发不反感”的 charts 的具体决策方案。

---

斜杠命令 (Slash Commands)

| 命令 | 功能 |
|---------|-------------|
| /helm:create | 按照最佳实践结构搭建生产就绪的 Helm chart 脚手架 |
| /helm:review | 分析现有 chart 的问题 —— 如缺失标签、硬编码值、模板反模式 |
| /helm:security | 审计 chart 的安全性 —— RBAC、网络策略、Pod 安全、Secret 处理 |

---

技能激活时机

识别用户输入中的以下模式:

  • "为这个服务创建 Helm chart"
  • "评审我的 Helm chart"
  • "这个 chart 安全吗?"
  • "设计一个 values.yaml"
  • "添加子 chart 依赖"
  • "设置 helm 测试"
  • "[工作负载类型] 的 Helm 最佳实践"
  • 任何涉及以下内容的请求:Helm chart, values.yaml, Chart.yaml, templates, helpers, _helpers.tpl, subcharts, helm lint, helm test

如果用户拥有 Helm chart 或希望将 Kubernetes 资源打包 $\rightarrow$ 激活此技能。

---

工作流

/helm:create — Chart 脚手架搭建

1. 识别工作负载类型
- Web 服务 (Deployment + Service + Ingress)
- Worker (Deployment, 无 Service)
- CronJob (CronJob + ServiceAccount)
- 有状态服务 (StatefulSet + PVC + Headless Service)
- 库 chart (无模板,仅包含 helpers)

2. 搭建 chart 结构

code
mychart/
   ├── Chart.yaml              # Chart 元数据和依赖
   ├── values.yaml             # 默认配置
   ├── values.schema.json      # 可选:用于 values 验证的 JSON Schema
   ├── .helmignore             # 排除在打包之外的文件
   ├── templates/
   │   ├── _helpers.tpl        # 命名模板和助手函数
   │   ├── deployment.yaml     # 工作负载资源
   │   ├── service.yaml        # 服务暴露
   │   ├── ingress.yaml        # Ingress (如果适用)
   │   ├── serviceaccount.yaml # ServiceAccount
   │   ├── hpa.yaml            # HorizontalPodAutoscaler
   │   ├── pdb.yaml            # PodDisruptionBudget
   │   ├── networkpolicy.yaml  # NetworkPolicy
   │   ├── configmap.yaml      # ConfigMap (如果需要)
   │   ├── secret.yaml         # Secret (如果需要)
   │   ├── NOTES.txt           # 安装后的使用说明
   │   └── tests/
   │       └── test-connection.yaml
   └── charts/                 # 子 chart (依赖)

3. 应用 Chart.yaml 最佳实践

code
元数据
   ├── apiVersion: v2 (仅限 Helm 3 —— 绝不要用 v1)
   ├── name: 与目录名称完全一致
   ├── version: se
mver (Chart 版本,而非 App 版本) ├── appVersion: 应用程序版本字符串 ├── description: Chart 部署内容的单行摘要 └── type: application (或用于共享辅助函数的 library)

依赖管理 (DEPENDENCIES)
├── 使用 ~X.Y.Z (补丁级浮点数) 固定依赖版本
├── 使用 condition 字段使子 Chart 变为可选
├── 使用 alias 为同一子 Chart 的多个实例创建别名
└── 修改后运行 helm dependency update

code
4. 生成带有文档的 values.yaml
- 每个值都应有解释用途和类型的行内注释
- 提供适用于开发环境的合理默认值
- 易于覆盖的结构(尽可能扁平,仅在逻辑必要时嵌套)
- 不包含硬编码的集群特定值(如镜像仓库、域名、存储类)

5. 验证

bash
python3 scripts/chart_analyzer.py mychart/
helm lint mychart/
helm template mychart/ --debug
code
### /helm:review — Chart 分析

1. 检查 Chart 结构

| 检查项 | 严重程度 | 修复方案 |
|-------|----------|-----|
| 缺失 _helpers.tpl | 高 | 为通用标签和选择器创建 helpers |
| 缺失 NOTES.txt | 中 | 添加安装后的操作指南 |
| 缺失 .helmignore | 低 | 创建该文件以排除 .git、CI 文件和测试文件 |
| Chart.yaml 字段缺失 | 中 | 添加 description, appVersion, maintainers |
| 模板中存在硬编码值 | 高 | 提取到 values.yaml 并设置默认值 |

2. 检查模板质量

| 检查项 | 严重程度 | 修复方案 |
|-------|----------|-----|
| 缺失标准标签 | 高 | 通过 _helpers.tpl 使用 app.kubernetes.io/* 标签 |
| 缺失资源请求/限制 (requests/limits) | 紧急 | 在 values.yaml 中添加带有默认值的 resources 部分 |
| 硬编码镜像标签 | 高 | 使用 {{ .Values.image.repository }}:{{ .Values.image.tag }} |
| 缺失 imagePullPolicy | 中 | 默认为 IfNotPresent 且可覆盖 |
| 缺失存活/就绪探针 (liveness/readiness probes) | 高 | 添加路径和端口可配置的探针 |
| 缺失 Pod 反亲和性 (anti-affinity) | 中 | 为实现高可用 (HA) 添加首选反亲和性 |
| 模板代码重复 | 中 | 提取到 _helpers.tpl 的命名模板中 |

3. 检查 values.yaml 质量

bash
python3 scripts/values_validator.py mychart/values.yaml
code
4. 生成评审报告

HELM CHART REVIEW — [chart name]
日期: [timestamp]

紧急 (CRITICAL): [count]
高 (HIGH): [count]
中 (MEDIUM): [count]
低 (LOW): [count]

[详细发现及修复建议]

code
### /helm:security — 安全审计

1. Pod 安全审计

| 检查项 | 严重程度 | 修复方案 |
|-------|----------|-----|
| 缺失 securityContext | 紧急 | 添加 runAsNonRoot, readOnlyRootFilesystem |
| 以 root 身份运行 | 紧急 | 设置 runAsNonRoot: true, runAsUser: 1000 |
| 根文件系统可写 | 高 | 设置 readOnlyRootFilesystem: true 并为 tmp 分配 emptyDir |
| 保留所有 Capabilities | 高 | 丢弃 (Drop) ALL,仅添加必要的特定能力 |
| 特权容器 (Privileged) | 紧急 | 设置 privileged: false,使用特定能力 |
| 缺失 seccomp 配置 | 中 | 设置 seccompProfile.type: RuntimeDefault |
| allowPrivilegeEscalation 为 true | 高 | 设置 allowPrivilegeEscalation: false |

2. RBAC 审计

| 检查项 | 严重程度 | 修复方案 |
|-------|----------|-----|
| 缺失 ServiceAccount | 中 | 创建专用 SA,不要使用 default |
| automountServiceAccountToken 为 true | 中 | 除非 Pod 需要访问 K8s API,否则设为 false |
| 使用 ClusterRole 代替 Role | 中 |
除非需要集群范围权限,否则请使用命名空间范围的 Role |
| 通配符权限 | 严重 | 使用具体的资源名称和谓词 (verbs) |
| 完全没有 RBAC | 低 | 如果 Pod 不需要访问 K8s API 则可接受 |

3. 网络与密钥审计

| 检查项 | 严重程度 | 修复方案 |
|-------|----------|-----|
| 无 NetworkPolicy | 中 | 添加默认拒绝 (default-deny) 入站规则 + 明确的允许规则 |
| Secrets 存在于 values.yaml 中 | 严重 | 使用 external secrets operator 或 sealed-secrets |
| 无 PodDisruptionBudget | 中 | 为高可用 (HA) 工作负载添加带有 minAvailable 的 PDB |
| hostNetwork: true | 高 | 除非绝对必要(如 CNI 插件),否则请移除 |
| hostPID 或 hostIPC | 严重 | 严禁在应用 Chart 中使用 |

4. 生成安全报告


安全审计 — [chart 名称]
日期: [时间戳]

严重 (CRITICAL): [数量]
高 (HIGH): [数量]
中 (MEDIUM): [数量]
低 (LOW): [数量]

[详细发现及修复步骤]

code
---

工具链

scripts/chart_analyzer.py

用于 Helm Chart 目录静态分析的 CLI 工具。

功能:

  • Chart 结构验证(必需文件、目录布局)

  • 模板反模式检测(硬编码值、缺失标签、无资源限制)

  • Chart.yaml 元数据检查

  • 标准标签验证 (app.kubernetes.io/*)

  • 安全基线检查

  • 支持 JSON 和文本输出

用法:

bash

分析 Chart 目录


python3 scripts/chart_analyzer.py mychart/

JSON 输出

python3 scripts/chart_analyzer.py mychart/ --output json

侧重安全分析

python3 scripts/chart_analyzer.py mychart/ --security
code
### scripts/values_validator.py

用于根据最佳实践验证 values.yaml 的 CLI 工具。

功能:

  • 文档覆盖率检查(行内注释)

  • 类型一致性检查

  • 硬编码密钥检测

  • 默认值质量分析

  • 结构深度分析

  • 命名规范验证

  • 支持 JSON 和文本输出

用法:

bash

验证 values.yaml


python3 scripts/values_validator.py values.yaml

JSON 输出

python3 scripts/values_validator.py values.yaml --output json

严格模式(警告即失败)

python3 scripts/values_validator.py values.yaml --strict
code
---

模板模式

模式 1:标准标签 (_helpers.tpl)

yaml {{/* 所有资源的通用标签。 */}} {{- define "mychart.labels" -}} helm.sh/chart: {{ include "mychart.chart" . }} app.kubernetes.io/name: {{ include "mychart.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} app.kubernetes.io/managed-by: {{ .Release.Service }} {{- end }}

{{/*
选择器标签(通用标签的子集 — 必须不可变)。
*/}}
{{- define "mychart.selectorLabels" -}}
app.kubernetes.io/name: {{ include "mychart.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}

code
### 模式 2:条件资源
yaml
{{- if .Values.ingress.enabled -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ include "mychart.fullname" . }}
labels:
{{- include "mychart.labels" . | nindent 4 }}
{{- with .Values.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
{{- range .Values.ingress.hosts }}
- ho
code
st: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ .path }}
pathType: {{ .pathType }}
backend:
service:
name: {{ include "mychart.fullname" $ }}
port:
number: {{ $.Values.service.port }}
{{- end }}
{{- end }}
{{- end }}

模式 3:安全加固的 Pod 规范 (Pod Spec)

yaml
spec:
  serviceAccountName: {{ include "mychart.serviceAccountName" . }}
  automountServiceAccountToken: false
  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    fsGroup: 1000
    seccompProfile:
      type: RuntimeDefault
  containers:
    - name: {{ .Chart.Name }}
      securityContext:
        allowPrivilegeEscalation: false
        readOnlyRootFilesystem: true
        capabilities:
          drop:
            - ALL
      image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
      imagePullPolicy: {{ .Values.image.pullPolicy }}
      resources:
        {{- toYaml .Values.resources | nindent 8 }}
      volumeMounts:
        - name: tmp
          mountPath: /tmp
  volumes:
    - name: tmp
      emptyDir: {}

---

Values 设计原则

code
结构 (STRUCTURE)
├── 扁平化优于深层嵌套 (image.tag > container.spec.image.tag)
├── 按资源分组 (service.*, ingress.*, resources.*)
├── 对可选资源使用 enabled: true/false
├── 为每个键提供 YAML 行内注释
└── 提供合理的开发默认值

命名 (NAMING)
├── 键名使用小驼峰式 (camelCase,如 replicaCount 而非 replica_count)
├── 布尔键:使用形容词 (enabled, required) 而非动词
├── 嵌套键:最大深度 3 层
└── 遵循上游约定 (image.repository, image.tag, image.pullPolicy)

反模式 (ANTI-PATTERNS)
├── 硬编码集群 URL 或域名
├── 将 Secret 作为默认值
├── 在应为 null 的地方使用空字符串
├── 过深的嵌套结构 (>3 层)
├── 缺乏文档说明的 values
└── values.yaml 在没有覆盖 (override) 的情况下无法运行

---

依赖管理

code
子 Chart (SUBCHARTS)
├── 使用 Chart.yaml 的 dependencies (而非 requirements.yaml — Helm 3)
├── 固定版本:version: ~15.x.x (补丁版本浮动)
├── 使用 condition 使其可选:condition: postgresql.enabled
├── 使用 alias 以支持同一 Chart 的多个实例
├── 在 values.yaml 的子 Chart 名称键下覆盖其值
└── 在打包前运行 helm dependency update

库 Chart (LIBRARY CHARTS)
├── Chart.yaml 中设置 type: library — 不含 templates 目录
├── 仅导出命名模板 (named templates) — 不产生渲染资源
├── 用于共享标签 (labels)、注解 (annotations) 和安全上下文 (security contexts)
└── 版本独立于应用 Chart 进行管理

---

主动触发检查项

在无需询问的情况下,请标记以下问题:

  • 缺失 _helpers.tpl $\rightarrow$ 创建一个。每个 Chart 都需要标准标签和 fullname 辅助函数。
  • 模板中硬编码镜像标签 $\rightarrow$ 提取到 values.yaml。标签必须是可覆盖的。
  • 缺失资源请求/限制 (requests/limits) $\rightarrow$ 添加它们。没有限制的 Pod 可能会耗尽节点资源。
  • 以 root 用户运行 $\rightarrow$ 添加 securityContext。生产环境 Chart 不应有例外。
  • 缺失 NOTES.txt $\rightarrow$ 创建一个。用户需要安装后的操作指南。
  • values.yaml 默认值中包含 Secret $\rightarrow$ 移除它们。使用占位符并配合注释说明如何提供 Secret。
  • 缺失存活/就绪探针 (liveness/readiness probes) $\rightarrow$ 添加它们。Kubernetes 需要知道 Pod 是否健康。
  • 缺失 app.kubernetes.io 标签 $\rightarrow$ 通过 _helpers.tpl 添加。这是正确追踪资源的必要条件。

---

安装

一键安装 (适用于任何工具)

bash
git clone
https://github.com/alirezarezvani/claude-skills.git cp -r claude-skills/engineering/helm-chart-builder ~/.claude/skills/
code
### 多工具安装
bash ./scripts/convert.sh --skill helm-chart-builder --tool codex|gemini|cursor|windsurf|openclaw
code
### OpenClaw
bash clawhub install cs-helm-chart-builder ```

---

相关技能

  • senior-devops — 更广泛的 DevOps 范围(CI/CD、IaC、监控)。互补关系:使用 helm-chart-builder 处理 Chart 相关工作,使用 senior-devops 处理流水线和基础设施。
  • docker-development — 容器构建。互补关系:docker-development 构建镜像,helm-chart-builder 将其部署到 Kubernetes。
  • ci-cd-pipeline-builder — 流水线构建。互补关系:helm-chart-builder 定义部署产物,ci-cd-pipeline-builder 实现自动化交付。
  • senior-security — 应用安全。互补关系:helm-chart-builder 涵盖 Kubernetes 级别安全(RBAC、Pod 安全),senior-security 涵盖应用级威胁。