kubectl "error: You must be logged in to the server (Unauthorized)"使用 kubectx,而如果直接使用相同的配置,则不会出错



当我尝试配置与此处示例中的:连接的多个 KUBECONFIG 环境条目时,我遇到了奇怪的行为:

export KUBECONFIG=/Users/user/Work/company/project/setup/secrets/dev-qz/users/admin.conf:/Users/user/Work/company/project/setup/secrets/dev-wer/users/admin.conf:/Users/user/Work/company/project/setup/secrets/test-wer/users/admin.conf:/Users/user/Work/company/project/setup/secrets/test/users/admin.conf:/Users/user/Work/company/project/setup/secrets/dev-jg/users/admin.conf:/Users/user/Work/company/project/setup/secrets/preprod/users/admin.conf:/Users/user/Work/company/project/setup/secrets/dev/users/admin.conf:/Users/user/Work/company/project/setup/secrets/dev-fxc/users/admin.conf:/Users/user/Work/company/project/setup/secrets/cluster-setup/users/admin.conf:/Users/user/Work/company/project/setup/secrets/test-fxc/users/admin.conf:/Users/user/Work/company/project/setup/secrets/test-jg/users/admin.conf:/Users/user/Work/company/project/setup/secrets/test-qz/users/admin.conf

这就是正在发生的事情:如果我选择kubectx集群(不是列表中的每个集群,而是任何一个(,当我尝试kubectl get po时,我会收到:error: You must be logged in to the server (Unauthorized). 但是,如果尝试访问同一集群,则将其直接传递给 kubectl 命令--kubeconfig=<path to the config>它就可以工作了。 我对此非常挣扎,只是想知道是否有其他人也面临此类问题以及如何解决它

最终我发现了问题。向我建议的扁平命令@mario帮助我更好地调试情况。

基本上,in memoryin file合并,做了它应该做的事情:创建一个 kubeconfig,其中包含每个 kubeconfig 文件的所有 uniq 参数。这非常有效,除非 unbeconfig 或多个 kubeconfig 具有标识相同组件的相同标签。在这种情况下,按顺序排列的last获胜。因此,如果您有以下示例:

grep -Rn 'name: kubernetes-admin$' infra/secrets/*/users/admin.conf
infra/secrets/cluster1/users/admin.conf:16:- name: kubernetes-admin
infra/secrets/cluster2/users/admin.conf:17:- name: kubernetes-admin
infra/secrets/cluster3/users/admin.conf:16:- name: kubernetes-admin

cluster1cluster2不起作用,而cluster3将正常工作,顺便说一下,由于订单。 此问题的解决方案是通过重命名标识用户的标签来避免非 uniq 字段(对于上面的示例(。完成此更改后,一切都将完美运行。

我同意@Bernard。这看起来不像是特定于kubectx的任何内容,因为它只是一个bash 脚本,在引擎盖下使用二进制kubectl。你可以在这里看到它的代码。kubectl我想如果您不提供

但是,如果尝试访问同一集群,则将其直接传递给 kubectl 命令与 --kubeconfig= 它有效。

测试它的方式有些不一致,因为您没有向两个命令提供特定的kubeconfig文件。当您使用kubectx时,它依赖于多个内存中合并的kubeconfig文件,并将其与直接指定应使用的kubeconfig文件的工作kubectl示例进行比较。为了使此比较保持一致,您还应该将kubectx与此特定kubeconfig文件一起使用。如果在不指定kubectl的情况下运行命令会发生什么--kubeconfig=<path to the config>?我猜你得到的错误与运行kubectx时得到的错误类似。如果我错了,请纠正我。

作者Ahmet Alp Balkan写了一篇非常好的文章kubectx它很好地解释了如何使用多个kubeconfig文件。正如您在文章中读到的:

提示 2:一次使用多个 kubeconfig

有时你有一堆小的 kubeconfig 文件(例如每个一个 cluster(,但你想一次使用它们,使用这样的工具kubectlkubectx同时处理多个上下文。

为此,您需要一个"合并"的 kubeconfig 文件。提示#3解释了如何 您可以将 kubeconfigs 合并到一个文件中,但您也可以 将它们合并到内存中。

通过在环境变量中指定多个文件KUBECONFIG, 你可以暂时将 kubeconfig 文件拼接在一起并使用它们 在库贝克特尔。

export KUBECONFIG=file1:file2
kubectl get pods --context=cluster-1
kubectl get pods --context=cluster-2

提示 3:合并 kubeconfig 文件

由于 kubeconfig 文件是结构化的 YAML 文件,你不能只是 附加它们以获得一个大的 kubeconfig 文件,但 kubectl 可以帮助您 合并这些文件:

KUBECONFIG=file1:file2:file3 kubectl config view --merge --flatten > out.txt

可能的解决方案:

  1. 尝试将多个kubeconfig文件合并为一个文件,如上例所示,以查看是否可能仅内存中合并有问题:

    KUBECONFIG=file1:file2:file3 kubectl config view --merge --flatten> out.txt

  2. 查看所有kubeconfigs并单独测试它们,以确保它们在单独KUBECONFIGenv 变量中指定时是否正常工作。其中一个中可能存在一些导致问题的错误。

最新更新