推荐阅读
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.21 | k8s-cluster-a | k8s-cluster-a-context | k8s-cluster-a-admin |
192.168.92.22 | k8s-cluster-b | k8s-cluster-b-context | k8s-cluster-b-admin |
192.168.92.23 | k8s-cluster-c | k8s-cluster-c-context | k8s-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,转载请注明出处。如有发现文章中的任何问题,欢迎评论区留言。