如何轻松切换 gcloud / kubectl 凭据

gtg*_*czd 11 google-cloud-platform gcloud kubernetes kubectl

在工作中,我们使用 GCP 中托管的 Kubernetes。我还有一个使用 Google App Engine 托管在我的个人GCP 帐户中的副项目(使用 部署gcloud app deploy)。

通常,当我尝试运行诸如 之类的命令时kubectl logs -f service-name,我会收到类似“来自服务器的错误(禁止):pods 被禁止:用户“my_personal_email@gmail.com”无法在命名空间中列出 API 组“”中的资源“pods”的错误“WORK_NAMESPACE”:需要“container.pods.list”权限。然后我必须与 kubectl 战斗几个小时才能让它工作。

有人可以为像我这样行动迟缓的人分解一下,如何gcloud一起kubectl工作,以及如何轻松切换帐户,以便我可以gcloud为我的个人项目使用命令,kubectl为我的工作项目使用命令吗?如果需要的话,我很乐意对我的整个配置进行核攻击并从头开始。我找到了各种kubectl文档gcloud,但没有多大意义,也没有什么意义。

编辑:这是在 Linux 上。

yur*_*s87 19

遇到了同样的问题并做了所有的事情:

gcloud auth login
gcloud auth list
gcloud config set account
gcloud projects list
Run Code Online (Sandbox Code Playgroud)

没有帮助。我知道gcloud切换得很好,因为我可以直接用它列出其他资源。但它似乎kubectl无法自动选择这些更改,因为kubectl/gcloud集成依赖于预先生成的密钥,该密钥的有效期为 1 小时(不确定它是否是默认值,但它现在在我的机器上)。因此,除了使用 设置正确的用户/项目/帐户之外gcloud,您还应该重新生成信用:

gcloud container clusters get-credentials <my-cluster> --zone <clusters-zone>

  • 最后一行是关键,这将强制 kubectl 使用新集群 (4认同)

Zev*_*ert 7

长话短说

编辑:Kubernetes 1.26 有与此答案相关的更改,现在用于gcloud auth管理不同的配置文件。

  1. 用于gcloud auth通过 Google Cloud Platform 管理您单独的个人资料。
  2. 添加一个显式gke-gcloud-auth-plugin帐户,以便在向您的 kubectl 配置文件 ( )请求令牌时使用~/.kube/config,以教导 kubectl 使用特定集群的特定帐户而不是您的活动帐户。
# file: ~/.kube/config
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 # <<< Add this line
Run Code Online (Sandbox Code Playgroud)

有人可以为像我这样的慢人解释一下,gcloud 和 kubectl 如何协同工作,以及我如何轻松切换帐户,以便我可以对我的个人项目使用 gcloud 命令,对我的工作项目使用 kubectl 命令吗?

当然!通过遵循 Google 建议的gcloud container clusters get-credentials ...配置 kubernetes 集群时运行的说明,您最终将获得 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
Run Code Online (Sandbox Code Playgroud)

基本上,这告诉在需要新令牌时kubectl运行gke-gcloud-auth-plugin,并且可以从该命令的输出中解析访问令牌。这是理解如何与 通信的关键kubectlgcloud

和你一样,我个人和工作中都使用谷歌云。问题在于,此用户配置块没有考虑到生成凭据时不应使用当前活动的 gcloud 帐户这一事实。即使您不在两个项目之一中使用 kubernetes,例如,当您在不同项目中处理某些内容时,vscode 中的扩展也可能会尝试运行 kubectl 命令。如果这种情况发生在您当前的令牌过期后,gke-gcloud-auth-plugin可能会被调用以使用个人帐户生成令牌。

为了防止这种情况发生,我建议使用gcloud config configuations. 配置是全局配置文件,您可以在它们之间快速切换。他们不仅可以存储帐户信息,还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
Run Code Online (Sandbox Code Playgroud)

设置多个配置时,您必须gcloud auth login使用单独的帐户运行。我们只需要指示 kubectl 使用特定帐户与给定集群进行通信,而不是使用处于活动状态的帐户。

因此,归结为:如果您将 kubeconfig 设置为在 kubectl 需要个人集群的新访问令牌时执行,则无论该工具gke-gcloud-auth-plugin --acount=your@work.email当前使用哪个帐户,它将使用您工作配置中的帐户gcloud。然后看起来像这样:

> 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
Run Code Online (Sandbox Code Playgroud)

在 Kubernetes 1.26 之前,过程是相同的,只是您将gcloud config configuration直接使用帐户,而不是帐户,因此:

  1. 用于gcloud config configurations通过 Google Cloud Platform 管理您单独的个人资料。

  2. 找到cmd-args您的 kubeconfig 用户,然后添加一个显式--configuration参数以防止gcloud为不相关的配置文件生成访问令牌。

    # file: ~/.kube/config
    users:
    - name: gke_project-name_cluster-zone_cluster-name
      user:
        exec:
          apiVersion: client.authentication.k8s.io/v1beta1
    
          # ----- Remove this ------
          args: null
          # -------------------------
          # +++++ Then add this: ++++
          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
    
    Run Code Online (Sandbox Code Playgroud)


小智 2

我和你的情况一样——在 GKE 中部署用于工作的应用程序,在我的个人 GCP 帐户中部署个人项目。

gcloud存储已登录帐户的列表,您可以在这些帐户之间切换以与关联项目进行通信。看看这些命令:

gcloud auth login
gcloud auth list
gcloud config set account
gcloud projects list
Run Code Online (Sandbox Code Playgroud)

要使用您的帐户之一下的特定项目,您需要通过以下方式设置该配置gcloud config set project PROJECT_ID

kubectl在您的本地计算机上有一个“上下文”列表~/.kube/config。您当前的上下文是您要运行命令的集群 - 类似于gcloud.

与这些不同的gcloud是,集群特定的信息存储在集群端点、默认命名空间、当前上下文等上。您可以拥有来自 GCP、AWS、本地的上下文……任何拥有集群的地方​​。我们为 dev、qa 和 prod 有不同的集群(因此有不同的上下文),并在它们之间进行大量切换。查看 [kubectx 项目][1] https://github.com/ahmetb/kubectx,了解在上下文和命名空间之间切换的更简单方法。

kubectl将使用您针对设置为当前上下文的集群登录的任何 GCP 帐户中的密钥。即,根据上面的错误,如果您的活动帐户gcloud是您的个人帐户,但尝试列出工作中集群中的 pod,您将收到错误消息。您需要将活动帐户/项目设置为gcloud工作电子邮件,或者将上下文更改kubectl为在您的个人 GCP 帐户/项目中托管的集群。