概述

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

kubectl config

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

  1. [root@liqinag.io]# kubectl config
  2. ... ...
  3. Available Commands:
  4. current-context 显示当前的上下文
  5. delete-cluster 删除 kubeconfig 文件中指定的集群
  6. delete-context 删除 kubeconfig 文件中指定的上下文
  7. get-clusters 显示 kubeconfig 文件中定义的集群
  8. get-contexts 描述一个或多个上下文
  9. rename-context Renames a context from the kubeconfig file.
  10. set 设置 kubeconfig 文件中的一个单个值
  11. set-cluster 设置 kubeconfig 文件中的一个集群条目
  12. set-context 设置 kubeconfig 文件中的一个上下文条目
  13. set-credentials 设置 kubeconfig 文件中的一个用户条目
  14. unset 取消设置 kubeconfig 文件中的一个单个值
  15. use-context 设置 kubeconfig 文件中的当前上下文
  16. view 显示合并的 kubeconfig 配置或一个指定的 kubeconfig 文件
  17. ... ...

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

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

  1. [root@liqiang.io]# kubectl config get-clusters
  2. NAME
  3. kubernetes
  4. [root@liqiang.io]# kubectl config get-contexts
  5. CURRENT NAME CLUSTER AUTHINFO NAMESPACE
  6. * 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 配置的路径添加到环境变量 KUBECONFIG 中就可以了,听上去很美好,不妨实验一下?

  1. [root@liqiang.io]# echo $KUBECONFIG
  2. /root/.kube/config:/root/.kube/config-252
  3. [root@liqiang.io]# kubectl config get-contexts
  4. CURRENT NAME CLUSTER AUTHINFO NAMESPACE
  5. demo01-liuliqiang-rancher-master1 demo01-liuliqiang-rancher-master1 user-29vdq
  6. * kubernetes-admin@kubernetes kubernetes kubernetes-admin
  7. kube-252 demo01 user-29vdq

就是这么简单,这里就添加了两个 context (我这个配置里面配置了两个一样的集群,测试用)。看上去这里的说明是没有骗我的,那么那些命令又是如何使用的呢?

切换 context

  1. [root@liqiang.io]# kubectl config use-context kube-252
  2. Switched to context "kube-252".

context 操作

修改 context 名字

  1. [root@liqiang.io]# kubectl config rename-context kube-252 rancher-252
  2. Context "kube-252" was renamed to "rancher-252".
  3. [root@liqiang.io]# kubectl config get-contexts
  4. CURRENT NAME CLUSTER AUTHINFO NAMESPACE
  5. * kubernetes-admin@kubernetes kubernetes kubernetes-admin
  6. demo01-liuliqiang-rancher-master1 demo01-liuliqiang-rancher-master1 user-29vdq
  7. rancher-252 demo01 user-29vdq

可以发现就是这么简单,通过重命名 context,可以让我们的记录管理更有意义一些,方便我们的多集群管理。

设置 proxy

  1. [root@liqiang.io]# cat ~/.kube/config
  2. ... ...
  3. clusters:
  4. - cluster:
  5. proxy-url: http://proxy.example.org:3128
  6. server: https://k8s.example.org/k8s/clusters/c-xxyyzz
  7. name: development