Kubernetes Helm Chart开发最佳实践:打造可复用的应用包

Kubernetes Helm Chart开发最佳实践:打造可复用的应用包

引言

Helm是Kubernetes的包管理工具,通过Helm Chart可以将应用打包成可复用的包。今天就来分享一下Helm Chart开发的最佳实践。

Chart结构

标准Chart结构

一个标准的Chart结构如下:

复制代码
mychart/
├── Chart.yaml          # Chart元数据
├── values.yaml         # 默认配置值
├── charts/             # 依赖的子Chart
├── templates/          # Kubernetes资源模板
│   ├── NOTES.txt       # 部署说明
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   ├── configmap.yaml
│   ├── secret.yaml
│   └── _helpers.tpl    # 辅助模板函数
├── templates/NOTES.txt # 部署后显示的说明信息
├── README.md           # Chart说明文档
├── LICENSE             # 许可证文件
└── .helmignore         # 忽略文件列表

Chart.yaml配置

Chart.yaml包含Chart的元数据:

yaml 复制代码
apiVersion: v2
name: myapp
description: A production-ready web application
type: application
version: 1.2.3
appVersion: "2.0.0"
kubeVersion: ">=1.24.0"
keywords:
  - web
  - api
  - microservice
home: https://myapp.example.com
sources:
  - https://github.com/example/myapp
maintainers:
  - name: Wanli Hou
    email: wanli@example.com
icon: https://myapp.example.com/icon.png
deprecated: false

Chart.yaml字段说明

  • apiVersion:Chart API版本,v1适用于Helm 2,v2适用于Helm 3
  • name:Chart名称,必须唯一
  • version:Chart版本,使用语义化版本
  • appVersion:应用版本
  • kubeVersion:兼容的Kubernetes版本
  • description:Chart描述
  • type:Chart类型,application或library
  • keywords:关键词列表
  • maintainers:维护者信息

values.yaml配置

values.yaml包含Chart的默认配置值:

yaml 复制代码
# 全局配置
global:
  imageRegistry: ""
  imagePullSecrets: []
  storageClass: ""

# 应用配置
replicaCount: 3

image:
  repository: myapp
  pullPolicy: IfNotPresent
  tag: "2.0.0"

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

serviceAccount:
  create: true
  annotations: {}
  name: ""

podAnnotations: {}
podSecurityContext: {}
securityContext: {}

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: false
  className: ""
  annotations: {}
  hosts:
    - host: chart-example.local
      paths:
        - path: /
          pathType: ImplementationSpecific
  tls: []

resources:
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 100m
    memory: 128Mi

autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80
  targetMemoryUtilizationPercentage: 80

nodeSelector: {}
tolerations: []
affinity: {}

values.yaml最佳实践

  • 使用层次化结构组织配置
  • 提供合理的默认值
  • 添加注释说明配置项的用途
  • 支持global配置用于共享值

.helmignore文件

.helmignore文件用于指定打包时需要忽略的文件:

复制代码
# .helmignore
.git/
.gitignore
*.tgz
*.tar.gz
node_modules/
vendor/

常见忽略项

  • 版本控制目录(.git)
  • 依赖目录(node_modules, vendor)
  • 构建产物(*.tgz)
  • 编辑器配置(.vscode, .idea)

模板开发

使用辅助函数

yaml 复制代码
# templates/_helpers.tpl
{{- define "myapp.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}

条件渲染

yaml 复制代码
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ include "myapp.fullname" . }}
spec:
  rules:
    - host: {{ .Values.ingress.host }}
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: {{ include "myapp.fullname" . }}
                port:
                  number: {{ .Values.service.port }}
{{- end }}

最佳实践

配置验证

使用schema验证配置:

json 复制代码
{
  "$schema": "https://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "replicaCount": {
      "type": "integer",
      "minimum": 1,
      "maximum": 10
    }
  }
}

版本管理

使用语义化版本管理:

yaml 复制代码
version: 1.2.3
# 主版本.次版本.修订版本

结语

Helm Chart是Kubernetes应用打包的标准方式。通过遵循最佳实践,我们可以创建高质量的Chart。

本文作者:侯万里(万里侯),致力于Helm Chart开发的工程师

相关推荐
云恒要逆袭5 天前
运行你的第一个Docker容器
后端·docker·容器
蝎子莱莱爱打怪6 天前
XZLL-IM干货系列 04|Netty 长连接实战:Pipeline 怎么排、心跳怎么跳、连接怎么管
后端·微服务·面试
程序员老赵7 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
SamDeepThinking7 天前
Java微服务练习方式
java·后端·微服务
武子康10 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
米丘10 天前
微前端之 Web Components 完全指南
微服务·html
霸道流氓气质13 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
2601_9618752413 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj13 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
程序员老赵13 天前
服务器没有桌面?Docker 跑个 Chrome,浏览器就能远程用
docker·容器·devops