最初发表于pbhadani.com

在这篇博客中,我将讨论 GKE Workload Identity 功能以及为什么要使用此功能。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--gc8ApOuY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev. s3.amazonaws.com/i/jxwpgdkm0cusoodo6wgw.jpg)

照片由cuttersnap拍摄于Unsplash

有什么问题?

在 GKE 上运行的应用程序必须经过身份验证才能使用 Google 服务,例如 Google Cloud Storage (GCS)、Cloud SQL、BigQuery 等。

可以通过使用 Kubernetes 秘密空间或其他方法(如 Vault)向应用程序提供服务帐户密钥 JSON 文件来完成身份验证。

但在这些方法中,服务帐户密钥 JSON(其生命周期为 10 年)必须以纯文本形式存储在 pod 中或在 Kubernetes 秘密空间中编码的 base64 中。

此外,密钥轮换过程必须在一个不好玩的地方。

我们可以通过将服务帐户附加到 Kubernetes 节点来避免使用服务帐户密钥,但是节点上运行的所有 pod 都获得相同的权限,这不是一个理想的做法。

目标?

我们想为 Pod 分配一个服务帐户,以便我们可以隔离不同 pod 的权限。

万岁,我们在测试版中提供了工作负载身份功能,它解决了 GKE 上的这个问题。

那么,什么是工作负载标识?

根据 Google 文档,“Workload Identity 是从 GKE 中访问 Google Cloud 服务的推荐方式,因为它改进了安全属性和可管理性。

GKE 工作负载身份允许我们将服务帐户附加到 Kubernetes pod 并消除在 pod 或集群中管理服务帐户凭证 JSON 文件的麻烦。

让我们在 GKE 集群中使用 Workload Identity

先决条件

1.如果您的工作站上没有设置gcloud,那么请参考我的之前的博客快速启动并运行。

或者,您可以使用Google Cloud Shell运行命令。

  1. 确保您是项目编辑者或项目所有者或有足够的权限运行以下命令。

设置GKE集群

按照以下步骤创建新的 GKE 集群并启用 Workload Identity。

第 1 步: 启用Cloud IAM API。

第 2 步: 安装和配置gke-gcloud-auth-plugin

gke-gcloud-auth-plugin是 GKE 的新 Kubectl 身份验证插件。请阅读文档了解更多详细信息。

  • 安装插件
gcloud components install gke-gcloud-auth-plugin

进入全屏模式 退出全屏模式

注意: 如果禁用gcloud CLI component manager,请使用yumapt包安装此插件。

对于 Debian:

sudo apt-get install google-cloud-sdk-gke-gcloud-auth-plugin

进入全屏模式 退出全屏模式

  • 配置插件
echo "export USE_GKE_GCLOUD_AUTH_PLUGIN=True" >> ~/.bashrc
source ~/.bashrc

进入全屏模式 退出全屏模式

第 3 步: 设置 GCP 默认值。

  • 设置GCP项目
  export GCP_PROJECT_ID=<YOUR_GCP_PROJECT_ID>

  gcloud config set project $GCP_PROJECT_ID

进入全屏模式 退出全屏模式

  • 设置默认区域和区域
  gcloud config set compute/region europe-west1

  gcloud config set compute/zone europe-west1-b

进入全屏模式 退出全屏模式

第 4 步: 确保您已安装kubectl命令。

   sudo apt-get install kubectl

进入全屏模式 退出全屏模式

运行以下验证

   kubectl help

进入全屏模式 退出全屏模式

注意: 请参考文档:外部包管理器

第 5 步: 创建一个新的 Google 服务帐户 (GSA)。

  gcloud iam service-accounts create workload-identity-test

进入全屏模式 退出全屏模式

笔记:

您可以使用现有的服务帐户。

所需权限:GCP 项目的iam.serviceAccounts.create

