关于在Kubernetes中通过Helm部署REST API应用时,使用Kubernetes Secrets替换配置文件变量的文档咨询
使用Kubernetes Secrets替换Helm模板变量的实操指南
这是K8s和Helm部署中处理敏感凭证的标准做法,我来一步步给你讲清楚怎么实现:
1. 准备Kubernetes Secret
你有两种方式创建Secret,按需选择:
方式一:提前手动创建Secret
如果你的凭证已经存在,直接用kubectl命令创建通用类型的Secret:
# 创建存储数据库凭证的Secret kubectl create secret generic api-credentials \ --from-literal=db-user=myuser \ --from-literal=db-password=mypassword
这个Secret会保存在你指定的namespace下,后续Helm模板可以直接引用它。
方式二:通过Helm模板生成Secret
如果想让Secret和应用一起部署,可以在Helm的templates目录下新建secret.yaml文件:
apiVersion: v1 kind: Secret metadata: name: {{ .Release.Name }}-api-credentials type: Opaque data: db-user: {{ .Values.db.user | b64enc }} db-password: {{ .Values.db.password | b64enc }}
然后在values.yaml里只留占位符(绝对不要写明文凭证!):
db: user: "" password: ""
部署时通过--set参数或环境变量传入敏感值:
# 用--set直接传入 helm install my-api ./api-chart \ --set db.user=myuser \ --set db.password=mypassword # 或者用环境变量传递(更安全,避免命令行历史泄露) helm install my-api ./api-chart \ --set db.user=$DB_USER \ --set db.password=$DB_PASSWORD
2. 在Helm模板中引用Secret
接下来要在Deployment(或其他资源)模板里,把Secret的值注入到应用中,常用两种方式:
方式一:通过环境变量注入
修改templates/deployment.yaml,在容器的env字段里引用Secret的键值:
apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Release.Name }}-api spec: replicas: 1 selector: matchLabels: app: api template: metadata: labels: app: api spec: containers: - name: api image: {{ .Values.image.repository }}:{{ .Values.image.tag }} env: - name: DB_USER valueFrom: secretKeyRef: name: {{ .Release.Name }}-api-credentials # 对应上面创建的Secret名称 key: db-user - name: DB_PASSWORD valueFrom: secretKeyRef: name: {{ .Release.Name }}-api-credentials key: db-password
这样应用就能通过环境变量DB_USER和DB_PASSWORD直接获取凭证了。
方式二:挂载Secret为文件
如果你的应用需要从配置文件读取凭证,可以把Secret挂载成容器内的只读文件:
# 在Deployment的spec.containers里添加volumeMounts containers: - name: api image: {{ .Values.image.repository }}:{{ .Values.image.tag }} volumeMounts: - name: secret-volume mountPath: /app/secrets readOnly: true # 在spec下添加volumes配置 volumes: - name: secret-volume secret: secretName: {{ .Release.Name }}-api-credentials
挂载完成后,容器内的/app/secrets/db-user和/app/secrets/db-password文件会分别存储对应的凭证值,应用可以直接读取这些文件内容。
3. 替换配置文件中的变量
如果你的应用配置文件(比如application.properties或config.yaml)里有占位符(如db.user=${DB_USER}),可以用容器启动命令完成替换:
containers: - name: api image: {{ .Values.image.repository }}:{{ .Values.image.tag }} command: ["/bin/sh", "-c"] args: ["envsubst < /app/config-template.yaml > /app/config.yaml && ./api-server"] env: - name: DB_USER valueFrom: secretKeyRef: name: {{ .Release.Name }}-api-credentials key: db-user
这种方式会在容器启动时,用环境变量的值替换配置模板里的占位符,生成最终可用的配置文件。
安全小贴士
- 绝对不要把明文凭证提交到Git仓库:
values.yaml只留占位符,敏感值用--set、环境变量或者Helm专用插件(如helm-secrets)管理。 - 给Secret设置最小权限:通过RBAC规则限制只有需要的Pod能访问该Secret。
- 定期轮换Secret:避免凭证泄露后长期存在安全风险。
内容的提问来源于stack exchange,提问作者S1c0r4x
相关产品推荐
相关产品推荐

