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

我有Kubernetes在两个不同的环境中工作得很好,即在我的本地环境(MacBook运行minikube)和谷歌的容器引擎(GCE, Kubernetes在谷歌云上)。我使用MacBook/local环境来开发和测试我的YAML文件,然后,完成后,在GCE上尝试它们。

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

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

136876 次浏览

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

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

我使用——kubecconfig,因为我经常在多个集群之间切换。它有点麻烦,但它工作得很好。

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

为不同的环境克隆YAML文件绝对是理想的。你要做的是模板化你的YAML文件——通过提取不同环境的参数。

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

Wordpress的图表为例,你可以在两个环境中使用两个不同的命令:

戴夫:

helm install——name dev-release——set \ wordpressUsername = dev_admin \ wordpressPassword = dev_password \ mariadb。mariadbRootPassword = dev_secretpassword \ 稳定/ wordpress < /代码> < / p >

不过,在CLI上传递这些值并不是必须的,你可以将这些值存储在一个名为values.yml的文件中,并且你可以为不同的环境拥有不同的文件

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

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

kubectl config use-context CONTEXT_NAME

列出所有上下文:

kubectl config get-contexts

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

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

如果你正在寻找一个基于gui的Mac解决方案,并且已经安装了Docker桌面,你可以使用Docker菜单栏图标。在这里,你可以找到“Kubernetes”菜单,其中包含了你在kubecconfig中拥有的所有上下文,并且可以轻松地在它们之间切换。

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

  • 列表上下文:kubectx
    • 等价于kubectl config get-contexts
    • 李< / ul > < / >
    • 切换上下文(到foo): kubectx foo
      • 等价于kubectl config use-context foo
      • 李< / ul > < / >

      在macOS上安装:brew install kubectx

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

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

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

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

enter image description here

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

切换/读取/操作不同的kubernetes环境(又名kubernetes上下文)的标准答案是,正如Mark提到的,使用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 /谷歌云平台开发人员体验团队的一个名为“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

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

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

上下文切换

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

例如,在我的特定情况下,我有4个不同的集群——本地和远程运行的Swarm和Kubernetes的混合 假设我有一个默认的集群运行在我的台式机上,2节点集群运行在谷歌云平台上,5节点集群运行在Play with Docker游乐场上,单节点Kubernetes集群运行在Minikube上,我需要定期访问。< / p >

使用docker上下文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

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

我从前面提到的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

最新的2020年答案在这里,

一个简单的方法切换kubectl上下文,

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


kubectl top nodes --context=context02name

你也可以像env一样存储上下文名称 context01name = gke_ $ {GOOGLE_CLOUD_PROJECT} _us-central1-a_standard-cluster-1 < / p >

上下文列表

kubectl config get-contexts

上下文切换

kubectl config set current-context MY-CONTEXT

了解所有的背景

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

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

你可以从在这里安装它。

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