当您使用minikube时,它会自动创建本地配置,因此可以使用了。似乎基于对kubectl config的引用,kubectl命令中支持多个集群。

在用于建立集群的文档中,有a reference to copying the relevant files to your local machine可以访问集群。我还发现了一个SO Q&A about editing your .kube/config to leverage azure remotely,可以编辑kube/config文件。

看起来环境变量$KUBECONFIG可以引用这些配置文件的多个位置,内置默认值为~/.kube/config(这是minikube创建的)。

如果我希望能够使用kubectl调用多个集群的命令,是否应该将相关的配置文件下载到新位置(例如,下载到~/gcloud/config中,设置KUBECONFIG环境变量以引用这两个位置?

还是在调用kubectl为集群指定配置时仅显式使用--kubeconfig选项更好?

我不确定是否有某种合并配置文件的方法会更好,并利用kubectl config set-contextkubectl config set-cluster命令代替。 Kubernetes上有关Configure Access to Multiple Clusters"的文档似乎暗示着使用--kubeconfig和这些kubectl config命令的另一种方式。

简而言之,与多个单独的kubernetes集群进行交互的最佳方法是什么?权衡是什么?

最佳答案



这可能取决于您发现的更简单,更方便的方法,以及是否需要考虑安全性和访问管理方面的问题。

  • 根据我们的经验,合并各种kubeconfig文件对于多集群操作非常有用,以便执行维护任务以及对一组集群(上下文和 namespace )进行事件管理,从而简化了基于比较配置, list 的故障排除问题。 ,K8s服务的资源和状态,容器,卷, namespace ,rs等。
  • 但是,当涉及自动化和部署(带有Jenkins,Spinnaker或Helm之类的工具)时,很可能拥有单独的kubeconfig文件可能是个好主意。混合方法可以根据服务层的分类来合并kubeconfig文件->使用文件为团队->企业中的角色和职责(团队A ,teamB,…,teamN)也可以在其他很好的选择中理解。
  • 对于多群集合并的kubeconfig文件方案,请考虑kubectx + kubens,这是kubectlt的非常强大的工具,可让您查看当前上下文(群集)和 namespace ,并可以在它们之间进行切换。


  • 应该在考虑项目最重要因素的情况下进行权衡分析。拥有一个合并的kubeconfig文件似乎更简单,即使将其与~/.kube/config合并以供kubectl默认使用,并且仅在带有--context kubectl标志的集群/命名空间之间切换也是如此。另一方面,如果必须限制kubeconfig的范围,则将它们隔离并使用--kubeconfig=file1听起来是最好的方法。
  • 可能并非每种情况和方案都存在最佳方法,但是了解如何配置kubeconfig文件(知道其优先级会有所帮助)。
  • 在本文-> https://www.nrmitchi.com/2019/01/managing-kubeconfig-files/中,您将找到一种补充而宝贵的意见:
  • 虽然在一个文件中拥有您可能需要的所有上下文都很好,但是它
    很难维护,很少有默认情况。多种工具
    为您提供访问凭证将为您提供新鲜的
    使用的kubeconfig。虽然您可以将配置合并到一起~/.kube/config,它是手动的,可以使删除上下文更多
    困难(必须显式删除上下文,集群和
    用户)。 Kubernetes中有一个打开的issue对此进行跟踪。但是通过
    保持每个提供的配置文件独立,并仅加载所有
    它们,删除要容易得多(只需删除文件)。对我来说
    似乎是一种更易于管理的方法。
  • 我更喜欢将所有单独的配置文件保留在〜/.kube/configs下,并且通过利用$ KUBECONFIG环境变量选项的多路径方面,我们可以实现此目的。

  • 如果您使用的是kubectl,则这是在使用哪个 kubeconfig 文件时生效的首选项。
  • 如果指定
  • ,则使用--kubeconfig标志
  • 使用KUBECONFIG环境变量(如果已指定
  • )
  • 使用$HOME/.kube/config文件

  • 这样,您可以轻松覆盖每个kubectl命令使用的 kubeconfig 文件:

    #
    # using --kubeconfig flag
    #
    kubectl get pods --kubeconfig=file1
    kubectl get pods --kubeconfig=file2
    
    #
    # or
    # using `KUBECONFIG` environment variable
    #
    KUBECONFIG=file1 kubectl get pods
    KUBECONFIG=file2 kubectl get pods
    
    #
    # or
    # merging your kubeconfig file w/ $HOME/.kube/config (w/ cp backup)
    #
    cp $HOME/.kube/config $HOME/.kube/config.backup.$(date +%Y-%m-%d.%H:%M:%S)
    KUBECONFIG= $HOME/.kube/config:file2:file3 kubectl config view --merge --flatten > \
    ~/.kube/merged_kubeconfig && mv ~/.kube/merged_kubeconfig ~/.kube/config
    kubectl get pods --context=cluster-1
    kubectl get pods --context=cluster-2
    

    注意: --minify标志允许我们仅提取有关该上下文的信息,而--flatten标志允许我们保留未编辑的凭据。

    奖励(加分!)

    一次使用多个kubeconfig

    您可以将AKS(Azure容器服务)或AWS EKS(K8的弹性容器服务)或GKE(Google容器引擎)群集上下文保存到单独的文件中,并设置KUBECONFIG env var引用这两个文件位置。

    例如,当您通过gcloud命令创建GKE集群(或检索其凭据)时,通常会修改您的默认~/.kube/config文件。但是,您可以将$KUBECONFIG设置为gcloud以将群集凭据保存到文件中:
    KUBECONFIG=c1.yaml gcloud container clusters get-credentials "cluster-1"
    

    然后,就像我们前面提到的一样,一次使用多个kubeconfigs 对于同时处理多个上下文可能非常有用。

    为此,您需要一个“合并的” kubeconfig 文件。在下面的“合并kubeconfig文件”一节中,我们说明了如何将 kubeconfigs 合并到一个文件中,但也可以在内存中合并它们。

    通过在KUBECONFIG环境变量中指定多个文件,可以暂时将 kubeconfig 文件缝合在一起,并在kubectl中全部使用它们。

    #
    # Kubeconfig in-memory merge
    #
    export KUBECONFIG=file1:file2
    kubectl get pods --context=cluster-1
    kubectl get pods --context=cluster-2
    
    #
    # For your example
    # merging your kubeconfig file w/ $HOME/.kube/config (w/ cp backup)
    #
    cp $HOME/.kube/config $HOME/.kube/config.backup.$(date +%Y-%m-%d.%H:%M:%S)
    KUBECONFIG= $HOME/.kube/config:file2: kubectl config view --merge --flatten > \
    ~/.kube/merged_kubeconfig && mv ~/.kube/merged_kubeconfig ~/.kube/config
    kubectl get pods --context=cluster-1
    kubectl get pods --context=cluster-2
    

    合并kubeconfig文件

    由于 kubeconfig 文件是结构化的YAML文件,因此,您不能仅将它们附加以得到一个大的 kubeconfig 文件,但是kubectl可以帮助您合并以下文件:

    #
    # Merging your kubeconfig file w/ $HOME/.kube/config (w/ cp backup)
    #
    cp $HOME/.kube/config $HOME/.kube/config.backup.$(date +%Y-%m-%d.%H:%M:%S)
    KUBECONFIG=$HOME/.kube/config:file2:file3 kubectl config view --merge --flatten > \
    ~/.kube/merged_kubeconfig && mv ~/.kube/merged_kubeconfig ~/.kube/config
    kubectl get pods --context=cluster-1
    kubectl get pods --context=cluster-2
    
  • 引用文章1: https://ahmet.im/blog/mastering-kubeconfig/
  • 引用文章2: https://github.com/kubernetes/kubernetes/issues/46381
  • 10-08 08:36