在GKE上用使用Workload Identity真香

2022-07-05  本文已影响0人  Mokaffee

什么是 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.

上面两种方案都有安全入侵的风险,所以Google官方也建议我们使用Workload Identity。

如何使用 Workload Identity 呢?

首先,我们需要为GKE Cluster 启用Workload Identity,然后应该将应用配置为使用Workload Identity 向 Google Cloud 进行身份验证。

为GKE Cluster 启用 Workload Identity

  1. 创建新集群
    创建新集群,创建的时候直接开启 Workload Identity.
gcloud container clusters create CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --workload-pool=PROJECT_ID.svc.id.goog

替换以下内容:

  1. 更新现有的标准集群(PS: Autopilot 集群默认已经开启了Workload Identity)
gcloud container clusters update CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --workload-pool=PROJECT_ID.svc.id.goog

替换以下内容:

在现有集群上启用 Workload Identity 后,您可能需要迁移正在运行的工作负载以使用 Workload Identity。选择最适合您的环境的迁移策略。您可以创建新的节点池并启用 Workload Identity,也可以更新现有的节点池以启用 Workload Identity

将应用配置为使用 Workload Identity

Workload Identity 将 kubernetes service account 和 google service account 进行了绑定,参照如下步骤即可成功实现。

  1. 创建应用要部署的k8s namespace
    kubectl create namespace NAMESPACE
  2. 为应用创建 Kubernetes service account
    kubectl create serviceaccount KSA_NAME --namespace NAMESPACE
  3. 创建 Google IAM service account 或 使用现有的 IAM service account。
    gcloud iam service-accounts create GSA_NAME --project=GSA_PROJECT
  4. 确保 IAM 服务帐号具有应用所需要的权限。可以使用以下命令授予其角色:
gcloud projects add-iam-policy-binding PROJECT_ID \
    --member "serviceAccount:GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com" \
    --role "ROLE_NAME"
  1. 通过在两个服务帐号之间添加 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]"
  1. 使用 IAM 服务帐号的电子邮件地址为 Kubernetes 服务帐号添加注解.
kubectl annotate serviceaccount KSA_NAME \
    --namespace NAMESPACE \
    iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com
  1. 更新应用的Kubernetes Deployment文件,以在使用Workload Identity的节点上安排工作负载并使用已添加注解的Kubernetes service account. 然后重新部署应用就可以了。
spec:
  serviceAccountName: KSA_NAME

替换以下内容:

如何验证 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 官方文档,里面有更多详细的信息。

上一篇 下一篇

猜你喜欢

热点阅读