如何配置kubectl以与minikube和已部署的群集进行交互?

时间:2017-09-08 23:03:43

标签: kubernetes

使用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中,将--kubeconfig环境变量设置为参考这两个地点?

或者,在调用kubectl来指定群集配置时,是否最好只显式使用kubectl config set-context选项?

我不确定是否有某种方法可以合并更好的配置文件,而是利用kubectl config set-cluster--kubeconfig命令。 Kubernetes on&#34; Configure Access to Multiple Clusters"上的文档似乎暗示了使用kubectl config以及这些<form id="live-search" action="" class="styled" method="post"> <fieldset> <input type="text" class="text-input" id="filter" value="" /> <span id="filter-count"></span> </fieldset> </form> <nav> <ul> <li><a href="#">Jim James</a></li> <li><a href="#">Hello Bye</a></li> <li><a href="#">Wassup Food</a></li> <li><a href="#">Contact Us</a></li> <li><a href="#">Bleep bloop</a></li> <li><a href="#">jQuery HTML</a></li> <li><a href="#">CSS HTML AJAX</a></li> <li><a href="#">HTML5 Net Set</a></li> <li><a href="#">Node Easy</a></li> <li><a href="#">Listing Bloop</a></li> <li><a href="#">Contact HTML5</a></li> <li><a href="#">CSS3 Ajax</a></li> <li><a href="#">ET</a></li> </ul> </nav>} 命令的不同方法。

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

2 个答案:

答案 0 :(得分:1)

  

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

     

或者在以下情况下仅显式使用--kubeconfig选项会更好吗?   调用kubectl为集群指定配置?

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

  • 根据我们的经验,合并各种kubeconfig文件对于多集群操作非常有用,以便执行维护任务以及对一组集群(上下文和名称空间)进行事件管理,从而简化故障排除问题基于比较K8s服务的配置,清单,资源和状态,pod,卷,名称空间,rs等的可能性。

  • 但是,当涉及自动化和部署(带有Jenkins,Spinnaker或Helm之类的工具)时,最好有单独的kubeconfig文件可能是个好主意。混合方法可以根据服务层->使用文件对开发环境(dev,qa,stg,prod)集群或团队的分区来合并kubeconfig文件->在企业(teamA,teamB,…,teamN)中的角色和职责也可以通过很好的选择来理解。

  • 对于多集群合并的kubeconfig文件方案,请考虑kubectx + kubens,这是kubectlt的非常强大的工具,可让您查看当前上下文(集群)和名称空间,同样可以在它们之间进行切换。

  

简而言之,与多个独立的互动的最佳方式是什么   kubernetes集群以及权衡是什么?

  • 应该考虑项目最重要的因素来权衡利弊。拥有一个合并的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环境变量选项的多路径方面,我们可以实现这一目标。 / em>

如果您使用的是kubectl,则此首选项将在确定使用哪个 kubeconfig 文件时生效。

  1. 使用--kubeconfig标志(如果已指定)
  2. 使用KUBECONFIG环境变量(如果已指定)
  3. 使用$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环境变量以引用这两个文件位置。

例如,当您通过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 :(得分:0)

我有一系列shell函数,可归结为kubectl --context=$CTX --namespace=$NS,允许我对每个shell进行语境化[1]。但是如果你对这种方法很酷,那么https://github.com/Comcast/k8sh可能会让你感兴趣,而不是自己动手。我只是希望它是shell函数而不是子shell

但是,否则,是的,我将所有配置值保留在~/.kube/config

脚注1:如果您还不知道,我也可以通过title() { printf '\033]0;%s\007' "$*"; }更改终端窗口的标题,以便提醒我哪个群集/命名空间/等对于该选项卡/窗口有效