像ECS服务一样,如何将服务帐户附加到gke部署/服务?

时间:2018-12-02 22:16:27

标签: kubernetes google-cloud-platform amazon-ecs google-kubernetes-engine google-cloud-iam

我来自AWS,不确定如何使用gcp执行此操作。以前我问过一个关于服务帐户的更一般的问题,这是gke特有的。

在AWS中,我可以创建ECS服务角色。我将策略附加到该角色以为其提供所需的访问权限。然后,将角色附加到ECS服务。因此,我可以将多个服务部署到同一个ECS群集,并为它们提供不同的访问权限,而无需使用静态密钥,也不会传递秘密。

我如何用gke做到这一点?如何将gcp iam服务帐户附加到gke部署/服务等?您可以在部署Yaml中使用注释来附加服务帐户吗?

我想在同一个gke集群上使用不同的服务帐户隐式地拥有多个部署和服务(不使用任何密钥)

1 个答案:

答案 0 :(得分:1)

简介:

Google Cloud Kubernetes集群由Compute Engine VM实例组成。创建群集时,默认服务帐户将附加到每个VM实例。这些凭据存储在实例元数据中,可以通过使用默认应用程序Client()实例化(应用程序默认凭据)或指定凭据位置进行访问。

ADC凭据搜索:

from google.cloud import storage
client = storage.Client()

或仅来自元数据:

from google.auth import compute_engine
from google.cloud import storage
credentials = compute_engine.Credentials()
client = storage.Client(credentials=credentials, project=project)

[更新]

我不想宣传不良的安全做法。在安全的生产Kubernetes集群上应禁止使用上述技术。

  1. 为Kubernetes集群使用最低特权的服务帐户。
  2. 禁用旧版元数据服务器API并使用元数据隐藏。
  3. 使用Pod安全策略。
  4. 为节点池使用单独的服务帐户。
  5. 使用网络策略限制pod之间的流量。

[结束更新]

Google Kubernetes方法:

Kubernetes的推荐技术是为集群中运行的每个应用程序创建一个单独的服务帐户,并缩小应用于默认服务帐户的范围。分配给每个服务帐户的角色取决于应用程序所需的权限。

服务帐户凭据作为Json文件下载,然后作为Secret存储在Kubernetes中。然后,您将使用机密(凭据)装入该卷。然后,在容器中运行的应用程序在创建Google Application Clients(例如访问Cloud Storage)时将需要加载凭据。

此命令会将下载的凭据文件存储在Kubernetes机密卷中,作为名为service-account-credentials的机密。 Kubernetes中的凭证文件名为key.json。凭据是从从Google Cloud下载的文件中加载的,该文件名为`/secrets/credentials.json

kubectl create secret generic service-account-credentials --from-file=key.json=/secrets/credentials.json

在部署文件中,添加以下内容以安装该卷。

spec:
  volumes:
  - name: google-cloud-key
    secret:
      secretName: service-account-credentials
...
  containers:
    volumeMounts:
    - name: google-cloud-key
      mountPath: /var/secrets/google

在容器内部,凭据是从/var/secrets/google/key.json加载的

Python示例:

from google.cloud import storage
client = storage.Client.from_service_account_json('/var/secrets/google/key.json')

该文档提供了有关使用Kubernetes服务帐户凭据的分步详细信息。

Authenticating to Cloud Platform with Service Accounts