配置kubeconfig文件实现kubectl多集群切换

本文介绍如何整合多个Kubernetes集群的kubeconfig文件,并通过切换上下文参数来访问不同的集群。主要内容包括kubeconfig文件结构解析、多集群kubeconfig文件整合步骤及如何根据上下文切换集群。
摘要由CSDN通过智能技术生成

推荐阅读

Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506
Helm3(K8S 资源对象管理工具)博客专栏:https://blog.csdn.net/xzk9381/category_10895812.html

本文原文链接:https://blog.csdn.net/xzk9381/article/details/116984880,转载请注明出处。如有发现文章中的任何问题,欢迎评论区留言。

一、kubeconfig 文件结构

由于业务的区分或者是双机房的情况,经常需要维护多个 k8s 集群。那么这种情况就会出现一个痛点,使用 kubectl 命令调用 kubeconfig 文件只能访问一个指定的集群,如果需要访问其他集群,就需要将 kubeconfig 替换。

其实我们也可以将多个集群的 kubeconfig 文件整合到一起,然后通过切换上下文内容来实现访问不同的集群。但是整合的前提是每个集群的 kubeconfig 文件都要有不同的上下文参数。

如果想了解如何制作具有不同上下文参数的 kubeconfig 文件,可以参考我的另一篇文章:在k8s集群中自定义kubeconfig文件

接下来说一下如何将 kubeconfig 进行整合并且切换上下文参数。

首先我们给出本文示例中会使用到的 k8s 集群信息:

apiserver 地址集群名称上下文名称用户名
192.168.92.21k8s-cluster-ak8s-cluster-a-contextk8s-cluster-a-admin
192.168.92.22k8s-cluster-bk8s-cluster-b-contextk8s-cluster-b-admin
192.168.92.23k8s-cluster-ck8s-cluster-c-contextk8s-cluster-c-admin

在这个列表中我们指定了每个集群关联的上下文名称和用户名。为了便于理解合并的过程,我们首先分析一个 kubeconfig 文件中的结构(忽略了部分证书信息):

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5akNDQWJLZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201b
......
......
NSS2gwcVpibmNyRWVudTZadWI0RUgrc2dsUUtTemljZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
    server: https://192.168.92.21:6443
  name: k8s-cluster-a
contexts:
- context:
    cluster: k8s-cluster-a
    user: k8s-cluster-a-admin
  name: k8s-cluster-a-context
current-context: ""
kind: Config
preferences: {}
users:
- name: k8s-cluster-a-admin
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURiVENDQWxXZ0F3SUJBZ0lVRVRIT3JrWWw1TGhyWVgxYTE0TTF3Vm5jMjl3d0RRWUpLb1pJaHZjTkFRRUwKQlFBd
......
......
Y3JmcGNWaHhWdThhdTl6VU0wN08wS1RXTWJUUjRtMmVGeTRECkdYdUlOdysvSDRPNGpyTTE1b01ET0pFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBd25mWjc4c2xYbU9FRGFVL0xIRDYzU0c0cnNTelJMMHZ3OHZ2U2lhNWE2dDgwOXlLC
......
......
i0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==

整个 kubeconfig 文件是一个 yaml 结构,我们对每行的含义进行说明:

  • 1 行:指定 api 接口的版本
  • 2 行:定义一个 clusters 列表,下面会声明一个或多个集群。
  • 3 行:定义一个集群信息
  • 4 行:保存 apiserver 的 CA 证书信息,用于服务端的认证
  • 8 行:指定这个集群的 apiserver 访问地址
  • 9 行:为这个集群指定一个名称,用于和上下文名称进行关联
  • 10 行:定义一个 context(上下文)列表,下面会声明一个或多个上下文参数
  • 11 行:定义一个 context
  • 12-13 行:指定当前 context 需要绑定的集群名称和用户名
  • 14 行:指定当前 context 的名称,后续会根据这个名称来选择对应的集群
  • 15 行:指定当前 kubeconfig 使用哪个上下文名称,每次切换时都会更新这里的内容
  • 16 行:指定当前这个 yaml 文件的类型为 Config
  • 18 行:定义一个 users 列表
  • 19 行:定义一个 user,并设置名称,这个名称会与 context 进行关联
  • 20 行:定义用户的证书信息,用于客户端认证

从上面说明中,我们可以看到可以在 kubeconfig 中定义多个 cluster、context、user。而 context 会关联集群的名称和访问集群的用户名。

二、整合 kubeconfig 文件

根据前面给出的 k8s 信息,到每个集群中获取对应的 kubeconfig 文件,首先将每个 kubeconfig 文件中的 cluster 信息整合到一起:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5akNDQWJLZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFas
    server: https://192.168.92.21:6443
  name: k8s-cluster-a
