K8s Helm部署模板编写指南:快速掌握核心技巧

Helm作为Kubernetes的包管理工具,通过模板化的方式简化了应用的部署流程。本文将深入探讨Helm模板的编写方法,涵盖常用语法、命令以及注意事项,帮助您快速掌握Helm模板的核心技巧。

一、Helm模板基础

Helm模板使用Go模板语言,结合Kubernetes YAML文件,生成最终的部署清单。一个典型的Helm模板文件结构如下:

/* by yours.tools - online tools website : yours.tools/zh/formatcs.html */
mychart/
├── Chart.yaml          # 定义Chart的元数据(名称、版本、依赖等)
├── values.yaml         # 存储默认配置值
├── templates/          # 存放所有Kubernetes资源模板文件
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   ├── _helpers.tpl    # 定义可重用的命名模板
│   └── NOTES.txt       # 安装后提示信息
├── charts/             # 存放子Chart或依赖Chart
└── .helmignore         # 指定打包时忽略的文件

核心概念

  • Chart:一个Helm包,包含运行某个应用所需的所有Kubernetes资源定义。
  • Release:在Kubernetes集群中运行的Chart的一个实例。同一个Chart可以安装多次,每次安装都会创建一个新的Release。
  • Repository:用于存放和共享Chart的仓库。

Helm的核心价值在于其能够将复杂的Kubernetes应用及其依赖关系打包成一个可版本化、可分享、可重复部署的单元。

二、常用模板语法详解

1. 变量与内置对象

Helm模板通过点(/* by yours.tools - online tools website : yours.tools/zh/formatcs.html */ .)来访问上下文。常用的内置对象包括:

  • .Values:访问values.yaml文件或通过--set传入的值,这是模板参数化的核心。
  • .Release:访问发布信息,如 .Release.Name(Release名称)、.Release.Namespace(命名空间)。
  • .Chart:访问Chart.yaml文件中定义的元数据,如 .Chart.Name.Chart.Version
  • .Files:访问Chart中的非模板文件。
  • .Capabilities:访问Kubernetes集群的信息,如API版本。

示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-{{ .Chart.Name }} # 生成唯一资源名
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        ports:
        - containerPort: {{ .Values.service.port }}

2. 管道与函数

Helm提供了强大的管道(Pipeline)功能,允许将多个函数串联处理数据。它还内置了大量函数(包括Go模板函数和Sprig函数库)。

# 字符串处理:将Release名称转换为小写,并截断至63个字符
name: {{ .Release.Name | lower | trunc 63 }}

# 默认值设置:如果image.pullPolicy未定义,则使用"IfNotPresent"
imagePullPolicy: {{ .Values.image.pullPolicy | default "IfNotPresent" }}

# 缩进与YAML处理:包含命名模板并正确缩进2个空格
labels:
  {{- include "mychart.labels" . | nindent 2 }}

# 类型转换:将字符串端口号转换为整数
port: {{ .Values.service.port | int }}

3. 控制流(条件与循环)

条件判断:使用if/else根据条件生成不同的配置。

{{- if .Values.ingress.enabled }} # 注意 `-` 会去除前面的空白符
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ .Release.Name }}-ingress
spec:
  ...
{{- end }} # 结束if语句

循环遍历:使用range遍历列表或键值对。

# values.yaml中定义
env:
  LOG_LEVEL: INFO
  DATABASE_URL: postgresql://localhost/mydb

# templates/deployment.yaml中使用
env:
{{- range $key, $value := .Values.env }}
- name: {{ $key }}
  value: {{ $value | quote }}
{{- end }}

4. 命名模板与局部模板

为了提高模板的复用性和可维护性,可以在 _helpers.tpl中定义命名模板。

