什么是 Workload Identity?
在 GKE 上运行的应用可能需要访问 Google Cloud API,例如 Compute Engine API、BigQuery Storage API 或 Pub Sub API。
Workload Identity 允许 GKE 集群中的 Kubernetes 服务帐号充当 IAM 服务帐号。访问 Google Cloud API 时,使用已配置 Kubernetes 服务帐号的 Pod 会自动作为 IAM 服务帐号进行身份验证。通过工作负载身份,您可以为集群中的每个应用分配不同的精细身份和授权。
Workload identity 有什么好处呢?
对开发人员,我们不用再每三个月去rotate service account key。
WHY?因为使用了Workload Identity, 只用创建google service account,不用生成key file,大大减少了安全风险。
在没有Workload Identity 之前,我们一般会使用以下两种方案从GKE访问Google Cloud API.
- 导出服务帐号密钥并将其存储为 Kubernetes Secret。Google 服务帐号密钥不会过期,并且需要手动轮替。如果有未被发现的安全漏洞,则导出服务帐号密钥可能会导致安全漏洞范围扩大。如果导出的密钥被盗,攻击者可以使用该密钥以服务帐号的身份进行身份验证,直到您发现并手动撤消密钥。
- 使用节点的 Compute Engine 默认服务帐号。您可以使用项目中的任何 IAM 服务帐号身份运行节点池。如果您在创建节点池期间未指定服务帐号,则 GKE 会使用项目的 Compute Engine 默认服务帐号。Compute Engine 服务帐号由该节点上部署的所有工作负载共享。这会导致权限过度预配,从而违反最小权限原则,不适合多租户集群。
上面两种方案都有安全入侵的风险,所以Google官方也建议我们使用Workload Identity。
如何使用 Workload Identity 呢?
首先,我们需要为GKE Cluster 启用Workload Identity,然后应该将应用配置为使用Workload Identity 向 Google Cloud 进行身份验证。
为GKE Cluster 启用 Workload Identity
-
创建新集群
创建新集群,创建的时候直接开启 Workload Identity.
gcloud container clusters create CLUSTER_NAME \
--region=COMPUTE_REGION \
--workload-pool=PROJECT_ID.svc.id.goog
替换以下内容:
-
CLUSTER_NAME
:新集群的名称。 -
COMPUTE_REGION
:集群的 Compute Engine 区域。对于区域级集群,请使用--zone=COMPUTE_ZONE
。 -
PROJECT_ID
:您的 Google Cloud 项目 ID。
- 更新现有的标准集群(PS: Autopilot 集群默认已经开启了Workload Identity)
gcloud container clusters update CLUSTER_NAME \
--region=COMPUTE_REGION \
--workload-pool=PROJECT_ID.svc.id.goog
替换以下内容:
-
CLUSTER_NAME
:新集群的名称。 -
COMPUTE_REGION
:集群的 Compute Engine 区域。对于区域级集群,请使用--zone=COMPUTE_ZONE
。 -
PROJECT_ID
:您的 Google Cloud 项目 ID。
在现有集群上启用 Workload Identity 后,您可能需要迁移正在运行的工作负载以使用 Workload Identity。选择最适合您的环境的迁移策略。您可以创建新的节点池并启用 Workload Identity,也可以更新现有的节点池以启用 Workload Identity
。
将应用配置为使用 Workload Identity
Workload Identity 将 kubernetes service account 和 google service account 进行了绑定,参照如下步骤即可成功实现。
- 创建应用要部署的k8s namespace
kubectl create namespace NAMESPACE
- 为应用创建 Kubernetes service account
kubectl create serviceaccount KSA_NAME --namespace NAMESPACE
- 创建 Google IAM service account 或 使用现有的 IAM service account。
gcloud iam service-accounts create GSA_NAME --project=GSA_PROJECT
- 确保 IAM 服务帐号具有应用所需要的权限。可以使用以下命令授予其角色:
gcloud projects add-iam-policy-binding PROJECT_ID \
--member "serviceAccount:GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com" \
--role "ROLE_NAME"
- 通过在两个服务帐号之间添加 IAM 政策绑定,允许 Kubernetes 服务帐号模拟 IAM 服务帐号。以下绑定是允许 Kubernertes 服务帐号充当 IAM 服务帐号。
gcloud iam service-accounts add-iam-policy-binding GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com \
--role roles/iam.workloadIdentityUser \
--member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
- 使用 IAM 服务帐号的电子邮件地址为 Kubernetes 服务帐号添加注解.
kubectl annotate serviceaccount KSA_NAME \
--namespace NAMESPACE \
iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com
- 更新应用的Kubernetes Deployment文件,以在使用Workload Identity的节点上安排工作负载并使用已添加注解的Kubernetes service account. 然后重新部署应用就可以了。
spec:
serviceAccountName: KSA_NAME
替换以下内容:
-
KSA_NAME
:新 Kubernetes 服务帐号的名称。 -
NAMESPACE
:服务帐号的 Kubernetes 命名空间的名称。 -
GSA_NAME
:新 IAM 服务帐号的名称。 -
GSA_PROJECT
:IAM 服务帐号的 Google Cloud 项目的项目 ID。 -
PROJECT_ID
:您的 Google Cloud 项目 ID。 -
ROLE_NAME
:要分配给服务帐号的 IAM 角色,如 roles/spanner.viewer。
如何验证 Workload Identity 生效?
通过使用运行特定于操作系统的容器映像的 Kubernetes 服务帐号创建 Pod,然后通过交互式会话连接到该服务帐号,验证服务帐号是否配置正确。
apiVersion: v1
kind: Pod
metadata:
name: workload-identity-test
namespace: NAMESPACE
spec:
containers:
- image: google/cloud-sdk:slim
name: workload-identity-test
command: ["sleep","infinity"]
serviceAccountName: KSA_NAME
nodeSelector:
iam.gke.io/gke-metadata-server-enabled: "true"
部署上述pod,然后在pod中打开bash,查询GKE元数据。
kubectl exec -it workload-identity-test \
--namespace NAMESPACE \
-- /bin/bash
curl -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/
结束语
以上就是在GKE上使用Workload Identity,更多的信息大家可以参考google 官方文档,里面有更多详细的信息。