如何在gcloud和minikube之间切换kubectl集群


124

我让Kubernetes在两种不同的环境中都能很好地工作,分别是在我的本地环境(运行minikube的MacBook)和Google的Container Engine(GCE,Google Cloud上的Kubernetes)上。我使用MacBook /本地环境开发和测试我的YAML文件,然后在完成后在GCE上尝试使用它们。

当前,我需要分别与每个环境一起使用:我需要在本地环境中编辑YAML文件,并准备好将其(git)克隆到GCE环境中,然后使用/部署它们。这是一个麻烦的过程。

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

Answers:


235

您可以从本地(minikube)切换到gcloud,然后返回:

kubectl config use-context CONTEXT_NAME

列出所有上下文:

kubectl config get-contexts

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


5
如何将其添加到您的kubectl上下文中?有gcloud命令来执行此操作吗?找到了:$ gcloud容器集群获取凭证$ CLUSTER_NAME
贾斯汀·托马斯

上面的内容并没有显示原始内容,但grep 'name:' ~/.kube/config确实有显示。是的minikube,所以我可以切换至kubectl config use-context minikube
Jordan Morris

10

标准的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/


6

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


这看起来更像是评论,而不是答案。
coderpc '19

这是一个很好的答案(特别是结合gcloud container clusters get-credentials $CLUSTER_NAME贾斯汀·托马斯的评论到公认的答案)。
thebjorn

3

最新的2020年答案在这里,

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

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

kubectl top nodes --context=context02name

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


2

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


1

跨存储库为不同环境克隆YAML文件绝对是理想的选择。您要做的是通过提取各个环境不同的参数来对YAML文件进行模板化。

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

Wordpress图表为例,您可以针对两种环境使用两个不同的命令:

对于开发人员:

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

但是,不必在CLI上传递这些值,您可以将这些值存储在一个适当的文件中,values.yml并且可以在不同的环境中使用不同的文件

在转换为Helm图表标准时,您需要做一些工作,但是付出的努力是值得的。


1

正如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,是由Kubernetes / Google Cloud Platform开发人员体验团队的Googler名为“ Ahmet Alp Balkan”创建的,该团队构建了这样的工具。我强烈推荐它。

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

1

还要检查最新的(docker 19.03)docker context命令

Ajeet Singh Raina)在“ Docker 19.03.0预发布:快速上下文切换,无根Docker,Swarm服务的Sysctl支持 ”中对此进行了说明。

上下文切换

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

举例来说,在我的特殊情况下,我有4个不同的集群–本地和远程运行的Swarm和Kubernetes的混合。
假设我的台式机上运行着一个默认集群,在Google Cloud Platform上运行了2节点Swarm集群,在Docker Playground上运行的Play上运行了5节点的集群,在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 

0

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

我得到了启发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


0

获取所有上下文

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>

-1

是的,我认为这是您的要求。要查看当前配置,请使用kubectl配置视图。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代码
Vishal Biyani
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.