- cluster:
    certificate-authority-data: iVENDQWxXZ0F3SUJBZ0lVRVRIT3JrWWw1TGhyWVgxYTE0TTF3Vm5jMjl3d0RRWUpLb1pJaHZjTakNDQWJLZ0F3SUJBZ0lCSUZ
    server: https://192.168.92.22:6443
  name: k8s-cluster-b
- cluster:
    certificate-authority-data: QWJLZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFasLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5akND
    server: https://192.168.92.23:6443
  name: k8s-cluster-c

这样一个包含所有 cluster 信息的列表就整合完成,接下来将每个 kubeconfig 文件中的 context 信息放到 contexts 列表中:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5akNDQWJLZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFas
    server: https://192.168.92.21:6443
  name: k8s-cluster-a
- cluster:
    certificate-authority-data: iVENDQWxXZ0F3SUJBZ0lVRVRIT3JrWWw1TGhyWVgxYTE0TTF3Vm5jMjl3d0RRWUpLb1pJaHZjTakNDQWJLZ0F3SUJBZ0lCSUZ
    server: https://192.168.92.22:6443
  name: k8s-cluster-b
- cluster:
    certificate-authority-data: QWJLZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFasLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5akND
    server: https://192.168.92.23:6443
  name: k8s-cluster-c
contexts:
- context:
    cluster: k8s-cluster-a
    user: k8s-cluster-a-admin
  name: k8s-cluster-a-context
- context:
    cluster: k8s-cluster-b
    user: k8s-cluster-b-admin
  name: k8s-cluster-b-context
- context:
    cluster: k8s-cluster-c
    user: k8s-cluster-c-admin
  name: k8s-cluster-c-context
current-context: k8s-cluster-a-context

每个 context 都关联着一个集群和一个用户名,最后我们将 user 信息整合到 users 列表中:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5akNDQWJLZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFas
    server: https://192.168.92.21:6443
  name: k8s-cluster-a
- cluster:
    certificate-authority-data: iVENDQWxXZ0F3SUJBZ0lVRVRIT3JrWWw1TGhyWVgxYTE0TTF3Vm5jMjl3d0RRWUpLb1pJaHZjTakNDQWJLZ0F3SUJBZ0lCSUZ
    server: https://192.168.92.22:6443
  name: k8s-cluster-b
- cluster:
    certificate-authority-data: QWJLZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFasLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5akND
    server: https://192.168.92.23:6443
  name: k8s-cluster-c
contexts:
- context:
    cluster: k8s-cluster-a
    user: k8s-cluster-a-admin
  name: k8s-cluster-a-context
- context:
    cluster: k8s-cluster-b
    user: k8s-cluster-b-admin
  name: k8s-cluster-b-context
- context:
    cluster: k8s-cluster-c
    user: k8s-cluster-c-admin
  name: k8s-cluster-c-context
current-context: k8s-cluster-a-context
users:
- name: k8s-cluster-a-admin
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURiVENDQWxXZ0F3SUJBZ0lVRVRIT3JrWWw1TGhyWVgxYTE0TTF3Vm5jM
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBd25mWjc4c2xYbU9FRGFVL0xIRDYzU0c
- name: k8s-cluster-b-admin
  user:
    client-certificate-data: lVRVRIT3JrWWw1TGhyWVgxYTE0TTF3Vm5jMLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURiVENDQWxXZ0F3SUJBZ0
    client-key-data: kFBS0NBUUVBd25mWjc4c2xYbU9FRGFVL0xIRDYzU0cLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQ
- name: k8s-cluster-c-admin
  user:
    client-certificate-data: LS0tLS1CRUdJTiZ0F3SUJBZ0lVRVRIT3JrWWw1TGhyWVgxYTE0TTF3Vm5jMBDRVJUSUZJQ0FURS0tLS0tCk1JSURiVENDQWxX
    client-key-data: RVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBd25mWjc4c2xYbU9FRGFVL0xIRDYzU0cLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBL

这样一个整合后的 kubeconfig 文件就完成了,里面包含了三个集群的证书、上下文、访问用户等信息。

三、根据上下文切换集群

kubeconfig 制作完成后,将其移动到当前用户家目录的 .kube 目录下,并重命名为 config。例如我们现在需要到 k8s-cluster-c 集群中执行命令,那么首先使用如下命令切换上下文:

$ kubectl config use-context k8s-cluster-c-context
Switched to context "k8s-cluster-c-context".

这样执行 kubectl 命令就会直接操作 k8s-cluster-c 集群。此时到 config 文件中查看 current-context 的配置信息,也是显示 k8s-cluster-c-context

本文原文链接:https://blog.csdn.net/xzk9381/article/details/116984880,转载请注明出处。如有发现文章中的任何问题,欢迎评论区留言。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

店伙计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值