「Kubernetes」- 配置 kubectl 访问多个集群

  CREATED BY JENKINSBOT

问题描述

我们需要使用 kubectl 命令管理多个 Kubernetes 集群,这需要使用 kubectl config Context 相关配置来实现。

该章节将记录:如何使用 kubectl 命令来管理多个 Kubernetes 集群,以及相关问题的处理方法。

解决方案

方法一、通过 TOKEN 管理

适用场景:在这种情况下,管理员负责管理集群,并分发 TOKEN 给我们,我们通过 TOKEN 管理集群。

操作分为四步,为了记忆能够这样理解:
1)添加 Cluster 信息;
2)添加访问 Cluster 所使用的 TOKEN 信息;
3)创建 Context 以将 TOKEN 与 Cluster 进行绑定(关联);
4)切换到 Context 以使用该 Context 来访问集群;

详细操作过程如下:

# kubectl config set-cluster "example-k8s-staging" --insecure-skip-tls-verify=true --server=https://k8scp-endpoint.example.xyz:6443

# kubectl config set-credentials "example-k8s-staging-admin-token" --token='eyJhbGciOiJSUzI1NiIsIm...'

# kubectl config set-context "example-k8s-staging-ctx" --cluster="example-k8s-staging" --user="example-k8s-staging-admin-token"

# kubectl config use-context "example-k8s-staging-ctx"

补充说明:
1)选项 –token 所使用的 token 参数应该向集群管理员索取(参考 Using RBAC Authorization 笔记,以了解创建 TOKEN 的方法)
2)–insecure-skip-tls-verify=true:鉴于我们集群是自签名证书,所以应该使用 –certificate-authority 指定 CA 信息,但我们使用该选项偷懒;

方法二、合并 .kube/config 文件

我们部署多套 Kubernetes 集群,所以有多个集群的 .kube/config 配置文件,而我们希望合并这些配置文件。

# 第一步:被合并的多个 config 文件的 name 字段不能相同,否则仅能保留其中某个配置
# 因此,我们使用如下脚本进行修改:
sed -i -E 's/kubernetes-admin/kubernetes-admin-foo/' config-foo
sed -i -E 's/kubernetes$/kubernetes-foo/' config-foo

# 第二步、使用 kubectl 命令:
KUBECONFIG=~/.kube/config:/path/to/config-foo kubectl config view --flatten > .kube/config-merged

如上第二步,我们还能够使用 kubectl konfig merge 命令来合并配置文件:
1)安装 krew 插件,参考 krew 笔记;
2)安装 konfig 插件:kubectl krew install config
3)导入:kubectl konfig import -s new.yaml
4)或者,合并:kubectl konfig merge ./config1 ./config2

方法三、使用 –kubeconfig 选项

kubectl get pods --kubeconfig=file1

常用工具

kubectx, kubens, fzf

ahmetb/kubectx: Faster way to switch between clusters and namespaces in kubectl
jonmosco/kube-ps1: Kubernetes prompt info for bash and zsh’

kubectx,负责快速切换 Context;
kubens,负责快速切换 Namesapce;
fzf,提供交互式命令行,允许我们在命令行中通过键盘进行选择;

# 首先,安装 krew 插件,进行插件管理
...

# 然后,安装 kubectx 与 kubens 插件
kubectl krew install ctx
kubectl krew install ns

# 查看并切换上下文:
kubectl ctx
kubectl ctx 'context-name'

# 查看并切换命名空间:
kubectl ns
kubectl ns 'namespace'

# 安装 fzf 工具,使得 kubectl ctx 能够直接进行交互式操作
apt-get install fzf                                                             # for Ubuntu 20.04 LTS

kube-ps1

junegunn/fzf: A command-line fuzzy finder

提供命令行提示符

kubesess

https://github.com/Ramilito/kubesess

kubesess 是使用 Rust 编写的基于 Session 的 Kubernetes context 和 nemsapce 管理工具,在一个终端窗口中切换 context 或者 namespace 并不会影响到另一个终端窗口。

kubecm

WIP

参考文献

Configure Access to Multiple Clusters | Kubernetes
ssl – kubectl unable to connect to server: x509: certificate signed by unknown authority – Stack Overflow
kubernetes – How to merge kubectl config file with ~/.kube/config? – Stack Overflow
Mastering the KUBECONFIG file
python – How to combine a prefix to output of ls in bash? – Stack Overflow
How to Join Multiple Lines Into One | Baeldung on Linux
Trick #7 – Merge All The KUBECONFIGs!