代码之家  ›  专栏  ›  技术社区  ›  James Healy

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

  •  1
  • James Healy  · 技术社区  · 6 年前

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

    我们公开的问题之一是如何管理集群上的gcp服务帐户。

    我可以使用自定义gcp服务帐户创建集群,并调整权限,以便它可以从gcr中提取图像、记录到stackdriver等。我认为gke节点将使用此自定义服务帐户,而不是默认的计算引擎服务帐户。如果我在这方面错了,请纠正我!

    每个部署都需要访问不同的gcp资源集(云存储、数据存储、云sql等),我希望每个部署都有自己的gcp服务帐户,以便我们可以控制权限。我还希望运行pods时不能访问运行pods的节点可用的gcp服务帐户。

    有可能吗?

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

    1. 部署的gcp服务帐户可以作为kubernetes机密添加到集群中,部署可以将其作为文件挂载,并设置 GOOGLE_DEFAULT_CREDENTAILS 指向它
    2. 或许可以拒绝pods访问实例的元数据api,或者可以更改元数据api返回的服务帐户?
    3. 也许有一种gke(或kubernetes)本地方法来控制呈现给pods的服务帐户?
    1 回复  |  直到 6 年前
        1
  •  3
  •   Artem Golenyaev    6 年前

    你在正确的轨道上。gcp服务帐户可以在gke中用于pods,以向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令牌,并根据计划将它们分配给部署。pods将根据挂载的服务帐户进行访问,而不是为分配给节点的帐户提供服务。

    有关详细信息,可以查看以下链接: