简短概述
编辑:Kubernetes 1.26 对此答案有所更改,现在请使用 gcloud auth
来管理您的不同配置文件。
- 使用
gcloud auth
来管理您在 Google Cloud Platform 上的不同配置文件。
- 将一个明确的帐户添加到您的 kubectl 配置文件(
~/.kube/config
)中,以便在请求使用 gke-gcloud-auth-plugin
生成令牌时,教会 kubectl 使用特定帐户与某个集群配对,而不是使用您的活动帐户。
users:
- name: gke_project-name_cluster-zone_cluster-name
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
command: gke-gcloud-auth-plugin
args:
- --account=your@work.email
有没有人能给像我这样的慢人解释一下,gcloud和kubectl是如何协同工作的,以及我如何轻松切换帐户,以便我可以在个人项目中使用gcloud命令,而在工作项目中使用kubectl命令?
当配置kubernetes集群并按照谷歌建议的指示运行"gcloud container clusters get-credentials ..."时,您将获得kubeconfig的一部分,其中包含有关kubectl如何执行操作以获取访问令牌的信息,当与配置了给定用户的群集通信时。它看起来会像这样:
users:
- name: gke_project-name_cluster-zone_cluster-name
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
args: null
command: gke-gcloud-auth-plugin
env: null
installHint: Install gke-gcloud-auth-plugin for use with kubectl by following
https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
interactiveMode: IfAvailable
provideClusterInfo: true
基本上,这告诉kubectl
在需要新令牌时运行gke-gcloud-auth-plugin
,并且访问令牌可以从该命令的输出中解析出来。 这是理解kubectl
如何与gcloud
通信的关键所在。
像您一样,我个人和工作中都使用Google Cloud。问题在于,此用户配置块没有考虑到它在生成凭据时不应该使用当前活动的gcloud帐户。即使您在两个项目中都没有使用kubernetes,例如vscode中的扩展程序可能会尝试在您处理其他项目时运行kubectl命令。如果在当前令牌过期后发生这种情况,则可能会调用gke-gcloud-auth-plugin
以使用个人帐户生成令牌。
为了防止这种情况发生,我建议使用gcloud config configurations
。配置是全局配置文件,您可以快速切换。它们可以存储更多的信息,而不仅仅是帐户信息,任何gcloud config ...
都可以保存。例如,我有两个配置看起来像这样:
> gcloud config configurations list
NAME IS_ACTIVE ACCOUNT PROJECT COMPUTE_DEFAULT_ZONE COMPUTE_DEFAULT_REGION
work False zev@work.email work-project us-west1-a us-west1
personal True zev@personal.email personal-project northamerica-northeast1-a northamerica-northeast1
当设置多个配置时,您将需要使用不同的帐户运行gcloud auth login
。我们只需要指示kubectl使用特定的帐户与给定的集群通信,而不是当前活动的帐户。
所以问题就变成了这样:如果您设置kubeconfig以在kubectl需要为您的个人集群获取新的访问令牌时执行gke-gcloud-auth-plugin --acount=your@work.email
,它将使用您工作配置中的帐户,而不管当前活动的帐户是哪个gcloud
工具。那么它看起来会像这样:
users:
- name: gke_project-name_cluster-zone_cluster-name
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
args: null
args:
- --account=your@work.email
command: gke-gcloud-auth-plugin
env: null
installHint: Install gke-gcloud-auth-plugin for use with kubectl by following
https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
interactiveMode: IfAvailable
provideClusterInfo: true
在 Kubernetes 1.26 之前,流程是相同的,只不过您需要直接使用
gcloud config configuration
而不是帐户,因此:
使用 gcloud config configurations
来管理您在 Google Cloud Platform 中的不同配置文件。
找到您的 kubeconfig 用户的 cmd-args
,然后添加显式的 --configuration
参数,以防止 gcloud
为无关的配置文件生成访问令牌。
users:
- user:
auth-provider:
config:
cmd-args: config --configuration=work config-helper --format=json
KUBECONFIG
;您可以在上下文中包含命名空间,因此不仅可以默认到特定的集群和授权对,还可以默认到一个命名空间。 - DazWilkingcloud
如何与kubectl
配合使用:https://medium.com/google-cloud/kubernetes-engine-kubectl-config-b6270d2b656c - DazWilkin