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

时间:2018-06-08 01:29:03

标签: kubernetes google-cloud-platform

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

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

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

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

这可能吗?

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

  1. 部署的GCP服务帐户可以作为kubernetes秘密添加到群集,部署可以将其作为文件挂载,并将GOOGLE_DEFAULT_CREDENTAILS设置为指向它
  2. 也许可以拒绝对实例的元数据API进行访问,或者可以更改元数据API返回的服务帐户吗?
  3. 也许有一种GKE(或kubernetes)本地方式来控制呈现给pod的服务帐户?

1 个答案:

答案 0 :(得分:2)

你走在正确的轨道上。 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将根据已安装的服务帐户进行访问,而不是为分配给该节点的帐户提供服务。

有关详细信息,请查看链接: