Kubernetes config多集群管理工具

8,173 阅读5分钟

一 背景

Kubernetes 生态在很多企业广泛应用的当下,相信很多运维和开发人员都会同时管理和维护多个 Kubernetes 集群,比如:开发环境、测试环境、预发布环境、生产环境等等,此刻如果你还在通过将不同kubeconfig文件来重新命名区分,来切换集群,那可以仔细看看本文,详细会有收获,享受如丝般顺滑的多集群切换管理。

二 原理

我们日常管理k8s,通过kubectl,其本质为一个与kube-apiserver通信的客户端,因为kube-apiserver需要做认证鉴权,所以kubectl实用需要kubeconfig文件来存储认证信息,通常kubeconfig存储信息如下:

  1. 用来验证 kube-apiserver 的 CA 根证书
  2. 用来标识 kubectl 管理员的 证书 & 私钥,或者用来标识普通用户的 token

kubeconfig 是一个 YAML 格式的配置文件,其主要字段如下:

  • clusters 类型为数组,每个元素代表一个 k8s cluster
  • users 类型为数组,每个元素代表拥有访问权限的用户
  • contexts 类型为数组,每个元素表示要使用的 cluster & user 组合
  • current-context 当前正在使用的上下文

kubectl 做多集群的管理,本质上就是把集群的相关参数,以及用户的相关信息全都记录下来,然后通过 context 将其组合,通过 current-context 参数来标明当前正在使用的 context

三 解决方案

为了方便管理多个环境的集群,通常都是在本地环境通过 Kubernetes 的客户端工具 kubectl 来管理多个 Kubernetes 集群的。这时你就需要用到各个集群的 kubeconfig 文件,你是不是首先想到的就是手动将多个 kubeconfig 配置文件合并为一个,然后通过 kubectxkubie 这样的工具来快速切换上下文环境(context)来达到多集群环境的管理呢?虽然手动合并 kubeconfig 配置文件的方法是可行的,但是集群环境较多时或者集群环境经常变更时,这样的方法就显得很麻烦了。

3.1 手动合并

目前我有ks的dev和prod环境的kubeconfig,那么我可以手动进行合并,以下手动合并的文件

# apiversion
apiVersion: v1
# 集群字段,以列表的形式记录多个集群
clusters:
# ksprod集群
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcxxxxxxxxxxxxxxxxxx
    server: https://lb.kubesphere.local:6443
  name: ksprod
# kstest集群
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcxxxxxxxxxxxxxxxxxx
    server: https://172.16.60.2:6443
  name: kstest
# context字段用于关联集群和用户
contexts:
# prodadmin@ksprod
- context:
    cluster: ksprod
    user: prodadmin
  name: prodadmin@ksprod
# testadmin@kstest
- context:
    cluster: kstest
    user: testadmin
  name: testadmin@kstest
# 当前集群为那个  
current-context: prodadmin@ksprod
kind: Config
preferences: {}
# 用户字段,列表形式记录用户
users:
# prod环境用户
- name: prodadmin
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJUGNvNy9qRzBOSkF3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFRxxxxxxxxxxxxxxxxxx
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBMDhNMDFWOE5tTXliUUI2bGY4QlAzc1JCZWxhaWJOa2lCQStqUkY2Rxxxxxxxxxxxxxxxxxx
# test环境用户
- name: testadmin
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJR1Z3ZXNNTVRDV2t3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFRxxxxxxxxxxxxxxxxxx
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBeTVPT20zWEpERTlYTDUzWjh5UFhEQWMybmg0bkFzUDl2NW8xTUNZMxxxxxxxxxxxxxxxxxx

3.2 官方方式

官方目前提供了配置环境变量和通过命令行参数显示指定两种方法来解决这个问题。

3.2.1 配置环境变量

配置环境变量指定多个集群的 kubeconfig 文件

# 配置 Kubernetes 多集群,注意使用 : 隔开
export KUBECONFIG=$KUBECONFIG:$HOME/.kube/config:$HOME/.kube/mike-local-kubernetes.yaml:$HOME/.kube/dev-kubernetes.yaml:$HOME/.kube/test-kubernetes.yaml:$HOME/.kube/prod-kubernetes.yaml:$HOME/.kube/okteto-kube.yaml

3.2.2 命令行参数指定配置文件

通过命令行参数显示指定不同集群的 kubeconfig 文件

# 切换到本地集群
kubectl get pod --kubeconfig=$HOME/.kube/mike-local-kubernetes.yaml

# 切换到开发集群
kubectl get pod --kubeconfig=$HOME/.kube/dev-kubernetes.yaml

# 切换到测试集群
kubectl get pod --kubeconfig=$HOME/.kube/test-kubernetes.yaml

# 切换到生产集群
kubectl get pod --kubeconfig=$HOME/.kube/prod-kubernetes.yaml

虽然官方提供的方法,能实现多集群管理。但是不断来回切换 kubeconfig 配置文件或者经常手动编辑环境变量来增减多个集群的配置文件,显然还是比较麻烦的。

接下来,给大家介绍的就是本文的重点,这是一种更优雅的解决方法。

