【发布时间】:2018-02-21 08:57:25
【问题描述】:
是否有一个简单的kubectl 命令来获取kubeconfig 文件(包含集群+上下文+用户)并将其合并到 ~/.kube/config 文件中作为附加上下文?
【问题讨论】:
标签: kubernetes
是否有一个简单的kubectl 命令来获取kubeconfig 文件(包含集群+上下文+用户)并将其合并到 ~/.kube/config 文件中作为附加上下文?
【问题讨论】:
标签: kubernetes
我将每个集群的 yaml 文件分开保存,然后将它们与这个 python 脚本结合起来:
import argparse
import yaml
parser = argparse.ArgumentParser()
parser.add_argument('files', metavar='YAMLFILES', type=argparse.FileType('r'), nargs='*')
args = parser.parse_args()
y = {'apiVersion': 'v1', 'kind': 'Config', 'clusters': [],'contexts': [],
'current-context': None, 'preferences': {}, 'users': []}
for a in args.files:
f = yaml.load(a, Loader=yaml.Loader)
y['clusters'].append(f['clusters'][0])
y['contexts'].append(f['contexts'][0])
y['users'].append(f['users'][0])
y['current-context'] = f['contexts'][0]['name']
print(yaml.dump(y, Dumper=yaml.Dumper))
【讨论】:
如果您更喜欢 CLI 工具,我强烈推荐:KubeCM,它还可以合并、切换、添加...
kubecm add -f ./your_new_config
系统会要求您合并到 ~/.kube/config 或在当前文件夹中创建一个 .yml 文件。
【讨论】:
有可能,请按照以下步骤操作:
从您的配置文件创建备份:
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
【讨论】:
正如@talarczykco 在顶部答案的评论中所提到的,管道回到相同的~/.kube/config 只会写入第二个文件,您将丢失原始内容!
这是一种更安全的方法,先捕获完整输出,然后通过管道传输。
注意必须用" 包围变量kubeconfig,否则你会丢失所有换行符!
konfig=$(KUBECONFIG=~/.kube/config:new-config.yaml kubectl config view --flatten)
echo "$konfig" > ~/.kube/config
【讨论】:
今后,我不建议使用 kubectl 合并 kubeconfig 文件。
相反,我建议使用一种工具来规避此类问题,例如递归搜索并显示 kubeconfig 文件的所有可用上下文并处理临时副本。
结帐kubeswitch(我编写的用于处理> 1000个kubeconfig文件的工具)和this section explaining how it works。
如果您正在寻找同时进行命名空间切换和其他相关事情的工具,请查看“kubie”。
【讨论】:
如果您想在您的 ~/.kube 目录中有一些结构,您可以按照这些说明进行操作。
~/.bashrc
~/.kube/config.d下添加配置文件。update_kubeconfigs,或打开新终端update_kubeconfigs 只查看~/.kube/config.d 目录,如果~/.kube/config 下有比当前配置文件更新的文件,它会更新它。
function update_kubeconfigs() {
[ ! -d "$HOME/.kube/config.d" ] && mkdir $HOME/.kube/config.d -p -v
# Will run only if there are new files in the config directory
local new_files=$(find $HOME/.kube/config.d/ -newer $HOME/.kube/config -type f | wc -l)
if [[ $new_files -ne "0" ]]; then
local current_context=$(kubectl config current-context) # Save last context
local kubeconfigfile="$HOME/.kube/config" # New config file
cp -a $kubeconfigfile "${kubeconfigfile}_$(date +"%Y%m%d%H%M%S")" # Backup
local kubeconfig_files="$kubeconfigfile:$(ls $HOME/.kube/config.d/* | tr '\n' ':')"
KUBECONFIG=$kubeconfig_files kubectl config view --merge --flatten > "$HOME/.kube/tmp"
mv "$HOME/.kube/tmp" $kubeconfigfile && chmod 600 $kubeconfigfile
export KUBECONFIG=$kubeconfigfile
kubectl config use-context $current_context --namespace=default
fi
}
# This will call each time you source .bashrc, remove it if you want to call it manually each time
update_kubeconfigs
从~/.kube/confing.d 中删除文件将不会再次调用该脚本。同样正如@rafaelrezend 指出的那样,检查配置文件中的名称冲突,这可能会导致问题。
【讨论】:
如果您发现自己经常这样做......现在还有用于kubectl 的krew 插件包管理器。
krew 插件“konfig”可以帮助您管理您的~/.kube/config 文件。
使用konfig 插件,语法将是:
kubectl konfig import -s new.yaml
要安装krew:https://github.com/kubernetes-sigs/krew
要安装konfig:kubectl krew install konfig
【讨论】:
如果您使用 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”来添加它。 请注意集群名称等应该与现有配置条目不同!
【讨论】:
在你的 .bashrc 中动态合并多个配置文件:
export KUBECONFIG=/Users/<user>/.kube/config:/Users/<user>/.kube/other.config
source <(kubectl completion bash)
新鲜源后,验证:
kubectl config view
【讨论】:
这样做:
export KUBECONFIG=~/.kube/config:~/someotherconfig
kubectl config view --flatten
然后,如果需要,您可以将其输出到新文件。
【讨论】:
KUBECONFIG=~/.kube/this-config:~/.kube/other-config kubectl config view --flatten > ~/.kube/config
~/.kube/config 和新的 other-config 的内容合并回 ~/.kube/config ;重定向将在读取目标之前截断它,您只会看到 other-config 的输出。
sponge from moreutils: KUBECONFIG=~/.kube/this-config:~/.kube/other-config kubectl config view --flatten | sponge > ~/.kube/config
kubeconfigs
有时您有一堆小的 kubeconfig 文件(例如,每个集群一个),但您想同时使用它们,使用像 kubectl 或 kubectx 这样的工具可以处理多个上下文一次。
为此,您需要一个“合并的”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 文件是结构化的 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 文件,并在 $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
在这个命令中,我们从$HOME/.kube/config 文件中提取关于context-1 的数据到config-context-1 文件。 --minify 标志允许我们仅提取有关该上下文的信息,--flatten 标志允许我们保持凭据未编辑。
【讨论】:
如果你想将两个配置文件合并到一个文件中
我找到了这种方式(不确定这是否最简单)
# 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 变量
【讨论】: