Kubectl如何在不同的集群(上下文)同时工作



在这种情况下,我有多个Kubernetes集群,并希望同时在不同的集群上工作。(将保持它作为两个集群,使它简单)

正如Kubernetes文档中所描述的,我已经配置了两个集群(将它们称为dc1-main和dc2-main)

我正在登录kubectl所在的节点,使用应用程序支持用户(例如appuser)

在与管理服务器的两次会话中,我同时使用appuser登录。

在本例中,我想使用kubectl在每个会话上管理一个上下文。

但是,如果我将活动上下文设置为如下所示,则到服务器的两个会话都反映得到更改,因为它们都引用相同的配置文件(其中包含两个上下文)

kubectl config use-context dc1-main

或文档中另一个选择是通过上下文命令作为参数。这使得命令非常复杂。

kubectl --context="dc2-main" get nodes

我正在寻找一种简单的方法来快速改变这一点,以改变上下文而不影响其他会话。这很可能是环境变量。我不确定这是不是最简单的方法。

我浏览了kubectl项目的GitHub,发现很久以前就有人要求修改类似的内容,并讨论了环境变量。

有更好的建议吗?

标准Kubernetes客户端库支持$KUBECONFIG环境变量。这意味着几乎每个工具都支持它,包括Helm和您拥有的任何本地构建的工具。您可以将其设置为指向特定于集群的配置的路径。因为它是一个环境变量,所以每个shell都有它自己的副本。

export KUBECONFIG="$HOME/.kube/dc1-main.config"
kubectl get nodes
在shell dotfiles中,您可以编写一个简单的shell函数来设置这个
kubecfg() {
export KUBECONFIG="$HOME/.kube/$1.config"
}

在我的使用中,每个kubecconfig文件中只有一个上下文(user/host/credentials),所以我几乎从不使用kubectl config系列命令。这确实意味着,无论您最初如何设置kubecconfig文件,您都需要为每个集群重复这些步骤,或者手动拆分现有的kubecconfig文件(它是YAML,因此相当可行)。

# specifically for Amazon Elastic Kubernetes Service
kubecfg dc1-main
aws eks update-kubeconfig --name dc1-main ...
kubecfg dc2-main
aws eks update-kubeconfig --name dc2-main ...

想要编写配置的工具也使用这个变量,对于我来说,如果我想要重新创建我的minikube环境,它通常会出现。一旦你创建了这些文件,你可能会发现chmod 0400 "$KUBECONFIG"保护它们是有用的。

不是最好的解决方案,但对我来说最快的解决方案之一是创建VM或远程实例(如free m2)。微AWS),并通过SSHVM UI具有多个配置对其进行操作

但是你可以看看这个this指令,在这里你可以在不同的shell会话中导出不同的kubecconfig。

David Maze的答案是基于kubectl的最佳实践

我建议你使用:

<<ul>
  • GUI:镜头/gh>
  • 退:k9
  • 在TUI中,你可以在分离的控制台会话中使用它,它将缓存kube配置

    k9s --context eks-1
    k9s --context eks-2
    

    我想添加我的快速解决方案作为答案。

    创建如下两个别名部分解决了问题。

    alias kdc1='kubectl --context="dc1-main"'
    alias kdc2='kubectl --context="dc2-main"'
    

    这给了我两个快速的命令来访问两个上下文。

    但是问题是如果我使用像helm这样的命令

    最新更新