Kubernetes config多集群管理工具
一 背景
Kubernetes
生态在很多企业广泛应用的当下,相信很多运维和开发人员都会同时管理和维护多个 Kubernetes
集群,比如:开发环境、测试环境、预发布环境、生产环境等等,此刻如果你还在通过将不同kubeconfig文件来重新命名区分,来切换集群,那可以仔细看看本文,详细会有收获,享受如丝般顺滑的多集群切换管理。
二 原理
我们日常管理k8s,通过kubectl,其本质为一个与kube-apiserver通信的客户端,因为kube-apiserver需要做认证鉴权,所以kubectl实用需要kubeconfig文件来存储认证信息,通常kubeconfig存储信息如下:
- 用来验证
kube-apiserver
的 CA 根证书 - 用来标识
kubectl
管理员的证书 & 私钥
,或者用来标识普通用户的token
kubeconfig
是一个 YAML 格式的配置文件,其主要字段如下:
clusters
类型为数组,每个元素代表一个 k8s clusterusers
类型为数组,每个元素代表拥有访问权限的用户contexts
类型为数组,每个元素表示要使用的cluster
&user
组合current-context
当前正在使用的上下文
kubectl 做多集群的管理,本质上就是把集群的相关参数,以及用户的相关信息全都记录下来,然后通过 context
将其组合,通过 current-context
参数来标明当前正在使用的 context
。
三 解决方案
为了方便管理多个环境的集群,通常都是在本地环境通过 Kubernetes
的客户端工具 kubectl
来管理多个 Kubernetes
集群的。这时你就需要用到各个集群的 kubeconfig
文件,你是不是首先想到的就是手动将多个 kubeconfig
配置文件合并为一个,然后通过 kubectx
或 kubie
这样的工具来快速切换上下文环境(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,来交互式的管理,也可以轻松添加删除其他集群。当然还有不少优秀的工具,在此就不一一列举。
- 点赞
- 收藏
- 关注作者
评论(0)