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

如何将Google Secret Manager密钥挂载至KubernetesPodOperator?

挂载Google Secret Manager密钥到KubernetesPodOperator的方案

前提条件

  • Cloud Composer 1(Airflow 2)集群已启用Workload Identity(未启用的话先在对应GKE集群中开启)
  • 已在Google Secret Manager中创建目标密钥
  • Composer集群的Pod服务账号(或指定的K8s服务账号)拥有Secret Manager的roles/secretmanager.secretAccessor权限

具体操作步骤

1. 配置Workload Identity绑定

通过Workload Identity让K8s Pod直接获取GCP服务账号权限,无需在GKE中创建Secret副本:

  • 找到Composer集群默认使用的K8s服务账号(通常是default命名空间下的airflow-worker)
  • 创建或复用一个GCP服务账号,为其赋予roles/secretmanager.secretAccessor角色,权限范围可限定到目标密钥或整个项目
  • 绑定K8s服务账号与GCP服务账号:
gcloud iam service-accounts add-iam-policy-binding \
  --role roles/iam.workloadIdentityUser \
  --member "serviceAccount:[你的GCP项目ID].svc.id.goog[default/airflow-worker]" \
  [你的GCP服务账号邮箱]
  • 给K8s服务账号添加注解,完成身份关联:
kubectl annotate serviceaccount airflow-worker \
  --namespace default \
  iam.gke.io/gcp-service-account=[你的GCP服务账号邮箱]

2. 在Pod代码中直接读取Secret Manager密钥

无需挂载文件,直接在业务代码中调用Secret Manager API拉取密钥,以Python为例:

from google.cloud import secretmanager

def fetch_secret(project_id, secret_id, version="latest"):
    client = secretmanager.SecretManagerServiceClient()
    secret_name = f"projects/{project_id}/secrets/{secret_id}/versions/{version}"
    response = client.access_secret_version(request={"name": secret_name})
    return response.payload.data.decode("UTF-8")

# 调用示例
db_pass = fetch_secret("你的GCP项目ID", "数据库密码密钥名")

3. (可选)通过Init容器预加载密钥到文件

如果业务代码必须从文件读取密钥,可通过Init容器提前将Secret Manager中的密钥拉取到共享卷,供主容器读取:

from airflow.providers.cncf.kubernetes.operators.kubernetes_pod import KubernetesPodOperator
from kubernetes.client import models as k8s

# 定义共享卷
shared_volume = k8s.V1Volume(
    name="secret-storage",
    empty_dir=k8s.V1EmptyDirVolumeSource()
)

# Init容器:拉取密钥到共享卷
init_container = k8s.V1Container(
    name="pull-secret",
    image="google/cloud-sdk:slim",
    command=["sh", "-c"],
    args=[
        "gcloud secrets versions access latest --secret=数据库密码密钥名 > /mnt/secrets/db-pass"
    ],
    volume_mounts=[
        k8s.V1VolumeMount(
            name="secret-storage",
            mount_path="/mnt/secrets"
        )
    ]
)

# 主容器配置:读取共享卷中的密钥文件
pod_task = KubernetesPodOperator(
    task_id="use-secret-file",
    name="secret-file-pod",
    image="你的业务镜像",
    volumes=[shared_volume],
    init_containers=[init_container],
    volume_mounts=[
        k8s.V1VolumeMount(
            name="secret-storage",
            mount_path="/app/secrets"
        )
    ],
    service_account_name="airflow-worker",  # 已绑定Workload Identity的K8s SA
    namespace="default"
)

注意事项

  • 确认K8s服务账号已正确绑定GCP服务账号,且GCP服务账号的权限范围覆盖目标密钥
  • 若业务镜像未预装依赖,需提前安装google-cloud-secret-manager库(Python)或对应语言的Secret Manager SDK
  • 项目ID、密钥名等参数建议通过环境变量传递,避免硬编码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 11:48:25