故障描述

单节点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

完成