摘要
故障描述
单节点rancher宕机后,无法登录UI界面操作K8S集群,这时可以临时生成集群权限文件,使用该文件即可操作集群。
默认情况下,我们使用rancher,连kubernetes的master主机都不用配置任何参数,那一旦rancher挂机了,master节点又无法使用命令操作集群,该怎么办?
解决方案
我在这里给大家分享一个上面问题的解决方法:
正如你所知,Rancher Server 通过 UI 创建的"自定义"集群,后端是通过 RKE 实现的,所以 RKE(https://docs.rancher.cn/rke/)有能力去纳管Rancher Server 创建的“自定义”集群。
通过RKE 创建和管理 Kubernetes 集群,依赖 3 个文件:
cluster.yml
:RKE 集群配置文件
kube_config_cluster.yml
:该文件包含了获取该集群所有权限的认证凭据
cluster.rkestate
:Kubernetes 集群状态文件,包含了获取该集群所有权限的认证凭据
所以,只要能从下游业务集群中获得这 3 个文件,就可以结合 RKE 二进制文件继续管理下游业务集群。下面将详细介绍如何通过 RKE 纳管 Rancher Server 创建的“自定义”集群,并通过RKE扩展集群的节点。
演示环境
本文只针对 Rancher v2.4.x 和 v2.5.x 版本做了测试,其他版本可能不适用。
为了更好的演示效果,本文将从 Rancher Server 创建“自定义”集群开始,然后通过 RKE 纳管"自定义"集群,最后为了确认 RKE 有能力纳管集群,将演示通过 RKE 添加一个节点。
服务 | IP |
---|---|
rancher server | 192.168.1.200 |
k8s-master01 | 192.168.1.201 |
k8s-work01 | 192.168.1.202 |
模拟:rancher server服务宕机
如果单单rancher server服务宕机,集群中的服务依然可以正常提供服务
接管集群
master主机操作
或装有controlplane
角色的节点可操作
1、创建一个目录,作为恢复集群的工作目录
mkdir /opt/tembak
cd /opt/tembak
2、恢复下游业务集群的kube_config_cluster.yml文件,在controlplane节点上运行以下命令:
docker run --rm --net=host \
-v $(docker inspect kubelet --format '{{ range .Mounts }}{{ if eq .Destination "/etc/kubernetes" }}{{ .Source }}{{ end }}{{ end }}')/ssl:/etc/kubernetes/ssl:ro \
--entrypoint bash $(docker inspect $(docker images -q --filter=label=io.cattle.agent=true) \
--format='{{index .RepoTags 0}}' | tail -1) \
-c 'kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml get configmap \
-n kube-system full-cluster-state \
-o json | jq -r .data.\"full-cluster-state\" | jq \
-r .currentState.certificatesBundle.\"kube-admin\".config | sed \
-e "/^[[:space:]]*server:/ s_:.*_: \"https://127.0.0.1:6443\"_"' \
> kubeconfig_admin.yaml
查看当前目录生成了一个文件kubeconfig_admin.yaml
这个文件就是/root/.kube/config
文件,那我们把这个文件更改名字后,放到/root/.kube
目录下
mv kubeconfig_admin.yaml /root/.kube/config
查看node节点时,会发现没有kubectl
命令
[root@k8s-master01 tembak]# kubectl get node
-bash: /usr/bin/kubectl: No such file or directory
那我们下个一个kubectl
命令,这个版本一定要是可以支持目前集群的版本,下载kubectl
命令网址:http://mirror.rancher.cn/
wget http://rancher-mirror.rancher.cn/kubectl/v1.17.15/linux-amd64-v1.17.15-kubectl
mv linux-amd64-v1.17.15-kubectl kubectl &&chmod +x kubectl && mv kubectl /usr/bin
接下来可以直接通过kubectl命令管理集群了
[root@k8s-master01 tembak]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-work01 Ready worker 3h27m v1.20.9
k8s-master01 Ready controlplane,etcd,worker 19h v1.20.9
完成