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

8
当您使用minikube时,它会自动创建本地配置,因此它已经可以使用。根据kubectl config的参考,kubectl命令似乎支持多个集群。
在设置集群的文档中,有将相关文件复制到本地计算机以访问集群的参考。我还发现了一个关于编辑您的.kube/config以远程利用azure的SO Q&A,它提到了编辑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 集群交互的最佳方法是什么,有哪些权衡?

如果您还不知道,YAML有“锚点”,允许在单个YAML文档中使用伪变量。这可能会使一个配置文件比多个配置文件更具优势。 - mdaniel
3个回答

4
如果我想使用kubectl来调用多个群集的命令,是否应该将相关配置文件下载到新位置(例如~/gcloud/config),将KUBECONFIG环境变量设置为引用两个位置?
还是更好的方法是在调用kubectl时显式使用--kubeconfig选项来指定群集配置?
这可能取决于您发现哪种方法更简单、更方便,并且是否需要考虑安全和访问管理问题。
  • 从我们的经验来看,合并各种kubeconfig文件对于多集群操作非常有用,以便进行维护任务和事件管理,简化故障排除问题,基于比较配置、清单、资源和K8s服务、pod、卷、命名空间、rs等状态的可能性。

  • 然而,在自动化和部署(使用Jenkins、Spinnaker或Helm等工具)涉及时,很可能分开使用kubeconfig文件会是一个好主意。一种混合方法可以根据服务层次结构合并kubeconfig文件->使用文件来分割开发环境(dev、qa、stg、prod)集群或针对团队 ->企业中的角色和职责(teamA、teamB、…、teamN)也可以理解为良好的替代方案。

  • 对于多集群合并的kubeconfig文件场景,请考虑使用kubectx + kubens,这是非常强大的kubectl工具,让您查看当前上下文(集群)和命名空间,并在它们之间切换。

简而言之,与多个独立的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环境变量选项的多路径特性,我们可以实现这一点。
如果您使用的是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标志允许我们保留未编辑的凭据。


奖励(额外加分!)

同时使用多个kubeconfigs

您可以将AKS(Azure容器服务),AWS EKS(弹性容器服务)或GKE(Google容器引擎)集群上下文保存到不同的文件中,并设置KUBECONFIG环境变量以引用两个文件位置。

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

KUBECONFIG=c1.yaml gcloud container clusters get-credentials "cluster-1"

作为之前提到的,同时使用多个kubeconfig可以非常有用,以便同时处理多个上下文。
为此,您需要一个“合并”的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
kubectl get pods --kubeconfig file1.yaml
kubectl get pods --kubeconfig file2.yaml

你可以使用 (--kubeconfig) 标志告诉 kubectl,你想基于 file1 或 file2 运行 kubectl。在注意事项中,文件是 Kubernetes 配置。

1
我有一系列的shell函数,它们归结为kubectl --context=$CTX --namespace=$NS,使我能够对每个shell进行上下文处理[1]。但如果您喜欢这种方法,那么与其自行开发,https://github.com/Comcast/k8sh可能会更适合您。我只希望它是shell函数而不是子shell。
但除此之外,是的,我将所有配置值都保存在一个~/.kube/config文件中。
[1] 脚注:如果您还没有意识到,可以通过title() { printf '\033]0;%s\007' "$*"; }更改终端窗口的标题,这样我就可以提醒自己哪个集群/命名空间等在该选项卡/窗口中生效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接