本文来自Rancher Labs
作者介绍王海龙,Rancher中国社区技术经理,负责Rancher中国技术社区的保护和经营。领有6年的云计算畛域教训,经验了OpenStack到Kubernetes的技术改革,无论底层操作系统Linux,还是虚拟化KVM或是Docker容器技术都有丰盛的运维和实践经验。
在理论应用Rancher过程中,偶然会因为误操作删除了System Workload、节点或集群, 导致集群状态异样而无法访问。如果用户不理解复原办法,通常会从新增加节或从新搭建集群。
本文将依据以下几个场景来介绍如何复原因为误操作引起的Rancher集群故障:
- 如何复原System Project Workload
- 如何复原从Rancher UI或kubectl误删的节点
- 如何复原执行过清理节点脚本的节点
- 如何复原被删除的
custom
集群
重要阐明
- 本文档基于Rancher 2.4.x测试,其余版本操作可能会略有不同
- 本文介绍的场景均是针对
custom
集群 - 如果您在此过程中遇到问题,则应该相熟Rancher架构/故障排除
- 您应该相熟单节点装置和高可用装置之间的体系结构差别
如何复原System Project Workload
System Project中蕴含了一些保障该集群可能失常运行的一些workload,如果删除某些workload可能会对该集性能群造成影响。
通常状况下,通过RKE创立的custom
集群应包含以下workload:
上面咱们来别离介绍如果误删了这些workload之后应如何复原。
复原cattle-cluster-agent
和cattle-node-agent
模仿故障
从System Project下删除 cattle-cluster-agent
和cattle-node-agent
生成Kubeconfig和集群yaml
1.在Rancher UI上创立API token(用户-> API & Keys)并保留Bearer Token
2.抉择集群后,在Rancher UI(格局为c-xxxxx)中找到其clusterid,并在地址栏中找到它。
3.依据步骤1-2获取的变量替换:RANCHERURL
、CLUSTERID
、TOKEN
(主机须要装置curl和jq)
# Rancher URLRANCHERURL="https://192.168.99.201"# Cluster IDCLUSTERID="c-v6mtr"# TokenTOKEN="token-klt5n:2smg6n5cb5vstn7qm797l9fbc7s9gljxjw528r7c5c4mwf2g7kr6nm"# Valid certificatescurl -s -H "Authorization: Bearer ${TOKEN}" "${RANCHERURL}/v3/clusterregistrationtokens?clusterId=${CLUSTERID}" | jq -r '.data[] | select(.name != "system") | .command'# Self signed certificatescurl -s -k -H "Authorization: Bearer ${TOKEN}" "${RANCHERURL}/v3/clusterregistrationtokens?clusterId=${CLUSTERID}" | jq -r '.data[] | select(.name != "system") | .insecureCommand'
以上命令执行胜利后,将返回导入集群的命令,请做好备份,命令如下:
curl --insecure -sfL https://192.168.99.201/v3/import/2mgnx6f4tvgk5skfzgs6qlcrvn5nnwqh9kchqbf5lhlnswfcfrqwpr.yaml | kubectl apply -f -
复原cattle-cluster-agent
和cattle-node-agent
1、在具备controlplane
角色的节点上生成kubeconfig
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
2、利用更新
将https://xxx/v3/import/dl75kfmmbp9vj876cfsrlvsb9x9grqhqjd44zvnfd9qbh6r7ks97sr.yaml
替换为生成Kubeconfig和集群yaml步骤中生成的yaml连贯,本例为https://192.168.99.201/v3/import/2mgnx6f4tvgk5skfzgs6qlcrvn5nnwqh9kchqbf5lhlnswfcfrqwpr.yaml
docker run --rm --net=host -v $PWD/kubeconfig_admin.yaml:/root/.kube/config --entrypoint bash $(docker inspect $(docker images -q --filter=label=io.cattle.agent=true) --format='{{index .RepoTags 0}}' | tail -1) -c 'curl --insecure -sfL https://xxx/v3/import/dl75kfmmbp9vj876cfsrlvsb9x9grqhqjd44zvnfd9qbh6r7ks97sr.yaml | kubectl apply -f -'
验证
接下来通过Rancher UI或kubectl能够看到 cattle-cluster-agent
和cattle-node-agent
曾经复原。
复原kube-api-auth
默认状况下,RKE 集群会默认启用受权集群端点。这个端点容许您应用 kubectl CLI 和 kubeconfig 文件拜访上游的 Kubernetes 集群,RKE 集群默认启用了该端点。
如果误删kube-api-auth
,复原的办法也很简略,只须要编辑集群,将“受权集群拜访地址”批改成禁用
,保留集群。而后再用雷同的办法启用
“受权集群拜访地址”即可。
1、编辑集群
2、禁用受权集群拜访地址,保留
3、再次编辑集群,启用受权集群拜访地址,保留
复原nginx-ingress-controller
、canal
、coredns
、metrics-server
组件
nginx-ingress-controller
、canal
、coredns
、metrics-server
这些workload都是通过kube-system
命名空间下的各种job来创立的,所以如果要重建这些workload只须要从新执行对应的job即可。
本例应用nginx-ingress-controller
做演示,其余workload的复原步骤能够参考此复原计划。
模仿故障
从System Project下删除 kube-system
下的default-http-backend和nginx-ingress-controller
执行复原
- 从
kube-system
命名空间下删除rke-ingress-controller-deploy-job
(如果不删除对应的job,更新集群后,不会从新触发job从新执行) - 为了触发集群更新,能够编辑集群,批改NodePort范畴,而后保留。
验证
集群更新胜利后,回到System Project下确认default-http-backend
和nginx-ingress-controller
曾经从新创立。
如何复原从Rancher UI或kubectl误删的节点
当节点处于“流动”状态,从集群中删除节点将触发一个过程来清理节点。如果没有重启服务器,并不会实现所有的革除所有非长久化数据。
如果无心中将节点删除,只须要应用雷同的参数再次增加节点即可复原集群。
比方我的环境有两个节点,别离具备全副
和Worker
角色
从Rancher UI或kubectl将节点rancher2
删除,此时集群中只剩下一个rancher3
节点,因为集群中短少Etcd
和Control
角色,所以集群提醒:Waiting for etcd and controlplane nodes to be registered
接下来,编辑集群,并且设置雷同的节点参数,这中央要留神,肯定要设置和之前增加节点时雷同的节点参数。
复制增加节点命令在rancher2
的SSH终端运行。
过一会,再回到集群集群主机列表页面,能够看到rancher2
节点曾经复原
如何复原执行过清理节点脚本的节点
中武官网提供了一个清理节点的脚本,这个脚本会清理节点上的容器、卷、rancher/kubernetes目录、网络、过程、iptables等。
如果因为误操作,在正确的节点上执行了清理脚本。针对这种场景,只有在rancher中创立过备份的集群才能够复原。
创立集群备份参考中武官网:https://rancher2.docs.rancher...
在我的环境中,demo
集群有rancher2
和rancher3
两个节点。
创立备份
在Rancher UI上创立集群快照,稍后复原集群的时候会用的到。
而后导航到全局
->demo
->工具
->备份
查看曾经创立的ETCD备份,从备份创立工夫能够看出,方才创立的备份名称为c-v6mtr-ml-klt5n
。
备份文件存到了etcd(rancher2)节点对应的/opt/rke/etcd-snapshots
目录下。
清理节点
在rancher2节点执行中武官网节点清理脚本,清理理完之后,不出所料,集群崩了。
复原集群
节点清理脚本并不会将/opt/rke目录删除,只是应用mv /opt/rke /opt/rke-bak-$(date +"%Y%m%d%H%M")
做了个备份。接下来能够将快照备份复原到默认的/opt/rke
目录下。
mv /opt/rke-bak-202007060903 /opt/rke
接下来,编辑集群从新增加节点。这中央要留神,肯定要设置和之前增加节点时雷同的节点参数。
运⾏完命令之后,能够看到rancher agent曾经失常工作起来了。
接下来,抉择之前的备份记录,保留,开始复原集群。
当初集群的状态变成了Updating
,曾经开始应用之前创立的快照进行复原集群了
稍等片刻,能够看到kubernetes组件全副运行起来。
集群状态也变为了Active
,此时,集群曾经胜利复原
业务利用查看
之前部署的名为nginx的nginx应⽤仍旧存在,且运行失常。
如何复原被删除的custom集群
在Rancher UI中误删自定义的集群,如果要复原该集群,必须须要有Rancher local集群和自定义集群的备份才能够复原。
备份集群
备份custom集群
参考 https://rancher2.docs.rancher... 备份custom集群,备份胜利后,能够导航到集群->工具->备份查看备份。
备份local集群
参考 https://rancher2.docs.rancher... 备份local集群,备份胜利后,将在本地生成一个tar.gz文件。
模仿故障
备份custom集群
参考 https://rancher2.docs.rancher... 备份custom集群,备份胜利后,能够导航到集群->工具->备份查看备份。
备份local集群
备份local集群可参考:
https://rancher2.docs.rancher...
备份胜利后,将在本地生成一个tar.gz文件。
模仿故障
接下来能够在Rancher UI上将集群删除来模仿故障。
复原local集群
复原local集群,可参考:
https://rancher2.docs.rancher...
local复原胜利后,从新登录Rancher UI,能够看到方才被删除的custom集群又从新显示了,但状态是Unavailable
复原custom集群
接下来,能够依据之前创立的custom集群快照复原custom集群。
复原custom集群参考:
https://rancher2.docs.rancher...
复原后,集群状态变为Updating
,稍等片刻,能够看到集群状态又变为Active
,集群复原胜利。
总 结
从以上几个场景的复原操作能够看出,大部分的复原计划都依赖于集群的备份,所以大家在生产环境中肯定要做好定时备份,并且最好将备份文件上传到远端备份服务器,这样能够在劫难状况下爱护您的数据。