天天看点

kubectl客户端管理多个K8s集群

作者:云原生拓荒者

需求

业务采用K8s集群部署,我们通常会把开发、测试和生产环境分为多个不同集群,或者将不同的业务部署到不同集群。如何使用同一台PC/mac的kubectl客户端管理多个K8s集群。

前提条件

  1. 创建至少2个K8s集群
  2. 完成集群连接的初始化配置,打开集群的公网访问 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。

kubectl客户端管理多个K8s集群

由以上输出结果可知,当前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

kubectl客户端管理多个K8s集群

其次,在第2个集群下,已经创建了一个namespace,名字是xujianhua-gz。在当前context下,执行kubectl get namespace查询到该namespace存在,代表kubectl连接的集群已经切换成功。

kubectl客户端管理多个K8s集群

附: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]           

继续阅读