问题描述
我们需要使用 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!