Helm Chart 构建器
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 结构
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 最佳实践
元数据
├── apiVersion: v2 (仅限 Helm 3 —— 绝不要用 v1)
├── name: 与目录名称完全一致
├── version: se依赖管理 (DEPENDENCIES)
├── 使用 ~X.Y.Z (补丁级浮点数) 固定依赖版本
├── 使用 condition 字段使子 Chart 变为可选
├── 使用 alias 为同一子 Chart 的多个实例创建别名
└── 修改后运行 helm dependency update
4. 生成带有文档的 values.yaml
- 每个值都应有解释用途和类型的行内注释
- 提供适用于开发环境的合理默认值
- 易于覆盖的结构(尽可能扁平,仅在逻辑必要时嵌套)
- 不包含硬编码的集群特定值(如镜像仓库、域名、存储类)
5. 验证
python3 scripts/chart_analyzer.py mychart/
helm lint mychart/
helm template mychart/ --debug
### /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 质量
python3 scripts/values_validator.py mychart/values.yaml
4. 生成评审报告HELM CHART REVIEW — [chart name]
日期: [timestamp]
紧急 (CRITICAL): [count]
高 (HIGH): [count]
中 (MEDIUM): [count]
低 (LOW): [count]
[详细发现及修复建议]
### /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): [数量]
[详细发现及修复步骤]
---
工具链
scripts/chart_analyzer.py
用于 Helm Chart 目录静态分析的 CLI 工具。
功能:
- Chart 结构验证(必需文件、目录布局)
- 模板反模式检测(硬编码值、缺失标签、无资源限制)
- Chart.yaml 元数据检查
- 标准标签验证 (app.kubernetes.io/*)
- 安全基线检查
- 支持 JSON 和文本输出
用法:
分析 Chart 目录
python3 scripts/chart_analyzer.py mychart/
JSON 输出
python3 scripts/chart_analyzer.py mychart/ --output json侧重安全分析
python3 scripts/chart_analyzer.py mychart/ --security### scripts/values_validator.py
用于根据最佳实践验证 values.yaml 的 CLI 工具。
功能:
- 文档覆盖率检查(行内注释)
- 类型一致性检查
- 硬编码密钥检测
- 默认值质量分析
- 结构深度分析
- 命名规范验证
- 支持 JSON 和文本输出
用法:
验证 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---
模板模式
模式 1:标准标签 (_helpers.tpl)
{{/*
选择器标签(通用标签的子集 — 必须不可变)。
*/}}
{{- define "mychart.selectorLabels" -}}
app.kubernetes.io/name: {{ include "mychart.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
### 模式 2:条件资源{{- 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
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)
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 设计原则
结构 (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) 的情况下无法运行
---
依赖管理
子 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 添加。这是正确追踪资源的必要条件。
---
安装
一键安装 (适用于任何工具)
git clone### 多工具安装### OpenClaw---
相关技能
- 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 涵盖应用级威胁。