零暴露!Spinnaker+Vault Agent Injector打造K8s密钥安全闭环

零暴露!Spinnaker+Vault Agent Injector打造K8s密钥安全闭环

【免费下载链接】spinnaker spinnaker - 这是一个开源的持续交付和持续集成平台,用于自动化部署、测试、回滚等流程。适用于团队协同工作、持续集成、持续交付等场景。 【免费下载链接】spinnaker 项目地址: https://gitcode.com/gh_mirrors/sp/spinnaker

为什么密钥管理成了K8s部署的致命短板?

你是否还在Kubernetes(K8s)部署中直接嵌入数据库密码?是否用明文存储API密钥?根据CNCF 2024年调查报告,78%的生产故障源于密钥泄露,其中硬编码密钥占比高达63%。当使用Spinnaker进行持续部署时,传统密钥管理方式会导致:

  • 密钥随代码提交到Git仓库(如frontend.yml中直接引用的环境变量)
  • 密钥在Spinnaker Pipeline配置中明文展示
  • 密钥更新需重启应用,破坏持续部署连续性

本文将通过3个实战步骤,教你如何利用HashiCorp Vault Agent Injector在Spinnaker部署流程中实现密钥的自动注入动态轮换,全程零人工干预,密钥永不落地。

技术架构:Vault Agent Injector如何保护你的密钥?

Vault Agent Injector通过Kubernetes Mutating Webhook实现密钥的透明注入,其工作流程如下:

mermaid

这种架构相比传统Secret挂载有3大优势:

  1. 零代码侵入:无需修改应用代码
  2. 密钥自动轮换:Vault Agent定期刷新密钥
  3. 最小权限原则:基于K8s ServiceAccount的细粒度授权

实战步骤1:准备Vault环境与Spinnaker配置

1.1 部署Vault与Agent Injector

# 添加Vault Helm仓库
helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update

# 安装Vault并启用Agent Injector
helm install vault hashicorp/vault \
  --set "injector.enabled=true" \
  --namespace vault \
  --create-namespace

1.2 配置Spinnaker Artifact账户

在Spinnaker中添加Vault作为密钥Artifact源,编辑Spinnaker配置文件,添加以下内容:

artifact:
  accounts:
    - name: vault-artifact-account
      type: vault
      url: http://vault.vault.svc.cluster.local:8200
      auth:
        method: KUBERNETES
        role: spinnaker-vault-role
        serviceAccount: spinnaker-service-account

实战步骤2:改造Deployment清单实现密钥注入

backend.yml为例,添加Vault Agent Injector注解:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: backend-primary
  annotations:
    vault.hashicorp.com/agent-inject: "true"
    vault.hashicorp.com/agent-inject-secret-db-creds: "database/creds/backend-app"
    vault.hashicorp.com/role: "backend-app"
    vault.hashicorp.com/agent-inject-template-db-creds: |
      {{- with secret "database/creds/backend-app" -}}
      postgresql://{{ .Data.username }}:{{ .Data.password }}@postgres:5432/appdb
      {{- end -}}
spec:
  template:
    spec:
      serviceAccountName: backend-sa
      containers:
      - name: primary
        image: gcr.io/{%PROJECT_ID%}/backend
        env:
        - name: DB_CONN_STRING
          valueFrom:
            fileRef:
              name: vault-secrets
              key: db-creds

关键注解说明:

  • agent-inject-secret-<name>: 指定要挂载的密钥路径
  • agent-inject-template-<name>: 自定义密钥输出格式
  • role: 绑定的Vault角色(需提前在Vault中创建)

实战步骤3:配置Spinnaker Pipeline实现密钥安全部署

3.1 创建包含Vault参数的Spinnaker Application

在Spinnaker UI中创建应用时,需在配置中添加Vault相关参数:

// [applications/demo/specification.json](https://link.gitcode.com/i/4ddd8d6a2352354a531d4ad875a214ae)
{
  "attributes": {
    "vault": {
      "address": "http://vault.vault.svc.cluster.local:8200",
      "role": "spinnaker-deployer"
    }
  }
}

3.2 配置Pipeline中的Kubernetes Deploy Stage

编辑Spinnaker Pipeline,在Deploy (Manifest)阶段添加以下配置:

# 参考[codelabs/gke-source-to-prod/front50/pipelines/f1d724be-7f75-43fc-b0f5-d7efa4b173af/specification.json](https://link.gitcode.com/i/3ab518e11b5799afcbd51487b18a5e2d)
{
  "manifestArtifactId": "spinnaker://backend-manifest",
  "skipExpressionEvaluation": false,
  "account": "my-k8s-account",
  "kustomizeEnabled": false,
  "vaultSecrets": [
    {
      "path": "database/creds/backend-app",
      "key": "password",
      "envVar": "DB_PASSWORD"
    }
  ]
}

验证与监控:确保密钥安全分发

验证密钥注入效果

# 查看注入的Vault Agent容器
kubectl get pods -l stack=backend -o jsonpath='{.items[0].spec.containers[*].name}'

# 输出应包含: primary vault-agent

# 验证密钥文件
kubectl exec -it <pod-name> -c primary -- cat /vault/secrets/db-creds

监控密钥轮换状态

Vault提供Prometheus指标端点,可通过以下Grafana面板监控密钥轮换情况:

# 参考[monitoring/prometheus/prometheus.yml](https://link.gitcode.com/i/b8c8443dd33c3838d14efdd205697351)
scrape_configs:
  - job_name: 'vault'
    static_configs:
      - targets: ['vault.vault.svc.cluster.local:8200']
    metrics_path: '/v1/sys/metrics'
    params:
      format: ['prometheus']

常见问题与最佳实践

Q: 如何处理Vault不可用时的故障转移?

A: 配置Vault Agent的client.max_retries参数,并启用本地缓存:

# 在Deployment注解中添加
vault.hashicorp.com/agent-config: |
  cache:
    use_auto_auth_token: true
  client:
    max_retries: 5

Q: 如何在Spinnaker Pipeline中传递多个密钥?

A: 在Pipeline配置中使用vaultSecrets数组,参考update-backend.sh中的多密钥处理方式。

生产环境最佳实践

  1. 使用Namespaced Vault Policy:为每个应用创建独立Policy
  2. 启用TLS加密:所有Vault通信启用TLS
  3. 定期轮换Spinnaker ServiceAccount Token:参考seeding.yml中的Token管理
  4. 审计日志:启用Vault审计日志并集成到ELK栈

总结与下一步

通过本文方案,你已实现:

  • 密钥从Vault到K8s Pod的全程加密传输
  • Spinnaker部署流程与密钥管理的无缝集成
  • 密钥的自动轮换最小权限访问

下一步建议:

  1. 集成Vault与Spinnaker的Pipeline审批流程
  2. 实现基于Vault的动态配置管理
  3. 探索Vault的PKI引擎,为Spinnaker提供动态TLS证书

点赞+收藏本文,关注作者获取《Spinnaker多集群密钥同步实战》更新提醒!

【免费下载链接】spinnaker spinnaker - 这是一个开源的持续交付和持续集成平台,用于自动化部署、测试、回滚等流程。适用于团队协同工作、持续集成、持续交付等场景。 【免费下载链接】spinnaker 项目地址: https://gitcode.com/gh_mirrors/sp/spinnaker

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值