用于在两个 GKE/kubectl 帐户和两封电子邮件之间切换的 CLI 命令排序

CLI command ordering for toggling between two GKE/kubectl accounts w/ two emails

几周前我问过 并得到了非常有帮助的答案。该问题的要点是:“我如何在同一台机器上的两个不同 K8s/GCP 帐户之间来回切换?”我有 2 个不同的 K8s 项目和 2 个不同的电子邮件(gmails) 存在于 2 个不同 GCP 帐户中的 2 个不同 GKE 集群中。我想知道如何在它们之间来回切换,这样当我 运行 kubectlgcloud 命令时,我不会无意中将它们应用到错误的 project/account .

答案基本上是利用 kubectl config set-context 和脚本。

这个问题(今天)是那个问题的延伸,可以说是“第 2 部分”。


我对 订单 感到困惑,其中我:

我的 理解gcloud init 只需 运行 一次来初始化系统上的 gcloud 控制台。我已经完成了。

所以我的想法是我可以做到以下几点:

# 1. switch K8s context to Project 1
kubectl config set-context <context for GKE project 1>

# 2. authenticate w/ GCP so that now gcloud commands will only hit the GCP
# resources associated with Project 1 (and GCP Account 1)
gcloud auth

# 3. run a bunch of kubectl and gcloud commands for Project/GCP Account 1

# 4. switch K8s context to Project 2
kubectl config set-context <context for GKE project 2>

# 5. authenticate w/ GCP so that now gcloud commands will only hit the GCP
# resources associated with Project 2 (and GCP Account 2)
gcloud auth

# 6. run a bunch of kubectl and gcloud commands for Project/GCP Account 2

我的理解是正确的还是比这更 involved/complicated(如果是,为什么)?

我假定我熟悉之前的

gcloud

gcloud init 每台机器只需要 运行 一次,如果你真的想重新init'初始化 CLI (gcloud).

gcloud auth login ${ACCOUNT} 对 (Google)(用户或服务)帐户进行身份验证并保留(在 ${HOME}/.config/gcloud 中默认情况下在 Linux 上)并更新凭据。

gcloud auth list 列出了 gcloud auth login 的帐户。结果显示默认使用哪个帐户(ACTIVE*)。

有点不方便,在当前 ACTIVE 帐户之间切换的一种方法是更改​​ gcloud global(机器上的每个实例)配置,使用 gcloud config set account ${ACCOUNT}.

kubectl

为了便于在 Kubernetes Engine 中使用之前经过身份验证(即 gcloud auth login ${ACCOUNT})的凭据,Google 提供了命令 gcloud container clusters get-credentials。这使用当前 ACTIVE gcloud 帐户创建一个 kubectl 上下文,该上下文使用 User 并且可能还有 Kubernetes 命名空间加入 Kubernetes 集群。 gcloud container clusters get-credentials 更改 kubectl 配置(在 ${HOME}/.kube/config 中默认在 Linux 上)。

什么是用户?参见 Users in Kubernetes. Kubernetes Engine (via kubectl) wants (OpenID Connect) Tokens。而且,gcloud 可以方便地为我们提供这些令牌。

怎么样?根据之前的

user:
  auth-provider:
    config:
      access-token: [[redacted]]
      cmd-args: config config-helper --format=json
      cmd-path: path/to/google-cloud-sdk/bin/gcloud
      expiry: "2022-02-22T22:22:22Z"
      expiry-key: '{.credential.token_expiry}'
      token-key: '{.credential.access_token}'
    name: gcp

kubectl 使用配置文件调用 gcloud config config-helper --format=json 并从结果中提取 access_tokentoken_expiry。然后 GKE 可以使用 access_token 来验证用户。并且,如有必要,可以在到期后使用 Google 的令牌端点更新令牌 (token_expiry)。

场景

那么,你如何结合以上所有内容。

  1. 使用您的所有 Google 帐户验证 gcloud
ACCOUNT="client1@gmail.com"
gcloud auth login ${ACCOUNT}

ACCOUNT="client2@gmail.com"
gcloud auth login ${ACCOUNT} # Last will be the `ACTIVE` account
  1. 枚举这些
gcloud auth list

产量:

ACTIVE  ACCOUNT
        client1@gmail.com
*       client2@gmail.com # This is ACTIVE

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud 个命令的用户之间切换

NOTE This doesn't affect kubectl

或者

gcloud config set account client1@gmail.com
gcloud auth list

产量:

ACTIVE  ACCOUNT
*       client1@gmail.com # This is ACTIVE
        client2@gmail.com

你可以显式地添加--account=${ACCOUNT}任何gcloud命令,例如:

# Explicitly unset your account
gcloud config unset account

# This will work and show projects accessible to client1
gcloud projects list --account=client1@gmail.com

# This will work and show projects accessible to client2
gcloud projects list --account=client2@gmail.com
  1. 为任何|所有您的 Google 帐户创建 kubectl 上下文(通过 gcloud

或者

ACCOUNT="client1@gmail.com"
PROJECT="..." # Project accessible to ${ACCOUNT}
gcloud container clusters get-credentials ${CLUSTER} \
--ACCOUNT=${ACCOUNT} \
--PROJECT=${PROJECT} \
...

等同于直接使用kubectl config set-context

kubectl config set-context ${CONTEXT} \
--cluster=${CLUSTER} \
--user=${USER} \

但它避免了 gcloud config get-clustersgcloud config get-users

NOTE gcloud containers clusters get-credentials uses derived names for contexts and GKE uses derived names for clusters. If you're confident you can edit kubectl config directly (or using kubectl config commands) to rename these cluster, context and user references to suit your needs.

  1. 列出 kubectl 个上下文
kubectl config get-context

产量:

CURRENT   NAME       CLUSTER    AUTHINFO   NAMESPACE
*         client1    a-cluster  client1
          client2    b-cluster  client2
  1. kubectl 上下文(集群*用户)之间切换

NOTE This doesn't affect gcloud

或者

kubectl config use-context ${CONTEXT}

* 你可以显式地添加 --context 标记到 any kubectl 命令

# Explicitly unset default|current context
kubectl config unset current-context

# This will work and list deployments accessible to ${CONTEXT}
kubectl get deployments --context=${CONTEXT}