在两个完全独立的项目之间来回切换 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.com
和 user2@client2.example.com
).
我是一名刚接触 K8s 和 GCP 的自由职业者。我碰巧在两个不同的项目上, 刚刚 大约在同一时间开始使用这两种技术,我正试图从同一台笔记本电脑管理来自这两个客户端的集群和项目。我希望能够在每个客户端及其各自的 K8s/GCP 项目之间来回切换,我正在寻找用于来回切换的所有 kubectl 和 gcloud 命令的列表。
所以重申一下:
- 客户 #1
- 项目 ABC
- 客户#2
- 项目 DEF
当我在本地 运行 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。
无论哪种方式,我都在寻找我可以使用的确切命令,以便:
- 当我“连接到”(指向)客户端 #1 时,所有
gcloud
和 kubectl
命令都限定在他们和他们的项目范围内;和
- 当我“连接到”(指向)客户端 #2 时,所有
gcloud
和 kubectl
命令都限定在他们和他们的项目范围内;和
- 我有一个简单的方法来判断我“连接到”了哪个 client/project/cluster,这样我就不会无意中 运行
kubectl
和 gcloud
命令打算用于一个客户,但实际上弄乱了另一个 的集群
在此先感谢您提供的所有帮助。
您希望努力保持这些集群的独特性,这是可以理解的。无论您选择哪种解决方案,您都需要保持勤奋。这是因为,平台提供商希望(维护安全性)同时减少“摩擦”,因此这是开发人员面临的共同挑战。
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 上)。您可以打开此文件并查看其结构。它包含 clusters
、contexts
(稍后会详细介绍)、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.com
和 user@company2.com
,access-token
对于一个客户的集群 不会 允许您访问另一个集群。因此这提供了最强的分离。
如果您只有一个 Google 帐户,则需要在代表每个集群的 contexts
之间进行一些勤奋的切换。当您最初对每个集群进行身份验证时(可能使用 gcloud container clusters get-credentials
,条目被写入 ${HOME}/.kube/config
两个集群和上下文也应该被创建。
查看文件以了解内容是最简单的方法。但是 (!) 应该至少有 2 个不同的 contexts
并且它们的条目应该与 clusters
和 users
.
中的条目结合
然后您可以简单地:
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
Edit/Update:我应该注意到,对于这两个 clients/projects,我确实有 2 个单独的 Gmail 帐户(user1@client1.example.com
和 user2@client2.example.com
).
我是一名刚接触 K8s 和 GCP 的自由职业者。我碰巧在两个不同的项目上, 刚刚 大约在同一时间开始使用这两种技术,我正试图从同一台笔记本电脑管理来自这两个客户端的集群和项目。我希望能够在每个客户端及其各自的 K8s/GCP 项目之间来回切换,我正在寻找用于来回切换的所有 kubectl 和 gcloud 命令的列表。
所以重申一下:
- 客户 #1
- 项目 ABC
- 客户#2
- 项目 DEF
当我在本地 运行 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。
无论哪种方式,我都在寻找我可以使用的确切命令,以便:
- 当我“连接到”(指向)客户端 #1 时,所有
gcloud
和kubectl
命令都限定在他们和他们的项目范围内;和 - 当我“连接到”(指向)客户端 #2 时,所有
gcloud
和kubectl
命令都限定在他们和他们的项目范围内;和 - 我有一个简单的方法来判断我“连接到”了哪个 client/project/cluster,这样我就不会无意中 运行
kubectl
和gcloud
命令打算用于一个客户,但实际上弄乱了另一个 的集群
在此先感谢您提供的所有帮助。
您希望努力保持这些集群的独特性,这是可以理解的。无论您选择哪种解决方案,您都需要保持勤奋。这是因为,平台提供商希望(维护安全性)同时减少“摩擦”,因此这是开发人员面临的共同挑战。
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 上)。您可以打开此文件并查看其结构。它包含 clusters
、contexts
(稍后会详细介绍)、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.com
和 user@company2.com
,access-token
对于一个客户的集群 不会 允许您访问另一个集群。因此这提供了最强的分离。
如果您只有一个 Google 帐户,则需要在代表每个集群的 contexts
之间进行一些勤奋的切换。当您最初对每个集群进行身份验证时(可能使用 gcloud container clusters get-credentials
,条目被写入 ${HOME}/.kube/config
两个集群和上下文也应该被创建。
查看文件以了解内容是最简单的方法。但是 (!) 应该至少有 2 个不同的 contexts
并且它们的条目应该与 clusters
和 users
.
然后您可以简单地:
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