当我尝试配置与此处示例中的:
连接的多个 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 memory
或in 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
cluster1
和cluster2
不起作用,而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(,但你想一次使用它们,使用这样的工具
kubectl
或kubectx
同时处理多个上下文。为此,您需要一个"合并"的 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
可能的解决方案:
尝试将多个
kubeconfig
文件合并为一个文件,如上例所示,以查看是否可能仅内存中合并有问题:KUBECONFIG=file1:file2:file3 kubectl config view --merge --flatten> out.txt
查看所有
kubeconfigs
并单独测试它们,以确保它们在单独KUBECONFIG
env 变量中指定时是否正常工作。其中一个中可能存在一些导致问题的错误。