kubernetes 使用go-client身份验证方法将kubeconfig文件装载到容器

icomxhvb  于 2023-03-01  发布在  Kubernetes
关注(0)|答案(1)|浏览(118)

我在Mac上使用Google Kubernetes Engine &我过去常常将Kubeconfig文件挂载到一个容器中,以便通过简单的-v /Users/johndoe/.kube/config:/home/johndoe/.kube/config从内部的某个程序中使用它
最近,一些云服务提供商,包括GCP和AWS改变了他们的kubeconfig认证方法,使用新的client-go凭证插件。
参见GCP中的blog post
所以现在的kubeconfig看起来像这样:

- name: my-cluster
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1beta1
      command: /opt/homebrew/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/gke-gcloud-auth-plugin
      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
      provideClusterInfo: true

当然,仅仅挂载kubeconfig文件是行不通的,因为容器正在寻找/opt/homebrew/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/gke-gcloud-auth-plugin(这是一个将令牌返回给stdout的二进制文件,由于操作系统archs不同,我无法挂载这两个文件)。
因此,当运行任何kubectl命令时,我会得到以下错误。

Get "https://x.x.x.x/version": getting credentials: exec: fork/exec /opt/homebrew/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/gke-gcloud-auth-plugin: no such file or directory

这似乎是一个非常常见的用例,我该如何解决这个问题?

nwo49xxi

nwo49xxi1#

我已经找到了一种方法来“黑客”这一点,因为我无法找到一个干净的解决方案。
只需调用auth插件并将其输出发送到一个文件:

/opt/homebrew/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/gke-gcloud-auth-plugin > exec_credentials.json

创建一个shell脚本作为存根(此处为authStub.sh)

#!/bin/sh

cat /tmp/exec_credentials.json

然后使用docker运行命令装载shell脚本和凭据文件:

docker run \
    -v exec_credentials:/tmp/exec_credentials \
    -v authStub.sh:/opt/homebrew/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/gke-gcloud-auth-plugin

然后它会工作一个小时。

相关问题