问题描述
我们需要使用 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
参考文献
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