需求
业务采用K8s集群部署,我们通常会把开发、测试和生产环境分为多个不同集群,或者将不同的业务部署到不同集群。如何使用同一台PC/mac的kubectl客户端管理多个K8s集群。
前提条件
- 创建至少2个K8s集群
- 完成集群连接的初始化配置,打开集群的公网访问 Config,获取集群访问凭证。复制集群访问凭证到安装 kubectl客户端后生成的本地$HOME/.kube/config文件中。
方法
kubeconfig文件介绍
kubectl客户端默认根据$HOME/.kube/config文件中记录的配置信息访问K8s集群。
$HOME/.kube/config 主要包含3块信息:clusters,contexts,users。
- clusters:定义容器集群名称,集群apiserver的地址,以及访问apiserver的证书。一个clusters块下可以定义多个cluster。
- contexts:定义访问集群的用户,一个contexts块下支持多个context。每个context声明一条信息,即访问某个特定集群的特定用户。
- users:定义所有集群的用户和凭证。
kubeconfig文件还包含current-context信息,代表当前kubectl客户端连接的context。current-context的值可以通过命令行切换。
文件结构
apiVersion: v1
#定义集群
clusters:
- cluster:
certificate-authority-data:
server:
name:
#定义上下文,连接特定集群的特定user
contexts:
- context:
cluster:
user:
name:
#定义当前生效的上下文,代表kubectl当前连接的集群
current-context:
kind: Config
preferences: {}
#定义可访问集群的user和凭证
users:
- name:
user:
client-certificate-data:
client-key-data:
kubeconfig配置信息合并方法
把多个集群的cluster,context,user信息分别合并到同一个config文件中clusters,contexts和users块中。
样例
apiVersion: v1
clusters:
- cluster: #集群1
certificate-authority-data: xxx
server: https://180.184.xxx.xxx:6443
name: cc89l23mrsfeijrtebk0g
- cluster: #集群2
certificate-authority-data: xxx
server: https://180.185.xxx.xxx:6443
name: cceqes6nqtoflrg7dere0
contexts:
- context: #上下文1
cluster: cc89l23mrsfeijrtebk0g
user: 1011915-kcebhnnj783f1jn6ma36g
name: cc89l23mrsfeijrtebk0g@1011915
- context: #上下文2
cluster: cceqes6nqtoflrg7dere0
user: 1011915-kceqh0qvqtofkfqri0170
name: cceqes6nqtoflrg7dere0@1011915-kceqh0qvqtofkfqri0170
#当前生效的上下文
current-context: cc89l23mrsfeijrtebk0g@1011915-kcebhnnj783f1jn6ma36g
kind: Config
preferences: {}
users:
# 用户1
- name: 1011915-kcebhnnj783f1jn6ma36g
user:
client-certificate-data: xxx
client-key-data: xxx
# 用户2
- name: 1011915-kceqh0qvqtofkfqri0170
user:
client-certificate-data: xxx
client-key-data: xxx
集群切换
step1:通过kubectl config get-contexts查看当前所有context。
由以上输出结果可知,当前kubeconfig文件配置了2个contexts。
step2:通过kubectl config use-context命令切换current-context。
# 切换上下文
kubectl config use-context cceqes6nqtoflrg7dere0@1011915-kceqh0qvqtofkfqri0170 --kubeconfig=.kube/config
step3:验证切换后的效果
首先,current context已经切换到第2个context
其次,在第2个集群下,已经创建了一个namespace,名字是xujianhua-gz。在当前context下,执行kubectl get namespace查询到该namespace存在,代表kubectl连接的集群已经切换成功。
附:kubectl config支持的命令
Available Commands:
current-context Display the current-context
delete-cluster 删除 kubeconfig 文件中指定的集群
delete-context 删除 kubeconfig 文件中指定的 context
delete-user Delete the specified user from the kubeconfig
get-clusters 显示 kubeconfig 文件中定义的集群
get-contexts 描述一个或多个 contexts
get-users Display users defined in the kubeconfig
rename-context Rename a context from the kubeconfig file
set Set an individual value in a kubeconfig file
set-cluster Set a cluster entry in kubeconfig
set-context Set a context entry in kubeconfig
set-credentials Set a user entry in kubeconfig
unset Unset an individual value in a kubeconfig file
use-context Set the current-context in a kubeconfig file
view 显示合并的 kubeconfig 配置或一个指定的 kubeconfig 文件
Usage:
kubectl config SUBCOMMAND [options]