【每日一个云原生小技巧 #19】Helm Chart 结构

2023-11-09 13:08:15 浏览数 (1)

Helm Chart 是 Helm 的包格式,它是一个预配置的资源集合,用于在 Kubernetes 上部署和管理应用程序。一个 Chart 可以被认为是 Kubernetes 资源的“配方”,它包含了部署应用所需的所有资源定义,如 Deployments、Services、PersistentVolumeClaims 等。

Chart 结构通常包括以下文件和目录:

  • Chart.yaml:Chart 的描述文件,包含了 Chart 的名称、版本、描述等信息。
  • values.yaml:配置文件,默认值的集合,用户可以在这里设置用来覆盖 Chart 中默认配置的参数。
  • templates/:模板目录,包含 Kubernetes 资源的模板文件,这些文件描述了如何生成 Kubernetes 清单文件(YAML)。
  • charts/:依赖目录,可以存放 Chart 所依赖的其他 Charts。
  • templates/NOTES.txt:安装说明文件,可以包含 Chart 安装后的使用说明。
  • templates/tests/:测试文件目录,包含 Helm Chart 安装后可以运行的测试。

使用场景:

  • 快速部署: 使用 Helm Chart 快速部署复杂的应用到 Kubernetes。
  • 版本管理和共享: 管理不同版本的应用配置,并共享给其他用户或团队。
  • 复用配置: 对相似的部署配置进行抽象和参数化,达到复用配置的目的。

使用技巧

  1. 使用参数化: 在模板中使用参数来保持配置的灵活性。
  2. 利用 values 文件: 为不同环境(开发、测试、生产)创建不同的 values 文件。
  3. 封装依赖: 把应用的依赖封装到 Chart 中,确保一致性。
  4. 测试 Chart: 使用 helm test 命令来测试 Chart 是否按预期工作。
  5. 利用 Hooks: 使用 Helm 的生命周期钩子(hooks)来管理复杂的部署逻辑,比如数据库迁移。
  6. 版本控制: 将 Chart 存储在版本控制系统中,跟踪配置的变化。
  7. 安全性: 遵循最佳实践,如不在 Chart 中硬编码敏感信息,使用 Secret 管理。

使用案例

假设你正在创建一个 Web 应用的 Helm Chart。

Chart.yaml 示例:

代码语言:javascript复制
apiVersion: v2
name: my-web-app
description: A Helm chart for Kubernetes
version: 0.1.0
appVersion: "1.16.0"

values.yaml 示例:

代码语言:javascript复制
replicaCount: 2

image:
  repository: nginx
  pullPolicy: IfNotPresent
  tag: "stable"

service:
  type: LoadBalancer
  port: 80

templates/deployment.yaml 示例:

代码语言:javascript复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.nameOverride | default .Chart.Name }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Values.nameOverride | default .Chart.Name }}
  template:
    metadata:
      labels:
        app: {{ .Values.nameOverride | default .Chart.Name }}
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        ports:
        - containerPort: 80

templates/service.yaml 示例:

代码语言:javascript复制
apiVersion: v1
kind: Service
metadata:
  name: {{ .Values.nameOverride | default .Chart.Name }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: 80
  selector:
    app: {{ .Values.nameOverride | default .Chart.Name }}

在这个简单的例子中,我们创建了一个 Chart,其中包含了一个部署和一个服务。在 values.yaml 中定义了默认值,这些值在 templates/deployment.yaml 和 `templates/service

.yaml中被引用。用户可以轻松更改values.yaml` 文件中的值,或者在安装 Chart 时通过命令行参数覆盖这些值。

0 人点赞