You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 21:33:14