在使用 Kubernetes 的时候,肯定会有很多环境切换的问题,例如开发环境必须是有的,然后还有测试环境,联调环境等等,当然,当需要某个环节的时候,我们手动登录上去这个环境然后再看是可以的操作。但是,其实,作为一个便利的平台,其实 K8S 已经给我们提供了很好的工具,例如 kubectl 就已经可以做到多环境管理了。

在我还不知道这个特性的时候,我就尝试看看 kubectl 命令有什么子命令,于是乎,当我发现 kubectl config 的时候,如获至宝,所以就了解了一下,首先先来看看整体上 kubectl config 有哪些选项:

[[email protected]]# 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 文件
... ...

看上去似乎真的很厉害,但是这里有一些概念我不太确定是什么意思,所以就一一得去找一找,然后得出的结论就是:

这样一来,关系就通顺啦,我们要通过 kubectl 访问一个 k8s 集群,那么首先要有用户认证的方式,那么这个就是 credentials 了,然后再加上我们要操作的 k8s cluster,那么这就是一个完整的 context。既然 context 的概念知道了,又该如何使用?先看看现在有哪些 cluster 和 context 吧:

[[email protected]]# kubectl config get-clusters
NAME
kubernetes
[[email protected]]# kubectl config get-contexts
CURRENT   NAME                          CLUSTER      AUTHINFO             NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin

可以发现这里就只有一个默认的配置,很正常,因为一般来说,我们的操作都是在 kubeadm 安装完集群之后,按照提示拷贝 ~/.kube/config 配置来访问 k8s 集群的。那么,既然如此我们就添加一个呗,但是,在动手之前,不妨再仔细看看命令的说明,毕竟人家也是辛苦得写了那么多:

  1. 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 中就可以了,听上去很美好,不妨实验一下?

[[email protected]]# echo $KUBECONFIG
/root/.kube/config:/root/.kube/config-252
[[email protected]]# 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 名字

[[email protected]]# kubectl config rename-context kube-252 rancher-252
Context "kube-252" was renamed to "rancher-252".
[[email protected]]# 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,可以让我们的记录管理更有意义一些,方便我们的多集群管理。