3.3 自动合并工具

既然手动合并太过麻烦和复杂,有没有自动合并工具呢?你别说,还真有且不此一款。下面我们来介绍下如何使用这几款好用的自动合并工具。

3.3.1 kubeCM

3.3.1.1 工具简介

KubeCM 是一款使用 Go 语言开发的 KubeConfig 管理工具,功能非常的强大。它不但能实现多个 KubeConfig 文件的自动合并,还能很方便的管理多个 Kubernetes 集群环境,比如:增加、删除、重命名不同集群环境等。

3.3.1.2 安装

  • 二进制安装
# 根据你的实际情况,下载对应平台二进制文件即可。

# Linux
$ curl -Lo kubecm.tar.gz https://github.com/sunny0826/kubecm/releases/download/v0.8.0/kubecm_0.8.0_Linux_x86_64.tar.gz

# macOS
$ curl -Lo kubecm.tar.gz https://github.com/sunny0826/kubecm/releases/download/v0.8.0/kubecm_0.8.0_Darwin_x86_64.tar.gz

# Windows
$ curl -Lo kubecm.tar.gz https://github.com/sunny0826/kubecm/releases/download/v0.8.0/kubecm_0.8.0_Windows_x86_64.tar.gz

# 解压

# Linux & macOS
$ tar -zxvf kubecm.tar.gz kubecm
$ sudo mv kubecm /usr/local/bin/

# Windows
# 你可以使用做任意一款压缩软件进行解压并放到 $PATH
$ unzip kubecm.tar.gz
  • mac 一键安装
$ brew install sunny0826/tap/kubecm

3.3.1.3 使用kubeCM

为了方便演示,我们先创建一个 kubeconfigdir 目录并将多个集群配置文件复制到这里。

$ ll kubeconfigdir
-rw-r--r--  1 xuel  staff   2.1K  7 20 11:05 eks-config
-rw-r--r--  1 xuel  staff   5.3K  7 20 11:05 ks-prod-config
-rw-r--r--  1 xuel  staff   5.3K  7 20 11:05 ks-test-config
-rw-r--r--  1 xuel  staff   7.1K  7 20 11:05 smartops-config-prod
-rw-r--r--  1 xuel  staff   5.3K  7 20 11:06 smartops-config-test

注:你可能发现了,我这里的 Kubeconfig 配置文件都是以 .yaml 结尾的,这是为了方便 Kubie 这个工具进行多集群切换。你只需按自己环境的规则管理 Kubeconfig 文件即可。

  • 使用 KubeCM 完成自动合并
# 将指定目录中的所有 kubeconfig 配置文件合并为一个
$ kubecm merge -f mike-kubeconfig

# 将指定目录中的所有 kubeconfig 配置文件合并为一个并且覆盖默认的 Kubeconfig 配置文件

$ kubecm merge -f kubeconfigdir -c
Loading kubeconfig file: [kubeconfigdir/eks-config kubeconfigdir/ks-prod-config kubeconfigdir/ks-test-config kubeconfigdir/smartops-config-prod kubeconfigdir/smartops-config-test]
Context Add: eks-config
Context Add: ks-prod-config
Context Add: ks-test-config
Context Add: smartops-config-prod
Context Add: smartops-config-test

注意:是否使用 -c 参数的区别是:-c 参数生成的合并后文件名为 .kube/config,而不使用 -c 参数生成的合并后的文件名为 .kube/config.yaml。

  • 使用 KubeCM 快速增加一个集群配置
# 使用 KubeCM 快速增加一个集群配置文件
$ kubecm add -f mike-local-kubernetes.yaml

# 使用 KubeCM 快速增加一个集群配置文件并指定默认命名空间
$ kubecm add -f mike-local-kubernetes.yaml -n test
  • 使用 KubeCM 快速删除一个集群配置
# 通过命令行模式删除一个集群配置
$ kubecm delete mike-local-kubernetes
  • 使用 KubeCM 快速重命名一个集群配置
# 将 dev 重命名为 test
$ kubecm rename -o dev -n test

# 将当前上下文重命名为 dev
$ kubecm rename -n dev -c

以上就是 KubeCM 的一些命令行下的常规操作,为了更高效的使用命令行。KubeCM 还提供了 SHELL 自动补全功能,只需按下面的方法简单设置一下即可。

  • 命令补全

    • bash
    $ kubecm completion bash > ~/.kube/kubecm.bash.inc
    $ printf "
    # kubecm shell completion
    source '$HOME/.kube/kubecm.bash.inc'
    " >> $HOME/.bash_profile
    $ source $HOME/.bash_profile
    
    • zsh
    # add to $HOME/.zshrc 
    source <(kubecm completion zsh)
    # or
    $ kubecm completion zsh > "${fpath[1]}/_kubecm"
    

    KubeCM 不仅提供了命令行模式,它还提供更加人性化的交互模式。

  • 交互式切换集群与ns

四 反思

至此,我们在本地,就可以轻松切换多集群,和切换多ns,来交互式的管理,也可以轻松添加删除其他集群。当然还有不少优秀的工具,在此就不一一列举。