如何像 EC​​S 服务一样将服务帐户附加到 gke deployment/servic?

How do you attach a service account to a gke deployment/servic like you can an ECS service?

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

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

如何使用 gke 执行此操作?如何将 gcp iam 服务帐户附加到 gke deployment/service 等?您可以在部署 yaml 中使用注释来附加服务帐户吗?

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

简介:

一个 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. 使用网络策略限制 pods 之间的流量。

[结束更新]

Google Kubernetes 方法:

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

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

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

的 Google 云下载的文件中加载凭据
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