创建、组织和管理Helm charts的全面指南,用于打包和部署Kubernetes应用。
下载地址
Skill源码下载地址:https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/helm-chart-scaffolding
技能概述
helm-chart-scaffolding 技能是一个用于创建、组织和管理Helm charts的技能。它提供了全面的指导,帮助开发者从零开始创建Helm charts,打包Kubernetes应用进行分发,管理多环境部署,以及设置Helm chart仓库。
主要功能
- 创建Helm Charts:从零开始创建新的Helm charts
- 应用打包:打包Kubernetes应用进行分发
- 多环境部署:使用Helm管理多环境部署
- 模板化:为可重用的Kubernetes manifests实现模板化
- Chart仓库:设置Helm chart仓库
- 最佳实践:遵循Helm最佳实践和约定
触发条件
在以下情况下应该调用此技能:
- 需要从零创建新的Helm charts
- 需要打包Kubernetes应用进行分发
- 需要使用Helm管理多环境部署
- 需要为可重用的Kubernetes manifests实现模板化
- 需要设置Helm chart仓库
- 需要遵循Helm最佳实践和约定
Helm Chart结构
my-chart/
├── Chart.yaml # Chart元数据
├── values.yaml # 默认配置值
├── values.schema.json # values的JSON schema
├── charts/ # 依赖charts
├── templates/ # 模板文件
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── configmap.yaml
│ ├── ingress.yaml
│ ├── _helpers.tpl # 模板助手
│ └── NOTES.txt # 安装说明
└── .helmignore # 打包时忽略的文件
核心文件说明
Chart.yaml
apiVersion: v2
name: my-chart
description: A Helm chart for my application
type: application
version: 1.0.0
appVersion: "1.0.0"maintainers:
- name: Your Name
email: your@email.comdependencies:
- name: redis
version: "16.x.x"
repository: "https://charts.bitnami.com/bitnami"
values.yaml
replicaCount: 1
image:
repository: my-app
tag: latest
pullPolicy: IfNotPresentservice:
type: ClusterIP
port: 80ingress:
enabled: false
hosts:
- host: chart-example.local
paths: []resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
常用命令
| 命令 | 描述 |
|---|---|
| helm create my-chart | 创建新的chart |
| helm lint my-chart | 验证chart格式 |
| helm template my-chart | 渲染模板(不安装) |
| helm install my-release my-chart | 安装chart |
| helm upgrade my-release my-chart | 升级release |
| helm rollback my-release 1 | 回滚到版本1 |
| helm uninstall my-release | 卸载release |
| helm package my-chart | 打包chart |
模板语法示例
Deployment模板
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-chart.fullname" . }}
labels:
{{- include "my-chart.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "my-chart.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "my-chart.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: {{ .Values.service.port }}
resources:
{{- toYaml .Values.resources | nindent 12 }}
_helpers.tpl助手函数
{{- define "my-chart.labels" -}}
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion }}
{{- end -}}{{- define "my-chart.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
多环境配置
# values-production.yaml
replicaCount: 3
image:
tag: "v1.0.0"
resources:
limits:
cpu: 1000m
memory: 1Gi
# 部署命令
helm install my-app ./my-chart -f values-production.yaml
最佳实践
- 使用_helpers.tpl- 定义可重用的模板助手函数
- 合理命名- 使用fullname函数确保名称唯一性
- 默认值安全- 在values.yaml中提供安全的默认值
- 资源限制- 始终定义resources限制
- 文档化- 在NOTES.txt中提供安装说明
- 版本控制- 遵循语义化版本
- 测试- 使用helm test进行验证
- Lint检查- 打包前运行helm lint
参考资源
- Helm Charts官方文档
- Helm最佳实践指南
- 详细实现模式