一行kubectl命令将配置文件与〜/ .kube / config合并?

时间:2017-09-12 19:37:05

标签: kubernetes

是否有一个简单的kubectl命令来获取kubeconfig文件(包含群集+上下文+用户)并将其合并到〜/ .kube / config文件中作为附加上下文?< / p>

9 个答案:

答案 0 :(得分:34)

这样做:

KUBECONFIG=~/.kube/config:~/someotherconfig 
kubectl config view --flatten

如果需要,您可以将其传输到新文件。

答案 1 :(得分:3)

有可能,请按照以下步骤操作:

从你的配置文件创建一个备份: cp ~/.kube/config-bkp

用你的新配置文件创建一个文件: vi ~/.kube/new-config

将它们合并到配置中: KUBECONFIG=~/.kube/config:~/.kube/new-config kubectl config view --flatten > ~/.kube/config

要查看可用的上下文,请使用: kubectl config get-contexts

要更改上下文,请使用: kubectl config use-context YOUR-CONTEXT-NAME

答案 2 :(得分:2)

一次使用多个kubeconfigs

有时您有一堆小的 kubeconfig 文件(例如,每个群集一个),但是您想同时使用kubectlkubectx之类的工具来全部使用它们一次处理多个上下文。

为此,您需要一个“合并的” 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

从kubeconfig文件中提取上下文

假设您遵循了合并kubeconfig文件之前的内容,并且在$HOME/.kube/config中有一个合并的 kubeconfig 文件。现在,您想将群集的信息提取到可移植的 kubeconfig 文件中,该文件仅包含连接到该群集所需的部分。

运行:

KUBECONFIG=$HOME/.kube/config kubectl config view \
    --minify --flatten --context=context-1 > $HOME/.kube/config-context-1

#
# using --kubeconfig flag
#
kubectl get pods --kubeconfig=$HOME/.kube/config-context-1

#
# or 
# using `KUBECONFIG` environment variable
#
KUBECONFIG=$HOME/.kube/config-context-1 kubectl get pods

#
# or 
# keep using kubeconfig file at $HOME/.kube/config (which has the merged context)
#
kubectl get pods --context=cluster-1

在此命令中,我们从context-1$HOME/.kube/config文件中提取关于config-context-1的数据。 --minify标志允许我们仅提取有关该上下文的信息,而--flatten标志允许我们保留未删除的凭据。

参考文章: https://ahmet.im/blog/mastering-kubeconfig/

答案 3 :(得分:0)

如果要将两个配置文件合并到一个文件中

我找到了这种方式(不确定这是否最简单)

# Add the two config files to the env var
export KUBECONFIG=~/.kube/config:~/Desktop/configFile2.yaml

# Review that you have two configurations in one view
kubectl config view

# View the raw config and output to a new file
kubectl config view --raw > /tmp/config

然后将新的配置文件复制到所需的位置,也请不要忘记unset KUBECONFIG env变量

答案 4 :(得分:0)

如果您发现这样做很多。.现在还有kubectl的'krew'插件包管理器。还有一个用于管理./kube/config文件的插件。

使用“ konfig”插件的语法为:

kubectl konfig import -s new.yaml

要安装团队,请执行以下操作:https://github.com/kubernetes-sigs/krew

答案 5 :(得分:0)

要在您的.bashrc中动态合并多个配置文件:

export KUBECONFIG=/Users/<user>/.kube/config:/Users/<user>/.kube/other.config
source <(kubectl completion bash)

获取新资源后,请验证:

kubectl config view

答案 6 :(得分:0)

如果您使用bash,则可以使用它来简单地添加配置:

function kmerge() {
 DATE=$(date +"%Y%m%d%H%M")
 KUBECONFIG=~/.kube/config:$1 kubectl config view --flatten > ~/.kube/mergedkub && mv ~/.kube/config ~/.kube/config-$DATE && mv ~/.kube/mergedkub ~/.kube/config
}

然后仅使用“ kmerge $ newConfigfile”添加它。 请注意,群集名称等应与现有的配置条目不同!

答案 7 :(得分:0)

今后,我不建议使用 kubectl 合并 kubeconfig 文件。

  • 如上所示,这是手动操作(设置环境变量等)
  • 的缺点是当通过 "kubectl config use-context” 它将当前上下文写入 kubeconfig 文件。因此, 这会影响使用相同上下文的其他终端会话 kubeconfig 文件(它们突然都指向同一个上下文)。

相反,我建议使用一种工具来规避此类问题,例如递归搜索和显示 kubeconfig 文件的所有可用上下文并处理临时副本。

结帐 kubeswitch(我编写的用于处理 > 1000 个 kubeconfig 文件的工具)和 this section explaining how it works

如果您正在寻找一种也可以进行命名空间切换和其他相关操作的工具,请查看“kubie”。

答案 8 :(得分:0)

正如@talarczykco 在顶部答案的评论中提到的,返回到同一个 ~/.kube/config 只会写入第二个文件,并且您将丢失原始内容!

这里有一个更安全的方法,先捕获完整的输出然后管道。

注意必须用 kubeconfig 将变量 " 括起来,否则会丢失所有换行符!

konfig=$(KUBECONFIG=~/.kube/config:new-config.yaml kubectl config view --flatten)

echo "$konfig" > ~/.kube/config