概述
在使用 Kubernetes 的时候,肯定会有很多环境切换的问题,例如开发环境必须是有的,然后还有测试环境,联调环境等等,当然,当需要某个环节的时候,我们手动登录上去这个环境然后再看是可以的操作。但是,其实,作为一个便利的平台,其实 K8S 已经给我们提供了很好的工具,例如 kubectl 就已经可以做到多环境管理了。
kubectl config
在我还不知道这个特性的时候,我就尝试看看 kubectl
命令有什么子命令,于是乎,当我发现 kubectl config
的时候,如获至宝,所以就了解了一下,首先先来看看整体上 kubectl config
有哪些选项:
[root@liqinag.io]# kubectl config
... ...
Available Commands:
current-context 显示当前的上下文
delete-cluster 删除 kubeconfig 文件中指定的集群
delete-context 删除 kubeconfig 文件中指定的上下文
get-clusters 显示 kubeconfig 文件中定义的集群
get-contexts 描述一个或多个上下文
rename-context Renames a context from the kubeconfig file.
set 设置 kubeconfig 文件中的一个单个值
set-cluster 设置 kubeconfig 文件中的一个集群条目
set-context 设置 kubeconfig 文件中的一个上下文条目
set-credentials 设置 kubeconfig 文件中的一个用户条目
unset 取消设置 kubeconfig 文件中的一个单个值
use-context 设置 kubeconfig 文件中的当前上下文
view 显示合并的 kubeconfig 配置或一个指定的 kubeconfig 文件
... ...
看上去似乎真的很厉害,但是这里有一些概念我不太确定是什么意思,所以就一一得去找一找,然后得出的结论就是:
- cluster:一个 k8s 集群
- credentials:一个用户认证信息,可以是用户名密码,token,或者证书
- context:一个 credentials + k8s 的组合
这样一来,关系就通顺啦,我们要通过 kubectl 访问一个 k8s 集群,那么首先要有用户认证的方式,那么这个就是 credentials 了,然后再加上我们要操作的 k8s cluster,那么这就是一个完整的 context。既然 context 的概念知道了,又该如何使用?先看看现在有哪些 cluster 和 context 吧:
[root@liqiang.io]# kubectl config get-clusters
NAME
kubernetes
[root@liqiang.io]# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@kubernetes kubernetes kubernetes-admin
可以发现这里就只有一个默认的配置,很正常,因为一般来说,我们的操作都是在 kubeadm 安装完集群之后,按照提示拷贝 ~/.kube/config
配置来访问 k8s 集群的。那么,既然如此我们就添加一个呗,但是,在动手之前,不妨再仔细看看命令的说明,毕竟人家也是辛苦得写了那么多:
- If $KUBECONFIG environment variable is set, then it is used a list of paths (normal path delimitting rules for your
system). These paths are merged. When a value is modified, it is modified in the file that defines the stanza. When a
value is created, it is created in the first file that exists. If no files in the chain exist, then it creates the last
file in the list.
KUBECONFIG
这里好像写了什么有意思的东西哦,从这里看上去,似乎我们只要将 kubeconfig 配置的路径添加到环境变量 KUBECONFIG 中就可以了,听上去很美好,不妨实验一下?
[root@liqiang.io]# echo $KUBECONFIG
/root/.kube/config:/root/.kube/config-252
[root@liqiang.io]# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
demo01-liuliqiang-rancher-master1 demo01-liuliqiang-rancher-master1 user-29vdq
* kubernetes-admin@kubernetes kubernetes kubernetes-admin
kube-252 demo01 user-29vdq
就是这么简单,这里就添加了两个 context (我这个配置里面配置了两个一样的集群,测试用)。看上去这里的说明是没有骗我的,那么那些命令又是如何使用的呢?
切换 context
[root@liqiang.io]# kubectl config use-context kube-252
Switched to context "kube-252".
context 操作
修改 context 名字
[root@liqiang.io]# kubectl config rename-context kube-252 rancher-252
Context "kube-252" was renamed to "rancher-252".
[root@liqiang.io]# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@kubernetes kubernetes kubernetes-admin
demo01-liuliqiang-rancher-master1 demo01-liuliqiang-rancher-master1 user-29vdq
rancher-252 demo01 user-29vdq
可以发现就是这么简单,通过重命名 context,可以让我们的记录管理更有意义一些,方便我们的多集群管理。
设置 proxy
[root@liqiang.io]# cat ~/.kube/config
... ...
clusters:
- cluster:
proxy-url: http://proxy.example.org:3128
server: https://k8s.example.org/k8s/clusters/c-xxyyzz
name: development