# 在 _helpers.tpl 中定义
{{- define "mychart.fullname" -}}
{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" }}
{{- end -}}

{{- define "mychart.labels" -}}
app.kubernetes.io/name: {{ include "mychart.fullname" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end -}}

在模板文件中使用命名模板:

# 在 deployment.yaml 中使用
metadata:
  name: {{ include "mychart.fullname" . }}
  labels:
    {{- include "mychart.labels" . | nindent 4 }} # 使用nindent保证缩进正确

三、Helm常用命令大全(实操核心)

为了方便查阅,以下将Helm常用命令按功能分类列出。

1. 仓库管理 (helm repo)

命令说明示例
helm repo add添加仓库helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo list列出已添加的仓库helm repo list
helm repo update更新仓库中的Chart索引helm repo update
helm repo remove移除仓库helm repo remove bitnami

2. Chart查询与检查 (helm search/show)

命令说明示例
helm search repo从已添加仓库中搜索Charthelm search repo nginx
helm search hub从Artifact Hub中搜索Charthelm search hub mysql
helm show chart显示Chart的基本信息helm show chart bitnami/nginx
helm show values显示Chart的默认可配置值(重要)helm show values bitnami/nginx > myvalues.yaml
helm show all显示Chart的所有信息helm show all bitnami/nginx

3. Chart安装与管理 (helm install/list/upgrade...)

命令说明示例
helm install安装Charthelm install my-release ./mychart
helm list列出已安装的Releasehelm list -n <namespace>
helm upgrade升级Releasehelm upgrade my-release ./mychart -f new-values.yaml
helm history查看Release的修订历史helm history my-release
helm rollback回滚Release到指定版本helm rollback my-release 1
helm uninstall卸载Releasehelm uninstall my-release

4. Chart开发与调试 (helm create/lint/template...)

命令说明示例
helm create创建新的Chart骨架helm create mychart
helm lint检查Chart的语法和格式是否正确helm lint ./mychart
helm template本地渲染模板,查看生成的K8s资源清单helm template my-release ./mychart
helm get manifest获取已安装Release生成的资源清单helm get manifest my-release

5. Chart打包与分发 (helm package/dependency...)

命令说明示例
helm package将Chart目录打包成.tgz压缩文件helm package ./mychart
helm dependency update根据Chart.yaml更新依赖包到charts/目录helm dependency update ./mychart
helm pull从仓库拉取(下载)Charthelm pull bitnami/nginx --untar

6. 调试与预安装(极其重要)

在实际安装之前,强烈建议使用以下命令进行调试和预览:

# 1. 语法检查
helm lint ./mychart

# 2. 模拟安装并渲染模板,检查生成的YAML是否正确
# --dry-run 模拟安装,不真正创建资源
# --debug 显示渲染的详细信息
helm install my-release ./mychart --dry-run --debug

# 3. 或者使用 `helm template` 仅渲染模板
helm template my-release ./mychart

四、最佳实践与注意事项

  1. 模板命名规范:模板文件名应使用小写字母和连字符,如my-awesome-chart。命名模板(在_helpers.tpl中)使用点分隔的命名空间,如mychart.labels

缩进处理:使用nindent函数可以智能处理包含模板片段后的缩进问题。

# 正确示例:使用 nindent
metadata:
  labels:
{{- include "mychart.labels" . | nindent 4 }} # 包含内容会被缩进4个空格

# 错误示例:缩进可能不一致
metadata:
  labels:
{{- include "mychart.labels" . }}
  1. 值文件管理: 使用values.yaml作为默认配置。 为不同环境(如开发、测试、生产)创建不同的values文件(values-dev.yaml, values-prod.yaml)。 使用-f选项指定自定义values文件来覆盖默认值:helm install -f values-prod.yaml ...。 使用--set快速覆盖单个值(适用于临时调试):helm upgrade ... --set image.tag=latest

依赖管理:在Chart.yaml中声明依赖,并使用helm dependency update来下载依赖。

# Chart.yaml
dependencies:
  - name: mysql
    version: "8.5.0"
    repository: "https://charts.bitnami.com/bitnami"
  1. 安全注意事项避免在values.yaml中直接存储敏感信息(如密码、密钥)。应使用Kubernetes Secrets管理敏感数据,在模板中通过.Values.secretName引用,或在安装时通过外部方式(如HashiCorp Vault)注入。 定期更新所依赖的Chart版本,以获取安全补丁和新功能。

五、实战案例:调试与故障排查

即使遵循了最佳实践,编写模板时也难免出错。Helm提供了有效的调试工具。

使用 --dry-run --debug:这是部署前最关键的检查步骤。它可以让你看到模板渲染后的最终YAML内容,而无需真正安装到集群。

helm install my-app ./my-chart --dry-run --debug

这个命令会输出所有将被创建的Kubernetes资源清单,仔细检查以确保其符合预期,如资源名称、镜像标签、环境变量等是否正确注入。

  1. 常见错误与排查模板渲染错误:通常是模板语法错误或引用了不存在的变量。使用helm linthelm template --debug定位问题。 依赖冲突:使用helm dependency listhelm dependency update确保依赖一致。 资源创建失败:检查helm get manifest <release-name>输出的YAML是否正确,并使用kubectl describekubectl get events查看Kubernetes的具体报错信息。

六、总结

Helm模板通过强大的模板引擎和丰富的功能,极大地简化了Kubernetes应用的部署和管理。掌握模板语法、合理组织文件结构、遵循最佳实践,可以编写出既灵活又可维护的Helm Chart。

本指南从基础概念到常用命令,再到最佳实践和调试技巧,提供了较为全面的概述。建议从创建一个简单的Chart开始,逐步尝试更复杂的模板功能,结合--dry-run --debug命令不断验证。随着实践的深入,你会越发体会到Helm在管理复杂应用部署时的巨大价值。

本文来自博客园,作者:dashery,转载请注明原文链接:https://www.cnblogs.com/ydswin/p/19327845

本 PPT 介绍了制药厂房中供配电系统的总体概念与设计要点,内容包括: 洁净厂房的特点及其对供配电系统的特殊要求; 供配电设计的一般原则与依据的国家/行业标准; 从上级电网到工厂变电所、终端配电的总体结构与模块化设计思路; 供配电范围:动力配电、照明、通讯、接地、防雷与消防等; 动力配电中电压等级、接地系统形式(如 TN-S)、负荷等级与可靠性、UPS 配置等; 照明的电源方式、光源选择、安装方式、应急与备用照明要求; 通讯系统、监控系统在生产管理与消防中的作用; 接地与等电位连接、防雷等级与防雷措施; 消防设施及其专用供电(消防泵、排烟风机、消防控制室、应急照明等); 常见高压柜、动力柜、照明箱等配电设备案例及部分设计图纸示意; 公司已完成的典型项目案例。 1. 工程背景与总体框架 所属领域:制药厂房工程的公用工程系统,其中本 PPT 聚焦于供配电系统。 放在整个公用工程中的位置:与给排水、纯化水/注射用水、气体与热力、暖通空调、自动化控制等系统并列。 2. Part 01 供配电概述 2.1 洁净厂房的特点 空间密闭,结构复杂、走向曲折; 单相设备、仪器种类多,工艺设备昂贵、精密; 装修材料与工艺材料种类多,对尘埃、静电等更敏感。 这些特点决定了:供配电系统要安全可靠、减少积尘、便于清洁和维护。 2.2 供配电总则 供配电设计应满足: 可靠、经济、适用; 保障人身与财产安全; 便于安装与维护; 采用技术先进的设备与方案。 2.3 设计依据与规范 引用了大量俄语标准(ГОСТ、СНиП、SanPiN 等)以及国家、行业和地方规范,作为设计的法规基础文件,包括: 电气设备、接线、接地、电气安全; 建筑物电气装置、照明标准; 卫生与安全相关规范等。 3. Part 02 供配电总览 从电源系统整体结构进行总览: 上级:地方电网; 工厂变电所(10kV 配电装置、变压
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值