news 2026/5/26 3:48:00

Helm Chart最佳实践:打造生产级Kubernetes应用包

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Helm Chart最佳实践:打造生产级Kubernetes应用包

Helm Chart最佳实践:打造生产级Kubernetes应用包

一、Helm概述

Helm是Kubernetes的包管理工具,通过Chart方式打包、分发和管理Kubernetes应用。一个好的Helm Chart不仅要能正确部署应用,还要考虑可配置性、安全性、可维护性等多方面因素。

二、Chart结构规范

2.1 标准Chart目录结构

my-chart/ ├── Chart.yaml # Chart元数据 ├── values.yaml # 默认配置值 ├── charts/ # 依赖的子Chart ├── templates/ # 模板文件目录 │ ├── deployment.yaml │ ├── service.yaml │ ├── ingress.yaml │ └── _helpers.tpl # 辅助模板函数 └── README.md # Chart说明文档

2.2 Chart.yaml规范

apiVersion: v2 name: my-chart description: A Helm chart for Kubernetes type: application version: 1.0.0 appVersion: "1.0.0" kubeVersion: ">= 1.21.0-0" keywords: - my-app - example home: https://example.com sources: - https://github.com/example/my-chart maintainers: - name: John Doe email: john@example.com

三、模板设计最佳实践

3.1 使用辅助函数

创建_helpers.tpl文件:

