首页 文章

如何向kubernetes工作负载提供自定义GCP服务帐户?

提问于
浏览
0

我正在使用GKE和terraform配置高可用性kubernetes集群 . 多个团队将在群集上运行多个部署,我预计大多数部署将位于自定义命名空间中,主要是出于隔离原因 .

我们的一个悬而未决的问题是如何管理群集上的GCP服务帐户 .

我可以使用自定义GCP服务帐户创建集群,并调整权限以便它可以从GCR中提取图像,登录到堆栈驱动程序等 . 我认为这个自定义服务帐户将由GKE节点使用,而不是默认的计算引擎服务帐户 . 如果我在这方面错了,请纠正我!

每个部署都需要访问一组不同的GCP资源( Cloud 存储,数据存储, Cloud sql等),我希望每个部署都拥有自己的GCP服务帐户,以便我们可以控制权限 . 我还想运行pods无法访问运行pod的节点可用的GCP服务帐户 .

那可能吗?

我考虑了一些选择,但我对可行性或可取性没有信心:

  • 部署的GCP服务帐户可以作为kubernetes秘密添加到群集,部署可以将其作为文件挂载,并设置 GOOGLE_DEFAULT_CREDENTAILS 指向它

  • 也许可以拒绝对实例的元数据API进行访问,或者可以更改元数据API返回的服务帐户?

  • 也许有一种GKE(或kubernetes)本地方式来控制呈现给pod的服务帐户?

1 回答

  • 1

    你走在正确的轨道上 . GCP服务帐户可以在GKE for POD中使用,以便为GCP资源分配权限 .

    创建一个帐户:

    cloud iam service-accounts create ${SERVICE_ACCOUNT_NAME}
    

    将IAM权限添加到服务帐户:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member="serviceAccount:${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
      --role='roles/${ROLE_ID}'
    

    为服务帐户生成JSON文件:

    gcloud iam service-accounts keys create \
      --iam-account "${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
      service-account.json
    

    使用该JSON创建一个秘密:

    kubectl create secret generic echo --from-file service-account.json
    

    使用该秘密为您的应用程序创建部署:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: echo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: echo
      template:
        metadata:
          name: echo
        spec:
          containers:
            - name: echo
              image: "gcr.io/hightowerlabs/echo"
              env:
                - name: "GOOGLE_APPLICATION_CREDENTIALS"
                  value: "/var/run/secret/cloud.google.com/service-account.json"
                - name: "PROJECT_ID"
                  valueFrom:
                    configMapKeyRef:
                      name: echo
                      key: project-id
                - name: "TOPIC"
                  value: "echo"
              volumeMounts:
                - name: "service-account"
                  mountPath: "/var/run/secret/cloud.google.com"
          volumes:
            - name: "service-account"
              secret:
                secretName: "echo"
    

    如果要对单独部署使用各种权限,则需要创建一些具有不同权限的GCP服务帐户,为它们生成JSON令牌,并根据您的计划将它们分配给部署 . POD将根据已安装的服务帐户进行访问,而不是为分配给该节点的帐户提供服务 .

    有关更多信息,您可以查看链接:

相关问题