一 背景
Kubernetes
生态在很多企业广泛应用的当下,相信很多运维和开发人员都会同时管理和维护多个 Kubernetes
集群,比如:开发环境、测试环境、预发布环境、生产环境等等,此刻如果你还在通过将不同kubeconfig文件来重新命名区分,来切换集群,那可以仔细看看本文,详细会有收获,享受如丝般顺滑的多集群切换管理。
二 原理
我们日常管理k8s,通过kubectl,其本质为一个与kube-apiserver通信的客户端,因为kube-apiserver需要做认证鉴权,所以kubectl实用需要kubeconfig文件来存储认证信息,通常kubeconfig存储信息如下:
用来验证 kube-apiserver
的 CA 根证书
用来标识 kubectl
管理员的 证书 & 私钥
,或者用来标识普通用户的 token
kubeconfig
是一个 YAML 格式的配置文件,其主要字段如下:
clusters
类型为数组,每个元素代表一个 k8s cluster
users
类型为数组,每个元素代表拥有访问权限的用户
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:
name: ksprod
# kstest集群
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcxxxxxxxxxxxxxxxxxx
server: https:
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 文件
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 安装
$ curl -Lo kubecm.tar.gz https://github.com/sunny0826/kubecm/releases/download/v0.8.0/kubecm_0.8.0_Linux_x86_64.tar.gz
$ curl -Lo kubecm.tar.gz https://github.com/sunny0826/kubecm/releases/download/v0.8.0/kubecm_0.8.0_Darwin_x86_64.tar.gz
$ curl -Lo kubecm.tar.gz https://github.com/sunny0826/kubecm/releases/download/v0.8.0/kubecm_0.8.0_Windows_x86_64.tar.gz
$ tar -zxvf kubecm.tar.gz kubecm
$ sudo mv kubecm /usr/local/bin/
$ unzip kubecm.tar.gz
$ 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 merge -f mike-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 add -f mike-local-kubernetes.yaml
$ kubecm add -f mike-local-kubernetes.yaml -n test
$ kubecm delete mike-local-kubernetes
$ kubecm rename -o dev -n test
$ kubecm rename -n dev -c
以上就是 KubeCM
的一些命令行下的常规操作,为了更高效的使用命令行。KubeCM
还提供了 SHELL
自动补全功能,只需按下面的方法简单设置一下即可。
a. 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
b. zsh
source <(kubecm completion zsh)
$ kubecm completion zsh > "${fpath[1]}/_kubecm"
KubeCM
不仅提供了命令行模式,它还提供更加人性化的交互模式。
https://kaliarch-bucket-1251990360.cos.ap-beijing.myqcloud.com/blog_img/ScreenRecorderProject1.gif
四 反思
至此,我们在本地,就可以轻松切换多集群,和切换多ns,来交互式的管理,也可以轻松添加删除其他集群。当然还有不少优秀的工具,在此就不一一列举
评论