Helm 的 Hooks 是一种机制，允许用户在 Chart 的生命周期的某些关键点执行自定义操作。Hooks 可以用于执行初始化任务、清理任务、备份操作等。以下是 Helm 支持的一些常用 Hooks 以及它们的触发点：

### 常用 Hooks

#### 1. `pre-install`
- **触发点**：在 Helm 安装 Chart 之前执行。
- **用途**：用于初始化或准备操作，如创建必要的资源。

#### 2. `post-install`
- **触发点**：在 Helm 安装 Chart 之后执行。
- **用途**：用于执行后续操作，如配置或通知。

#### 3. `pre-delete`
- **触发点**：在 Helm 删除 Chart 之前执行。
- **用途**：用于执行清理操作，确保资源正确释放。

#### 4. `post-delete`
- **触发点**：在 Helm 删除 Chart 之后执行。
- **用途**：用于执行后续清理任务或通知。

#### 5. `pre-upgrade`
- **触发点**：在 Helm 升级 Chart 之前执行。
- **用途**：用于准备升级操作，如备份数据。

#### 6. `post-upgrade`
- **触发点**：在 Helm 升级 Chart 之后执行。
- **用途**：用于执行后续操作或验证升级结果。

#### 7. `pre-rollback`
- **触发点**：在 Helm 回滚 Chart 之前执行。
- **用途**：用于准备回滚操作。

#### 8. `post-rollback`
- **触发点**：在 Helm 回滚 Chart 之后执行。
- **用途**：用于执行回滚后的操作。

#### 9. `test`
- **触发点**：专用于测试操作。
- **用途**：用于运行测试用例，验证 Chart 部署是否成功。

### 使用 Hook 的示例

在 Helm Chart 的模板文件中，使用注解来定义 Hook。例如，一个简单的 ConfigMap 资源可以在安装之前创建：

```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
  annotations:
    "helm.sh/hook": pre-install
data:
  my-value: "This is a pre-install hook"
```

### Hook 的生命周期

1. **安装（Install）**：
    - `pre-install`
    - Chart 安装
    - `post-install`

2. **升级（Upgrade）**：
    - `pre-upgrade`
    - Chart 升级
    - `post-upgrade`

3. **删除（Delete）**：
    - `pre-delete`
    - Chart 删除
    - `post-delete`

4. **回滚（Rollback）**：
    - `pre-rollback`
    - Chart 回滚
    - `post-rollback`

### Hook 的策略

你还可以为 Hook 定义策略，以控制它们的行为。这些策略通过注解指定：

- **`"helm.sh/hook-delete-policy"`**：定义 Hook 执行完毕后的删除策略。
  - `hook-succeeded`：当 Hook 成功时删除。
  - `hook-failed`：当 Hook 失败时删除。
  - `before-hook-creation`：在创建新的 Hook 资源之前删除旧的 Hook 资源。

示例：

```yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: test-job
  annotations:
    "helm.sh/hook": test
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  template:
    spec:
      containers:
      - name: test-container
        image: busybox
        command: ['sh', '-c', 'echo Hello, Helm!']
      restartPolicy: Never
```

### 总结

Helm 的 Hooks 提供了在 Chart 生命周期的关键点上执行自定义操作的灵活性，使得 Chart 的管理和部署更加细粒度和可控。掌握和使用这些 Hooks，可以让你的 Helm Chart 更加健壮和自动化。

---

当然，以下是上边例子的详细解释，包括其执行过程和作用：

### 示例解释

这个示例是一个 Kubernetes `Job` 资源，带有 Helm Hook 的注解。具体内容如下：

```yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: test-job
  annotations:
    "helm.sh/hook": test
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  template:
    spec:
      containers:
      - name: test-container
        image: busybox
        command: ['sh', '-c', 'echo Hello, Helm!']
      restartPolicy: Never
```

### 细节解释

1. **资源类型**：
   - `apiVersion: batch/v1` 和 `kind: Job` 表明这是一个 Kubernetes `Job` 资源。
   - `Job` 资源在 Kubernetes 中用于一次性的任务，通常会在完成后自动退出。

2. **元数据**：
   - `metadata` 部分包含了资源的名称 `test-job`。
   - `annotations` 部分包含了 Helm Hook 的注解：
     - `"helm.sh/hook": test` 表示这个 `Job` 是一个测试 Hook。
     - `"helm.sh/hook-delete-policy": hook-succeeded` 表示当这个 `Job` 成功完成后，Helm 会删除它。

3. **Job 规范**：
   - `spec` 部分定义了 `Job` 的具体行为。
   - `template` 部分定义了 `Pod` 模板，这个 `Pod` 包含一个名为 `test-container` 的容器。
   - 容器使用 `busybox` 镜像，并且执行命令 `echo Hello, Helm!`。
   - `restartPolicy: Never` 表示这个 `Pod` 在完成任务后不会重新启动。

### 执行过程

1. **安装 Chart**：
   - 当你执行 `helm install` 命令来安装 Chart 时：
     ```sh
     helm install <release_name> <chart_name>
     ```
   - Helm 会识别并执行这个 `Job`，因为它带有 `"helm.sh/hook": test` 注解。

2. **执行 Hook**：
   - `Job` 资源会被创建并启动。
   - 容器会执行命令 `echo Hello, Helm!`，将 "Hello, Helm!" 输出到控制台。

3. **删除 Hook**：
   - 因为这个 Hook 带有 `"helm.sh/hook-delete-policy": hook-succeeded` 注解，当 `Job` 成功完成（即输出 "Hello, Helm!" 并退出）后，Helm 会自动删除这个 `Job` 资源。

### 总结

这个示例展示了如何使用 Helm 的 `test` Hook 来运行一个一次性的任务，并在任务成功完成后自动清理资源。具体流程如下：

1. Helm 识别到 `Job` 资源带有 `test` Hook 注解。
2. Helm 在安装过程中执行这个 `Job`。
3. `Job` 成功完成任务（输出 "Hello, Helm!"）。
4. Helm 根据 `hook-delete-policy` 注解自动删除 `Job` 资源。

通过这种方式，你可以在 Helm Chart 中定义各种自定义任务，并确保在任务完成后自动清理资源，从而保持集群的整洁和高效。

---

多个hook执行顺序

当然，以下是上边例子的详细解释，包括其执行过程和作用：

### 示例解释

这个示例是一个 Kubernetes `Job` 资源，带有 Helm Hook 的注解。具体内容如下：

```yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: test-job
  annotations:
    "helm.sh/hook": test
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  template:
    spec:
      containers:
      - name: test-container
        image: busybox
        command: ['sh', '-c', 'echo Hello, Helm!']
      restartPolicy: Never
```

### 细节解释

1. **资源类型**：
   - `apiVersion: batch/v1` 和 `kind: Job` 表明这是一个 Kubernetes `Job` 资源。
   - `Job` 资源在 Kubernetes 中用于一次性的任务，通常会在完成后自动退出。

2. **元数据**：
   - `metadata` 部分包含了资源的名称 `test-job`。
   - `annotations` 部分包含了 Helm Hook 的注解：
     - `"helm.sh/hook": test` 表示这个 `Job` 是一个测试 Hook。
     - `"helm.sh/hook-delete-policy": hook-succeeded` 表示当这个 `Job` 成功完成后，Helm 会删除它。

3. **Job 规范**：
   - `spec` 部分定义了 `Job` 的具体行为。
   - `template` 部分定义了 `Pod` 模板，这个 `Pod` 包含一个名为 `test-container` 的容器。
   - 容器使用 `busybox` 镜像，并且执行命令 `echo Hello, Helm!`。
   - `restartPolicy: Never` 表示这个 `Pod` 在完成任务后不会重新启动。

### 执行过程

1. **安装 Chart**：
   - 当你执行 `helm install` 命令来安装 Chart 时：
     ```sh
     helm install <release_name> <chart_name>
     ```
   - Helm 会识别并执行这个 `Job`，因为它带有 `"helm.sh/hook": test` 注解。

2. **执行 Hook**：
   - `Job` 资源会被创建并启动。
   - 容器会执行命令 `echo Hello, Helm!`，将 "Hello, Helm!" 输出到控制台。

3. **删除 Hook**：
   - 因为这个 Hook 带有 `"helm.sh/hook-delete-policy": hook-succeeded` 注解，当 `Job` 成功完成（即输出 "Hello, Helm!" 并退出）后，Helm 会自动删除这个 `Job` 资源。

### 总结

这个示例展示了如何使用 Helm 的 `test` Hook 来运行一个一次性的任务，并在任务成功完成后自动清理资源。具体流程如下：

1. Helm 识别到 `Job` 资源带有 `test` Hook 注解。
2. Helm 在安装过程中执行这个 `Job`。
3. `Job` 成功完成任务（输出 "Hello, Helm!"）。
4. Helm 根据 `hook-delete-policy` 注解自动删除 `Job` 资源。

通过这种方式，你可以在 Helm Chart 中定义各种自定义任务，并确保在任务完成后自动清理资源，从而保持集群的整洁和高效。

---

https://helm.sh/zh/docs/topics/charts_hooks/