【每日一个云原生小技巧 #24】Helm Templates

基础知识和控制结构

  1. 模板基础:
    • Helm Templates 使用 Go 模板语言。
    • 它们定义了 Kubernetes 资源的配置文件,通常是 YAML 格式。
    • Templates 可以包含静态内容和动态插入的值。
  2. Values 文件:
    • values.yaml 文件用于存储配置值,这些值在模板中被引用。
    • 可以通过命令行参数或不同的 values.yaml 文件覆盖这些值。
  3. 控制结构:
    • 条件判断: 使用 if-else 结构根据条件输出不同的配置。
    • 循环: 使用 range 来遍历列表或字典。
    • 变量和函数: 支持定义局部变量和使用内置函数。

使用技巧

  1. 参数化: 尽可能使模板参数化,以便通过不同的 values.yaml 文件重用。
  2. 模板函数: 利用 Helm 提供的模板函数,如 includedefault
  3. 维护清晰结构: 将复杂模板分解为更小的、可重用的片段。
  4. 注释: 在模板中添加注释,说明复杂的逻辑或重要的配置项。

使用案例

案例 1: 基本的 Deployment 模板

文件结构:

  • deployment.yaml – 包含 Kubernetes Deployment 的定义。
  • values.yaml – 定义了一些默认的配置值。

deployment.yaml 示例:

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.app.name }}
spec:
  replicas: {{ .Values.app.replicas }}
  template:
    metadata:
      labels:
        app: {{ .Values.app.name }}
    spec:
      containers:
      - name: {{ .Values.app.name }}
        image: "{{ .Values.app.image }}"
        ports:
        - containerPort: {{ .Values.app.port }}

values.yaml 示例:

代码语言:javascript
复制
app:
  name: myapp
  image: myapp:1.0.0
  replicas: 3
  port: 80

案例 2: 使用条件和循环

目的:

  • 根据不同的配置,启用或禁用某些 Kubernetes 资源。

模板示例:

代码语言:javascript
复制
{{ if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ .Values.app.name }}-ingress
spec:
  rules:
  {{- range .Values.ingress.hosts }}
  - host: {{ .host }}
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: {{ $.Values.app.name }}
            port:
              number: {{ $.Values.app.port }}
  {{- end }}
{{ end }}

values.yaml 片段:

代码语言:javascript
复制
ingress:
  enabled: true
  hosts:
    - host: example.com
    - host: another.com

这些案例展示了 Helm Templates 的基本用法和一些常见的高级技巧。通过这些示例,你可以开始构建自己的 Helm Charts,并根据你的特定需求进行定制。