如果我想使用
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文件时生效的首选项如下:
- 如果指定了,使用
--kubeconfig
标志
- 如果指定了,使用
KUBECONFIG
环境变量
- 使用
$HOME/.kube/config
文件
通过这个,您可以轻松地覆盖每个
kubectl
命令使用的
kubeconfig文件:
kubectl get pods --kubeconfig=file1
kubectl get pods --kubeconfig=file2
KUBECONFIG=file1 kubectl get pods
KUBECONFIG=file2 kubectl get pods
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中使用它们。
export KUBECONFIG=file1:file2
kubectl get pods --context=cluster-1
kubectl get pods --context=cluster-2
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
可以帮助您合并这些文件:
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