【问题标题】:How to switch kubectl clusters between gcloud and minikube如何在 gcloud 和 minikube 之间切换 kubectl 集群
【发布时间】:2017-09-24 09:41:09
【问题描述】:

我让 Kubernetes 在两种不同的环境中运行良好,即在我的本地环境(运行 minikube 的 MacBook)和 Google 的容器引擎(GCE,Google Cloud 上的 Kubernetes)上。我使用 MacBook/本地环境来开发和测试我的 YAML 文件,然后在完成后在 GCE 上试用它们。

目前我需要单独处理每个环境:我需要在我的本地环境中编辑 YAML 文件,准备好后,(git)将它们克隆到 GCE 环境,然后使用/部署它们。这是一个有点麻烦的过程。

理想情况下,我想使用我的 Macbook 中的 kubectl 在本地 minikube 或 GCE Kubernetes 环境之间轻松切换,并轻松确定 YAML 文件的使用位置。有没有一种简单的方法来切换上下文来做到这一点?

【问题讨论】:

    标签: kubernetes google-kubernetes-engine minikube


    【解决方案1】:

    您可以通过以下方式从本地 (minikube) 切换到 gcloud 并返回:

    kubectl config use-context CONTEXT_NAME

    列出所有上下文:

    kubectl config get-contexts

    您可以为本地和 gcloud 创建不同的环境并将其放在单独的 yaml 文件中。

    【讨论】:

    • 如何将它添加到您的 kubectl 上下文中?有 gcloud 命令来做吗?找到它:$ gcloud container clusters get-credentials $CLUSTER_NAME
    • 上面没有显示原始上下文,但grep 'name:' ~/.kube/config 显示了。是minikube,所以我可以用kubectl config use-context minikube切换回它
    • 您可以使用“minikube start --keep-context”创建上下文
    【解决方案2】:

    标准 kubectl 命令的更快快捷方式是使用kubectx

    • 列出上下文:kubectx
      • 相当于kubectl config get-contexts
    • 切换上下文(到 foo):kubectx foo
      • 相当于kubectl config use-context foo

    要在 macOS 上安装:brew install kubectx

    kubectx 包还包括一个用于切换命名空间的类似工具,称为kubens

    如果您经常在多个上下文和命名空间中工作,这两个非常方便。

    更多信息:https://ahmet.im/blog/kubectx/

    【讨论】:

      【解决方案3】:

      列出上下文

      kubectl config get-contexts
      

      切换上下文

      kubectl config set current-context MY-CONTEXT
      

      【讨论】:

        【解决方案4】:

        如果您正在寻找基于 GUI 的 Mac 解决方案并安装了 Docker Desktop,则可以使用 Docker 菜单栏图标。在这里,您可以找到包含 kubeconfig 中所有上下文的“Kubernetes”菜单,并在它们之间轻松切换。

        【讨论】:

        • 这看起来更像是评论而不是答案。
        • 这是一个很好的答案(特别是结合贾斯汀托马斯对已接受答案的评论中的gcloud container clusters get-credentials $CLUSTER_NAME)。
        【解决方案5】:

        2020 年最新答案在这里,

        在 kubectl 上下文之间切换的简单方法,

        kubectl top nodes **--context=**context01name
        
        kubectl top nodes --context=context02name
        

        您还可以将上下文名称存储为 env context01name=gke_${GOOGLE_CLOUD_PROJECT}_us-central1-a_standard-cluster-1

        【讨论】:

          【解决方案6】:

          获取所有上下文

          C:\Users\arun>kubectl config get-contexts
          

          获取当前上下文

          C:\Users\arun>kubectl config current-context
          

          切换上下文

          C:\Users\arun>kubectl config use-context <any context name from above list>
          

          【讨论】:

            【解决方案7】:

            TL;DR:我创建了一个 GUI 来通过 AppleScript 切换 Kubernetes 上下文。我通过 shift-cmd-x 激活它。

            我也有同样的问题。通过命令行切换上下文很痛苦。我使用 FastScripts 设置了一个组合键 (shift-cmd-x) 来运行以下 AppleScript(放置在此目录中:$(HOME)/Library/Scripts/Applications/Terminal)。

            use AppleScript version "2.4" -- Yosemite (10.10) or later
            use scripting additions
            
            do shell script "/usr/local/bin/kubectl config current-context"
            set curcontext to result
            
            do shell script "/usr/local/bin/kubectl config get-contexts -o name"
            set contexts to paragraphs of result
            
            choose from list contexts with prompt "Select Context:" with title "K8s Context Selector" default items {curcontext}
            set scriptArguments to item 1 of result
            
            do shell script "/usr/local/bin/kubectl config use-context " & scriptArguments
            
            display dialog "Switched to " & scriptArguments buttons {"ok"} default button 1
            

            【讨论】:

              【解决方案8】:

              我厌倦了一遍又一遍地打字,所以我写了一个简单的 bash 实用程序来切换上下文

              你可以在这里找到它https://github.com/josefkorbel/kube-switch

              【讨论】:

                【解决方案9】:

                正如 Mark 提到的,切换/读取/操作不同 kubernetes 环境(又名 kubernetes 上下文)的规范答案是使用kubectl config,见下文:

                $ kubectl config                                                                                                                                                                                                                 
                Modify kubeconfig files using subcommands like "kubectl config set current-context my-context"
                
                Available Commands:
                  current-context Displays the current-context
                  delete-cluster  Delete the specified cluster from the kubeconfig
                  delete-context  Delete the specified context from the kubeconfig
                  get-clusters    Display clusters defined in the kubeconfig
                  get-contexts    Describe one or many contexts
                  rename-context  Renames a context from the kubeconfig file.
                  set             Sets an individual value in a kubeconfig file
                  set-cluster     Sets a cluster entry in kubeconfig
                  set-context     Sets a context entry in kubeconfig
                  set-credentials Sets a user entry in kubeconfig
                  unset           Unsets an individual value in a kubeconfig file
                  use-context     Sets the current-context in a kubeconfig file
                  view            Display merged kubeconfig settings or a specified kubeconfig file
                
                Usage:
                  kubectl config SUBCOMMAND [options]
                

                在幕后,有一个 ~/.kube/config YAML 文件存储所有可用的上下文及其对应的凭据和每个上下文的端点。

                现成的 Kubectl 并不像您可能已经知道的那样轻松管理不同的 kubernetes 上下文。与其滚动您自己的脚本来管理所有这些,更好的方法是使用一个名为 kubectx 的成熟工具,该工具由一位名叫“Ahmet Alp Balkan”的 Google 员工创建,他在 Kubernetes / Google Cloud Platform 开发人员体验团队中构建这样的工具.我强烈推荐它。

                https://github.com/ahmetb/kubectx

                $ kctx --help                                                                                                                                                                                                                  
                USAGE:
                  kubectx                       : list the contexts
                  kubectx <NAME>                : switch to context <NAME>
                  kubectx -                     : switch to the previous context
                  kubectx <NEW_NAME>=<NAME>     : rename context <NAME> to <NEW_NAME>
                  kubectx <NEW_NAME>=.          : rename current-context to <NEW_NAME>
                  kubectx -d <NAME> [<NAME...>] : delete context <NAME> ('.' for current-context)
                                                  (this command won't delete the user/cluster entry
                                                  that is used by the context)
                
                  kubectx -h,--help         : show this message
                

                【讨论】:

                  【解决方案10】:

                  跨存储库为不同环境克隆 YAML 文件绝对是理想的。您要做的是模板化您的 YAML 文件 - 通过提取因环境而异的参数。

                  当然,您可以使用一些模板引擎并分离 YAML 中的值并为特定环境生成 YAML。但如果您采用Helm Charts,这很容易实现。要查看一些示例图表,请访问Github repo的稳定目录

                  Wordpress chart 为例,您可以为两个环境使用两个不同的命令:

                  对于开发人员:

                  helm install --name dev-release --set \ wordpressUsername=dev_admin, \ wordpressPassword=dev_password, \ mariadb.mariadbRootPassword=dev_secretpassword \ stable/wordpress

                  虽然没有必要在 CLI 上传递这些值,您可以将这些值存储在一个名为 aptly values.yml 的文件中,并且您可以为不同的环境使用不同的文件

                  您需要做一些工作才能转换为 Helm 图表标准,但这些努力是值得的。

                  【讨论】:

                    【解决方案11】:

                    检查最新的(docker 19.03)docker context command

                    Ajeet Singh Raina ) 在“Docker 19.03.0 Pre-Release: Fast Context Switching, Rootless Docker, Sysctl support for Swarm Services”中说明了它

                    上下文本质上是用于访问特定集群的配置。

                    例如,在我的特殊情况下,我有 4 个不同的集群——Swarm 和 Kubernetes 混合在本地和远程运行。
                    假设我有一个默认集群在我的桌面机器上运行,2 节点 Swarm 集群在 Google Cloud Platform 上运行,5 节点集群在 Play with Docker playground 上运行,以及在 Minikube 上运行的单节点 Kubernetes 集群,我需要访问漂亮的经常。

                    使用 docker context CLI,我可以在几秒钟内轻松地从一个集群(可能是我的开发集群)切换到测试集群。

                    $ sudo docker context --help
                    Usage:  docker context COMMAND
                    Manage contexts
                    Commands:
                      create      Create a context
                      export      Export a context to a tar or kubeconfig file
                      import      Import a context from a tar file
                      inspect     Display detailed information on one or more contexts
                      ls          List contexts
                      rm          Remove one or more contexts
                      update      Update a context
                      use         Set the current docker context
                    Run 'docker context COMMAND --help' for more information on a command.
                    

                    例如:

                    [:)Captain'sBay=>sudo docker context ls
                    NAME                DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT                 ORCHESTRATOR
                    default *           Current DOCKER_HOST based configuration   unix:///var/run/docker.sock   https://127.0.0.1:16443 (default)   swarm
                    swarm-context1 
                    

                    【讨论】:

                      【解决方案12】:

                      我使用kubeswitch(免责声明:我编写了该工具),它可以像kubectx 一样使用,但专为大量kubeconfig 文件而设计。 如果你必须处理成百上千的 kubeconfig 文件,这个工具可能对你有用,否则 kubectxkubectl config use-context 可能就足够了。

                      例如,它添加了从vault 读取、搜索时热重载以及加快后续搜索速度的索引等功能。

                      您可以从here 安装它。

                      编辑:现在还直接包括对 GKE 的支持。因此,您可以使用和发现 kubeconfig 文件,而无需手动下载和更新它们。

                      【讨论】:

                        【解决方案13】:

                        如果您可能正在寻找一种在不同上下文之间切换的简单方法,这可能会有所帮助。

                        我受到了kubectxkswitch 已经提到的脚本的启发,我可以推荐它们用于大多数用例。他们正在帮助解决切换任务,但在 ~/.kube/config 的一些更大或更小的标准配置上对我造成了破坏。所以我创建了一个 sys-exec 调用包装器和一个关于kubectl 的简写。

                        如果你在没有参数的情况下调用k,你会看到一个截获的切换上下文的提示。

                        Switch kubectl to a different context/cluster/namespace.
                        Found following options to select from:
                         >>> context: [1] franz
                         >>> context: [2] gke_foo_us-central1-a_live-v1
                         >>> context: [3] minikube
                         --> new num [?/q]:
                        

                        此外,k 继续充当速记员。以下是等价的:

                        kubectl get pods --all-namespaces
                        k get pods -A
                        k p -A
                        

                        【讨论】:

                          【解决方案14】:

                          是的,我想这就是您要问的问题。要查看当前配置,请使用 kubectl config view。 kubectl 从以下位置加载和合并配置(按顺序)

                          --kubeconfig=/path/to/.kube/config command line flag
                          KUBECONFIG=/path/to/.kube/config env variable
                          $HOME/.kube/config  - The DEFAULT
                          

                          我使用 --kubeconfig 因为我在多个集群之间切换了很多。它有点麻烦,但效果很好。

                          查看这些以获取更多信息。 https://kubernetes.io/docs/tasks/administer-cluster/share-configuration/https://kubernetes.io/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/

                          【讨论】:

                          • 我不知道用户在问如何为 Kubectl 使用多个配置问题是关于如何在多个环境中使用 Yaml 代码
                          猜你喜欢
                          • 1970-01-01
                          • 2020-06-05
                          • 2020-08-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2021-05-20
                          • 2019-12-04
                          • 2018-11-11
                          • 1970-01-01
                          相关资源
                          最近更新 更多