我让Kubernetes在两个不同的环境中运行良好,即在我的本地环境(运行minikube的MacBook)以及Google的Container Engine(GCE,Google Cloud上的Kubernetes)。我使用MacBook /本地环境开发和测试我的YAML文件,然后在完成后,在GCE上尝试它们。
目前我需要单独处理每个环境:我需要在本地环境中编辑YAML文件,并在准备好后,(git)将它们克隆到GCE环境,然后使用/部署它们。这是一个有点麻烦的过程。
理想情况下,我想使用我的Macbook中的kubectl轻松切换本地minikube或GCE Kubernetes环境,并轻松确定YAML文件的使用位置。有没有一种简单的方法来切换上下文来做到这一点?
您可以从本地(minikube)切换到gcloud并返回:
kubectl config use-context CONTEXT_NAME
列出所有上下文:
kubectl config get-contexts
您可以为本地和云创建不同的环境,并将其放在单独的yaml文件中。
如果您正在寻找基于GUI的Mac解决方案并安装了Docker Desktop,则可以使用Docker菜单栏图标。在这里,您可以找到“Kubernetes”菜单,其中包含您在kubeconfig中的所有上下文,并可在它们之间轻松切换。
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
标准kubectl命令的更快捷方式是使用kubectx:
kubectx
相当于kubectl config get-contexts
kubectx foo
相当于kubectl config use-context foo
要在macOS上安装:brew install kubectx
kubectx软件包还包括一个用于切换命名空间的类似工具kubens
。
如果您经常在多个上下文和命名空间中工作,这两个是非常方便的。
在repos中为不同的环境克隆YAML文件绝对是理想的选择。您要做的是通过提取不同环境的参数来模拟您的YAML文件。
当然,您可以使用一些模板引擎并将YAML中的值分开,并为特定环境生成YAML。但如果采用Helm Charts,这很容易实现。要查看一些示例图表,请访问此Github repo的稳定目录
举一个Wordpress chart的例子,你可以为两个环境提供两个不同的命令:
对于Dev:
helm install --name dev-release --set \
wordpressUsername=dev_admin, \
wordpressPassword=dev_password, \
mariadb.mariadbRootPassword=dev_secretpassword \
stable/wordpress
虽然没有必要在CLI上传递这些值,但是您可以将值存储在名为aptly values.yml
的文件中,并且可以为不同的环境提供不同的文件
您将需要一些工作来转换到Helm图表标准,但努力将是值得的。
正如Mark所说,切换/读取/操纵不同kubernetes环境(aka kubernetes contexts)的规范答案是使用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
还查看最新的(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在本地和远程运行的混合。 假设我的桌面计算机上运行了默认集群,在Google Cloud Platform上运行了2节点Swarm集群,在Play上运行了5节点集群,Docker操场和在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
是的,我认为这就是你的要求。要查看当前配置,请使用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/