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

如何在Kubernetes中通过Vault-agent-injector自动获取AppRole的secret-id

问题:在Kubernetes环境中使用Vault-agent-injector自动获取AppRole的secret-id

目标

在Kubernetes环境中搭建自动获取AppRole一次性secret-id的流程,结合Vault与Vault-agent-injector机制,确保每个新部署的服务实例拥有唯一的secret-id,完成AppRole认证后安全访问密钥,同时实现实例间密钥隔离。

待解决问题

部署服务时自动为devtest角色生成一次性secret-id,替代手动执行vault write -f auth/approle/role/devtest/secret-id的流程,确保每个Pod实例使用独立且单次有效的secret-id完成认证。


解决方案

1. 配置Vault,允许K8s Pod生成一次性Secret-ID

首先确保devtest AppRole角色启用一次性secret-id,并创建权限策略允许Pod生成该角色的secret-id:

步骤1.1 配置devtest角色为一次性Secret-ID
vault write auth/approle/role/devtest \
  secret_id_num_uses=1 \
  secret_id_ttl=0 \
  token_policies=your-app-data-policy \
  token_ttl=1h \
  token_max_ttl=2h
  • secret_id_num_uses=1:限制每个secret-id仅能使用一次
  • secret_id_ttl=0:secret-id无过期时间(可按需设置)
  • token_policies:指定该角色认证后可访问的密钥策略
步骤1.2 创建生成Secret-ID的权限策略

创建devtest-secret-id-generator.hcl策略文件:

path "auth/approle/role/devtest/secret-id" {
  capabilities = ["create", "update"]
}

加载策略到Vault:

vault policy write devtest-secret-id-generator devtest-secret-id-generator.hcl
步骤1.3 绑定K8s ServiceAccount到Vault权限

将Pod使用的ServiceAccount(例如test-service-sa)绑定到上述策略,允许Pod通过Kubernetes auth认证后生成secret-id:

vault write auth/kubernetes/role/test-app \
  bound_service_account_names=test-service-sa \
  bound_service_account_namespaces=your-namespace \
  policies=devtest-secret-id-generator,your-app-data-policy \
  ttl=1h

2. 修改Deployment配置,实现自动生成与使用Secret-ID

调整Deployment的annotations,让Vault Agent自动完成Kubernetes auth、生成secret-id、注入环境变量,最终用AppRole认证访问密钥:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-test-service
  namespace: your-namespace
spec:
  replicas: 3
  selector:
    matchLabels:
      app: test-service
  template:
    metadata:
      annotations:
        vault.hashicorp.com/agent-inject: 'true'
        vault.hashicorp.com/role: 'test-app' # 对应Kubernetes auth的role
        # 注入生成的secret-id
        vault.hashicorp.com/agent-inject-secret-secret-id: "auth/approle/role/devtest/secret-id"
        vault.hashicorp.com/agent-inject-template-secret-id: |
          {{- with secret "auth/approle/role/devtest/secret-id" "method=POST" -}}
            export VAULT_APPROLE_SECRET_ID="{{ .Data.secret_id }}"
          {{- end }}
        # 注入业务所需密钥
        vault.hashicorp.com/agent-inject-template-.venv: |
          {{- with secret "test/data/database/postgres" -}}
            {{- range $k, $v := .Data.data }}
              export {{$k}}="{{$v}}"
            {{- end }}
          {{- end }}
      labels:
        app: test-service
    spec:
      serviceAccountName: test-service-sa
      containers:
      - name: test-service
        image: your-app-image:latest
        args:
          - /bin/sh
          - -c
          - |
            source /vault/secrets/secret-id
            source /vault/secrets/.venv
            # 使用生成的一次性secret-id完成AppRole认证
            vault login -method=approle role_id="$VAULT_APPROLE_ROLE_ID" secret_id="$VAULT_APPROLE_SECRET_ID"
            # 启动应用
            /app
        env:
        - name: VAULT_APPROLE_ROLE_ID
          valueFrom:
            secretKeyRef:
              name: devtest-role-id
              key: role_id
        - name: VAULT_ADDR
          value: "https://your-vault-address:8200"

3. 前置准备:存储AppRole Role-ID到K8s Secret

将devtest角色的role-id存入Kubernetes Secret,避免硬编码:

# 获取devtest角色的role-id
VAULT_ROLE_ID=$(vault read auth/approle/role/devtest/role-id -format=json | jq -r '.data.role_id')
# 创建K8s Secret
kubectl create secret generic devtest-role-id --from-literal=role_id=$VAULT_ROLE_ID -n your-namespace

关键优势

  • 实例隔离:每个Pod生成独立的一次性secret-id,避免实例间共享认证凭据
  • 安全性:secret-id仅能使用一次,泄露风险大幅降低
  • 全自动化:无需手动生成secret-id,部署流程完全集成到K8s Deployment中

内容的提问来源于stack exchange,提问作者Michael Bahdir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:12:34