【问题标题】:How to merge kubectl config file with ~/.kube/config?如何将 kubectl 配置文件与 ~/.kube/config 合并?
【发布时间】:2018-02-21 08:57:25
【问题描述】:

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

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    我将每个集群的 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))
    

    【讨论】:

      【解决方案2】:

      如果您更喜欢 CLI 工具,我强烈推荐:KubeCM,它还可以合并、切换、添加...

      kubecm add -f ./your_new_config
      

      系统会要求您合并到 ~/.kube/config 或在当前文件夹中创建一个 .yml 文件。

      https://github.com/sunny0826/kubecm

      【讨论】:

        【解决方案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

        【讨论】:

          【解决方案4】:

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

          这是一种更安全的方法,先捕获完整输出,然后通过管道传输。

          注意必须用" 包围变量kubeconfig,否则你会丢失所有换行符!

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

          【讨论】:

            【解决方案5】:

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

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

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

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

            如果您正在寻找同时进行命名空间切换和其他相关事情的工具,请查看“kubie”。

            【讨论】:

              【解决方案6】:

              如果您想在您的 ~/.kube 目录中有一些结构,您可以按照这些说明进行操作。

              1. 将以下 sn-p 添加到您的 ~/.bashrc
              2. 分别在~/.kube/config.d下添加配置文件。
              3. 致电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 指出的那样,检查配置文件中的名称冲突,这可能会导致问题。

              Github gist

              【讨论】:

                【解决方案7】:

                如果您发现自己经常这样做......现在还有用于kubectlkrew 插件包管理器。

                krew 插件“konfig”可以帮助您管理您的~/.kube/config 文件。

                使用konfig 插件,语法将是:

                kubectl konfig import -s new.yaml

                要安装krewhttps://github.com/kubernetes-sigs/krew

                要安装konfigkubectl krew install konfig

                【讨论】:

                • 这个插件是从哪里来的?它抛出错误,我找不到报告它们的仓库。
                • @Routhinator 这里是 repo:github.com/corneliusweig/konfig - here 是关于如何索引插件的详细信息。
                • Krew 在 Windows 上不可用
                【解决方案8】:

                如果您使用 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”来添加它。 请注意集群名称等应该与现有配置条目不同!

                【讨论】:

                  【解决方案9】:

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

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

                  新鲜源后,验证:

                  kubectl config view
                  

                  【讨论】:

                    【解决方案10】:

                    这样做:

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

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

                    【讨论】:

                    • 带管道KUBECONFIG=~/.kube/this-config:~/.kube/other-config kubectl config view --flatten &gt; ~/.kube/config
                    • 该管道对于全新的 kubeconfigs 是安全的,但请确保将先前存在的 ~/.kube/config 和新的 other-config 的内容合并回 ~/.kube/config ;重定向将在读取目标之前截断它,您只会看到 other-config 的输出。
                    • 哇,我想手动合并这两个文件,但这太疯狂了。
                    • 建议:合并前检查设置中没有名称冲突。例如,如果您的 users.name 在配置文件中恰好相同,kubectl 将选择第一个。因此,您的某些集群的身份验证将失败。
                    • 或者你可以使用sponge from moreutils: KUBECONFIG=~/.kube/this-config:~/.kube/other-config kubectl config view --flatten | sponge &gt; ~/.kube/config
                    【解决方案11】:

                    一次使用多个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
                    

                    在这个命令中,我们从$HOME/.kube/config 文件中提取关于context-1 的数据到config-context-1 文件。 --minify 标志允许我们仅提取有关该上下文的信息,--flatten 标志允许我们保持凭据未编辑。

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

                    【讨论】:

                      【解决方案12】:

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

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

                      # 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 变量

                      【讨论】:

                      • 谢谢,kubectl config view --flatten 对我不起作用,但 kubectl config view --raw 对我有用
                      • 简单答案??,每个文件都会有当前上下文。当前上下文会发生什么?哪个上下文将被选为最终文件中的当前上下文?
                      • @AATHITHRAJENDRAN 好问题,我认为顺序很重要。您应该尝试查看第一个文件是否具有优先权。
                      • 是的,第一个文件中的“current-context”进入了合并的配置文件。
                      猜你喜欢
                      • 2020-11-06
                      • 1970-01-01
                      • 2022-06-22
                      • 1970-01-01
                      • 2021-12-26
                      • 1970-01-01
                      • 2021-02-27
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多