1. 概述

Helm 是 Kubernetes 的包管理工具。它通过将应用所需的 Kubernetes 资源打包成一种特殊格式的包(称为 Helm Chart),从而简化了 Kubernetes 应用的部署和分发。用户只需通过 helm install 命令即可完成安装。

通常,应用开发者会通过参数化 Helm Chart 中的某些值,使 Chart 具备可配置性。这样,用户就可以通过 values 文件来自定义部署行为。

本教程将重点讲解:如何在 Helm Chart 中引用 Kubernetes Secret,以便在安装时让用户自定义其 Secret 配置。

2. Kubernetes Secret 简介

Kubernetes Secret 是用于存储敏感信息的资源对象,例如 API 密钥、证书、密码等。一个 Secret 通过其名称标识,内部包含一组键值对。

以下是一个 Secret 的定义示例:

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  # Base64 编码的数据
  password: cGFzc3dvcmQ= # "password" 的 Base64 编码
stringData:
  # 原始字符串数据(Kubernetes 会自动编码为 Base64)
  api_key: myApiKey123

⚠️ 注意:data 字段要求值是 Base64 编码的,而 stringData 则允许使用明文字符串。

我们可以使用 valueFrom 语法将 Secret 的值注入到 Pod 的环境变量中:

env:
- name: PASSWORD
  valueFrom:
    secretKeyRef:
      name: my-secret
      key: password

当 Kubernetes 控制器创建 Pod 时,它会查找当前命名空间下的 my-secret Secret,并将 password 键的值注入到容器中。

3. 在 Helm Chart 中引用 Secret

在打包 Kubernetes 应用为 Helm Chart 时,建议将那些与环境高度相关的敏感值外置化。

以之前的 deployment.yaml 为例,如果我们直接硬编码 Secret 名称和键名,如:

valueFrom:
  secretKeyRef:
    name: my-secret
    key: password

这种方式虽然可行,但不够灵活。更好的做法是通过 Helm 模板参数化 Secret 名称和键名,让用户在安装时自定义。

例如:

env:
- name: PASSWORD
  valueFrom:
    secretKeyRef:
      name: {{ .Values.password.secretName }}
      key: {{ .Values.password.secretKey }}

这样,用户只需要在 values 文件中提供 secretNamesecretKey,即可完成配置。

4. 示例演示

我们通过一个完整的示例来演示如何在 Helm Chart 中引用 Secret。

4.1 创建 Helm Chart

首先,创建一个 Helm Chart 的 Chart.yaml 文件:

apiVersion: v2
name: my-app
description: A simple Kubernetes application
version: 0.1.0
appVersion: "0.1.0"

接着,在 templates 目录下创建 deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Chart.Name }}-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: {{ .Chart.Name }}
  template:
    metadata:
      labels:
        app: {{ .Chart.Name }}
    spec:
      containers:
      - name: app-container
        image: ubuntu:latest
        command: ["bash", "-c", "while true; do echo $PASSWORD; sleep 3; done"]
        env:
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: {{ .Values.password.secretName }}
              key: {{ .Values.password.secretKey }}

该 Deployment 会运行一个容器,循环打印 PASSWORD 环境变量的值。

4.2 安装 Helm Chart

安装前,需要先创建一个 Secret:

kubectl apply -f- <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
stringData:
  password: sensitive-password-123
EOF

然后,创建 values.yaml 文件:

password:
  secretName: my-secret
  secretKey: password

最后,使用 Helm 安装:

helm install alpha . -f values.yaml

输出示例:

NAME: alpha
LAST DEPLOYED: Sat May 11 17:30:13 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

4.3 验证部署

使用 kubectl get pods 查看 Pod 状态:

kubectl get pods

输出示例:

NAME                                 READY   STATUS    RESTARTS   AGE
my-app-deployment-6f795c498f-jhxcf   1/1     Running   0          54s

查看日志确认环境变量已正确注入:

kubectl logs my-app-deployment-6f795c498f-jhxcf

输出示例:

sensitive-password-123
sensitive-password-123
...

✅ 成功!说明 Secret 已正确注入。

5. 总结

本文介绍了 Kubernetes Secret 的基本概念以及如何在 Helm Chart 中引用 Secret。通过参数化 Secret 的名称和键名,可以提高 Chart 的灵活性和可复用性。我们还通过一个完整的示例演示了如何创建 Secret、配置 Helm Chart 并验证部署结果。

如果你正在开发 Helm Chart,务必避免硬编码 Secret 信息,而应通过 .Values 参数让用户自定义配置,这是 Helm Chart 开发中的最佳实践之一。


原始标题:Referencing Kubernetes Secret in Helm Chart