{{/* Chart name */}} {{- define "my-chart.name" -}} {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} {{- end -}} {{/* Full name */}} {{- define "my-chart.fullname" -}} {{- $name := default .Chart.Name .Values.nameOverride -}} {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} {{- end -}} {{/* Labels */}} {{- define "my-chart.labels" -}} helm.sh/chart: {{ include "my-chart.name" . }}-{{ .Chart.Version | replace "+" "_" }} app.kubernetes.io/name: {{ include "my-chart.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} app.kubernetes.io/managed-by: {{ .Release.Service }} {{- end -}}

3.2 条件渲染

apiVersion: v1 kind: Service metadata: name: {{ include "my-chart.fullname" . }} labels: {{- include "my-chart.labels" . | nindent 4 }} spec: type: {{ .Values.service.type }} {{- if eq .Values.service.type "LoadBalancer" }} loadBalancerIP: {{ .Values.service.loadBalancerIP }} {{- end }} ports: - port: {{ .Values.service.port }} targetPort: http protocol: TCP name: http selector: app.kubernetes.io/name: {{ include "my-chart.name" . }} app.kubernetes.io/instance: {{ .Release.Name }}

3.3 数组遍历

apiVersion: apps/v1 kind: Deployment metadata: name: {{ include "my-chart.fullname" . }} spec: template: spec: containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} ports: {{- range .Values.service.ports }} - name: {{ .name }} containerPort: {{ .port }} protocol: {{ .protocol }} {{- end }}

四、values.yaml设计

4.1 合理的配置层级

# 全局配置 global: imageRegistry: "" imagePullSecrets: [] storageClass: "" # 应用配置 replicaCount: 3 image: repository: my-app tag: latest pullPolicy: IfNotPresent service: type: ClusterIP port: 80 ports: - name: http port: 80 protocol: TCP ingress: enabled: false className: "" hosts: - host: chart-example.local paths: - path: / pathType: ImplementationSpecific resources: limits: cpu: 100m memory: 128Mi requests: cpu: 100m memory: 128Mi autoscaling: enabled: false minReplicas: 1 maxReplicas: 10 targetCPUUtilizationPercentage: 80 targetMemoryUtilizationPercentage: 80

4.2 默认值设置原则

  1. 安全性:默认禁用不安全配置
  2. 合理性:提供合理的默认值
  3. 灵活性:允许用户覆盖所有配置
  4. 文档化:为每个配置项添加注释

五、依赖管理

5.1 声明依赖

Chart.yaml中声明依赖:

dependencies: - name: redis version: 17.3.0 repository: https://charts.bitnami.com/bitnami condition: redis.enabled tags: - database

5.2 管理依赖版本

# 更新依赖 helm dependency update # 查看依赖状态 helm dependency list # 打包Chart(包含依赖) helm package --dependency-update .

六、安全性最佳实践

6.1 使用Secrets管理敏感数据

apiVersion: v1 kind: Secret metadata: name: {{ include "my-chart.fullname" . }} type: Opaque data: {{- if .Values.secret }} {{- range $key, $value := .Values.secret }} {{ $key }}: {{ $value | b64enc | quote }} {{- end }} {{- end }}

6.2 限制容器权限

securityContext: runAsNonRoot: true runAsUser: 1000 fsGroup: 1000 allowPrivilegeEscalation: false readOnlyRootFilesystem: true capabilities: drop: - ALL

6.3 Pod安全标准

podSecurityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault

七、可观测性配置

7.1 配置监控

metrics: enabled: true serviceMonitor: enabled: true interval: 30s scrapeTimeout: 10s

7.2 配置日志

logging: enabled: true format: json level: info

八、测试与验证

8.1 模板测试

# 渲染模板 helm template . # 检查模板语法 helm lint . # 验证安装 helm install --dry-run --debug my-release .

8.2 集成测试

使用helm test进行测试:

apiVersion: v1 kind: ConfigMap metadata: name: {{ include "my-chart.fullname" . }}-test data: test.sh: | #!/bin/bash curl -s http://{{ include "my-chart.fullname" . }}:{{ .Values.service.port }}/health --- apiVersion: v1 kind: Pod metadata: name: "{{ include "my-chart.fullname" . }}-test" annotations: "helm.sh/hook": test spec: containers: - name: test image: busybox command: ['sh', '-c', 'source /test/test.sh'] volumeMounts: - name: test mountPath: /test volumes: - name: test configMap: name: {{ include "my-chart.fullname" . }}-test restartPolicy: Never

九、版本管理与发布

9.1 版本策略

version: 1.0.0 # Chart版本 appVersion: "2.0.0" # 应用版本

版本号遵循Semantic Versioning:

  • MAJOR:不兼容的API变更
  • MINOR:向后兼容的功能新增
  • PATCH:向后兼容的bug修复

9.2 Chart仓库管理

# 创建Chart仓库 helm repo index . # 上传到仓库 helm package . mv my-chart-1.0.0.tgz charts/ helm repo index . --url https://charts.example.com

十、高级技巧

10.1 使用模板函数

# 字符串操作 {{ .Values.someValue | upper }} {{ .Values.someValue | trunc 10 }} {{ .Values.someValue | replace "foo" "bar" }} # 条件判断 {{- if .Values.enabled }} # enabled配置 {{- else }} # disabled配置 {{- end }} # 数学运算 {{ add .Values.replicaCount 1 }} {{ mul .Values.resources.limits.cpu 2 }}

10.2 自定义模板函数

{{/* 定义自定义函数 */}} {{- define "my-chart.envFromSecret" -}} {{- range $key, $value := .Values.secret }} - name: {{ $key | upper | replace "-" "_" }} valueFrom: secretKeyRef: name: {{ include "my-chart.fullname" . }} key: {{ $key }} {{- end }} {{- end -}}

十一、总结

Helm Chart是Kubernetes应用分发的标准方式,遵循最佳实践可以提高Chart的质量和可维护性。建议从模板规范、安全性、可观测性等方面入手,逐步完善Chart设计。


参考资料

  • Helm官方文档
  • Helm Chart最佳实践指南
  • CNCF Helm Chart标准
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 3:47:23

ExternalDNS自动化DNS管理实践:实现Kubernetes服务自动注册

ExternalDNS自动化DNS管理实践:实现Kubernetes服务自动注册 一、ExternalDNS概述 ExternalDNS是一个Kubernetes控制器,能够自动同步Kubernetes资源(如Service和Ingress)到外部DNS服务商。它消除了手动管理DNS记录的繁琐工作&…

作者头像 李华
网站建设 2026/5/26 3:47:59

这次终于选对了!2026年亲测好用的专业一键生成论文工具

2026年AI论文写作工具已从“内容生成”进化为融合文献分析、逻辑构建与合规审查的全流程学术助手,核心评价维度包括文献真实性、格式合规性、长文本逻辑、查重降重、AIGC合规及多语言支持。本次测评覆盖6款主流工具,涵盖中文与英文场景,适用于…

作者头像 李华
网站建设 2026/5/26 3:47:31

2026 西安本土 GEO 测评:灵怡云凭差异化站稳第一梯队

** 2026 西安本土 GEO 测评:灵怡云凭差异化站稳第一梯队 ** 伴随生成式AI搜索全面商业化落地,西安企业数字化营销正式告别传统SEO流量依赖时代。在AI大模型智能推荐、自然问答、智能科普的流量新生态下,GEO生成式引擎优化成为西安制造、跨境电…

作者头像 李华
网站建设 2026/5/26 3:47:23

暗黑的故事

起因 网友问:mqttjson ,数据包比较大如何优化 。本地用json也记录一下。 俺的回答是:mqtt 其实可以选择 ProtoBuf。本地存储可以走 sqlite、文本、bin、dat 等。 网友又问了ProtoBuf的一些事情,俺就讲了 ProtoBuf 和 暗黑破坏…

作者头像 李华
网站建设 2026/5/22 13:22:21

从事弱电运维多年,聊聊我对UPS电源的真实理解

做弱电、机房运维、设备维护这么多年,我发现一个很有意思的现象:很多设备故障、数据丢失、设备提前老化,其实都不是设备本身坏了,而是供电不稳定导致的。尤其是很多小型机房、办公设备、精密仪器、监控系统,大家平时不…

作者头像 李华