在两个完全独立的项目之间来回切换 kubectl 和 gcloud 的命令

Commands to switch kubectl and gcloud back and forth between two totally separate projects

Edit/Update:我应该注意到,对于这两个 clients/projects,我确实有 2 个单独的 Gmail 帐户(user1@client1.example.comuser2@client2.example.com).


我是一名刚接触 K8s 和 GCP 的自由职业者。我碰巧在两个不同的项目上, 刚刚 大约在同一时间开始使用这两种技术,我正试图从同一台笔记本电脑管理来自这两个客户端的集群和项目。我希望能够在每个客户端及其各自的 K8s/GCP 项目之间来回切换,我正在寻找用于来回切换的所有 kubectl 和 gcloud 命令的列表。

所以重申一下:

当我在本地 运行 kubectl config get-clusters 我看到:

docker-desktop
gke_client-1-proj-abc-dev
gke_client-2-proj-def-dev
minikube

其中 gke_client-1-proj-abc-dev 是客户端 #1(项目 ABC)的开发环境 K8s 集群,gke_client-2-proj-def-dev 是客户端 #2(项目 DEF)的开发 K8s 集群。

然而当我运行:

gcloud projects list             
PROJECT_ID              NAME                     PROJECT_NUMBER
client-1-proj-abc       Client 1 Proj ABC Local  12345 (omitting actual project #s for brevity)
client-1-proj-abc-dev   Client 1 Proj ABC Dev    23456
client-1-proj-abc-qa    Client 1 Proj ABC QA     34567

因此 kubectl 似乎正确“连接”到两个客户端项目,但 gcloud 仅 logged-in/authenticated/connected 连接到客户端 #1 而不是客户端 #2。

无论哪种方式,我都在寻找我可以使用的确切命令,以便:

在此先感谢您提供的所有帮助。

您希望努力保持这些集群的独特性,这是可以理解的。无论您选择哪种解决方案,您都需要保持勤奋。这是因为,平台提供商希望(维护安全性)同时减少“摩擦”,因此这是开发人员面临的共同挑战。

NOTE I won't cover this but a complementary approach is for you to configure e.g. bash to change e.g. color settings based on configs. So, for example, you could configure bash to change your terminal's background to green for one customer and blue for another.

默认情况下,Kubernetes 将其集群配置存储在 ${HOME}/.kube/config 中的 YAML 文件中(在 Linux 上)。您可以打开此文件并查看其结构。它包含 clusterscontexts(稍后会详细介绍)、users 和元数据。 contexts 提供一个元组,将一个 cluster 绑定到一个 user(有时绑定到一个 namespace)。通常有一个 current-context 指向...当前(使用中)... context 设置。

对于 Google Kubernetes Engine (GKE),user 条目利用 gcloud(Google 的云平台 CLI)获得 access-token (token-key) 用于对 GKE 集群进行身份验证:

  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

为什么都是序言?

(我没试过,但考虑到上述情况)如果您有不同的 Google 帐户(例如每个客户的 user@company1.comuser@company2.comaccess-token 对于一个客户的集群 不会 允许您访问另一个集群。因此这提供了最强的分离。

如果您只有一个 Google 帐户,则需要在代表每个集群的 contexts 之间进行一些勤奋的切换。当您最初对每个集群进行身份验证时(可能使用 gcloud container clusters get-credentials,条目被写入 ${HOME}/.kube/config 两个集群和上下文也应该被创建。

查看文件以了解内容是最简单的方法。但是 (!) 应该至少有 2 个不同的 contexts 并且它们的条目应该与 clustersusers.

中的条目结合

然后您可以简单地:

kubectl use-context client-1
kubectl use-context client-2

您也可以显式在任何kubectl命令上指定--context,尽管这可能会变得很烦人:

kubectl get deployments \
--namespace=${NAMESPACE} \
--context=${CONTEXT}

您也可以创建自己的 (user-defined) 上下文,但您需要知道集群和用户的名称:

# Use a new name
kubectl config get-contexts

# Use one of each of these values
kubectl config get-clusters
kubectl config get-users

然后:

CLUSTER="..." # One of the above results
USER="..."    # One of the above results

NAMESPACE="..." # If you wish to use a specific cluster's namespace

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

将在您的 ${HOME}/.kube/config 中创建以下条目:

contexts:
- context:
    cluster: ${CLUSTER}
    namespace: ${NAMESPACE} # This is optional
    user: ${USER}
  name: ${CONTEXT}

然后你可以:

kubectl config use-context ${CONTEXT}
Switched to context "${CONTEXT}".

但是,除非您使用 kubectl config current-context 查询配置,否则您将看不到正在使用哪个 context 的视觉线索(除非您使用一些 bash 魔法如上所述)。

很久以前我在博客上写过这个。希望对你有帮助 Kubernetes Engine: kubectl config