用于在两个 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 集群中。我想知道如何在它们之间来回切换,这样当我 运行 kubectl
和 gcloud
命令时,我不会无意中将它们应用到错误的 project/account .
答案基本上是利用 kubectl config set-context
和脚本。
这个问题(今天)是那个问题的延伸,可以说是“第 2 部分”。
我对 订单 感到困惑,其中我:
- 设置 K8s 上下文(再次通过
kubectl config set-context ...
);和
- 运行
gcloud init
;和
- 运行
gcloud auth
;和
- 可以安全地 运行
kubectl
和 gcloud
命令并确保我访问了正确的 GKE 集群
我的 理解 是 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_token
和 token_expiry
。然后 GKE 可以使用 access_token
来验证用户。并且,如有必要,可以在到期后使用 Google 的令牌端点更新令牌 (token_expiry
)。
场景
那么,你如何结合以上所有内容。
- 使用您的所有 Google 帐户验证
gcloud
ACCOUNT="client1@gmail.com"
gcloud auth login ${ACCOUNT}
ACCOUNT="client2@gmail.com"
gcloud auth login ${ACCOUNT} # Last will be the `ACTIVE` account
- 枚举这些
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`
- 在
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
- 为任何|所有您的 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-clusters
、gcloud 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.
- 列出
kubectl
个上下文
kubectl config get-context
产量:
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* client1 a-cluster client1
client2 b-cluster client2
- 在
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}
几周前我问过 kubectl
和 gcloud
命令时,我不会无意中将它们应用到错误的 project/account .
答案基本上是利用 kubectl config set-context
和脚本。
这个问题(今天)是那个问题的延伸,可以说是“第 2 部分”。
我对 订单 感到困惑,其中我:
- 设置 K8s 上下文(再次通过
kubectl config set-context ...
);和 - 运行
gcloud init
;和 - 运行
gcloud auth
;和 - 可以安全地 运行
kubectl
和gcloud
命令并确保我访问了正确的 GKE 集群
我的 理解 是 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_token
和 token_expiry
。然后 GKE 可以使用 access_token
来验证用户。并且,如有必要,可以在到期后使用 Google 的令牌端点更新令牌 (token_expiry
)。
场景
那么,你如何结合以上所有内容。
- 使用您的所有 Google 帐户验证
gcloud
ACCOUNT="client1@gmail.com"
gcloud auth login ${ACCOUNT}
ACCOUNT="client2@gmail.com"
gcloud auth login ${ACCOUNT} # Last will be the `ACTIVE` account
- 枚举这些
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`
- 在
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
- 为任何|所有您的 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-clusters
、gcloud 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 editkubectl
config directly (or usingkubectl config
commands) to rename these cluster, context and user references to suit your needs.
- 列出
kubectl
个上下文
kubectl config get-context
产量:
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* client1 a-cluster client1
client2 b-cluster client2
- 在
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}