第 6 步: 为应用所需的 Google 服务帐户添加权限。例如,roles/storage.objectViewer

  gcloud projects add-iam-policy-binding $GCP_PROJECT_ID \
  --member serviceAccount:workload-identity-test@${GCP_PROJECT_ID}.iam.gserviceaccount.com \
  --role roles/storage.objectViewer

进入全屏模式 退出全屏模式

步骤 7: 设置启用了 Workload Identity 的 GKE 集群。

  export GKE_CLUSTER_NAME=gke-wi

进入全屏模式 退出全屏模式

  gcloud container clusters create $GKE_CLUSTER_NAME \
  --cluster-version=1.24 \
  --workload-pool=$GCP_PROJECT_ID.svc.id.goog

进入全屏模式 退出全屏模式

笔记:

GKE 集群可能需要 5-10 分钟才能完全正常运行。

所需权限:GCP 项目的container.clusters.create

第 8 步: 在终端上配置kubectl命令。

  gcloud container clusters get-credentials $GKE_CLUSTER_NAME

进入全屏模式 退出全屏模式

笔记:

这将填充~/.kube/config文件。

所需权限:GCP 项目的container.clusters.get

步骤 9:(可选)如果您不想使用default命名空间,请创建一个 Kubernetes 命名空间。

  kubectl create namespace newspace

进入全屏模式 退出全屏模式

第 10 步: 创建 Kubernetes 服务帐户 (KSA)。

  kubectl create serviceaccount \
 --namespace newspace \
 workload-identity-test-ksa

进入全屏模式 退出全屏模式

Step 11: 绑定 Google Service Account (GSA) 和 Kubernetes Service Account (KSA),让 KSA 可以使用授予 GSA 的权限。

  gcloud iam service-accounts add-iam-policy-binding \
  --role roles/iam.workloadIdentityUser \
  --member "serviceAccount:${GCP_PROJECT_ID}.svc.id.goog[newspace/workload-identity-test-ksa]" \
  workload-identity-test@${GCP_PROJECT_ID}.iam.gserviceaccount.com

进入全屏模式 退出全屏模式

第 12 步: 添加注释

  kubectl annotate serviceaccount \
  --namespace newspace \
  workload-identity-test-ksa \
  iam.gke.io/gcp-service-account=workload-identity-test@${GCP_PROJECT_ID}.iam.gserviceaccount.com

进入全屏模式 退出全屏模式

第 13 步: 使用创建的 KSA 创建一个 Pod 以进行验证。

  kubectl run --rm -it test-pod \
  --image google/cloud-sdk:slim \
  --namespace newspace \
  --overrides='{ "spec": { "serviceAccount": "workload-identity-test-ksa" }  }' sh

进入全屏模式 退出全屏模式

运行上面的命令将登录到 Pod 并提供它的 bash shell。

现在运行下面的命令来查看这个 pod 配置了哪个服务帐户。

  gcloud auth list

进入全屏模式 退出全屏模式

这应该打印 GSA 名称。

                           Credentialed Accounts
    ACTIVE  ACCOUNT
    *       workload-identity-test@workshop-demo-namwcb.iam.gserviceaccount.com

进入全屏模式 退出全屏模式

清理

不要忘记清理资源,一旦你不再需要它。

运行以下命令:

第 1 步: 删除 GKE 集群。

  gcloud container clusters delete $GKE_CLUSTER_NAME

进入全屏模式 退出全屏模式

第 2 步: 删除 Google 服务帐户 (GSA)。

  gcloud iam service-accounts delete workload-identity-test@${GCP_PROJECT_ID}.iam.gserviceaccount.com

进入全屏模式 退出全屏模式

下面是终端记录:

希望这篇博客能帮助您熟悉 Workload Identity 并在 GKE 上安全地部署应用程序。

如果您有任何反馈或问题,请通过LinkedIn或Twitter与我联系

Logo

CI/CD社区为您提供最前沿的新闻资讯和知识内容

更多推荐