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 文件中提供 secretName
和 secretKey
,即可完成配置。
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 开发中的最佳实践之一。