通过Helm安装Rancher导致k8s集群node节点被全部删除

环境:

k8s环境:使用华为云CCE,集群版本如下:

https://forums.cnrancher.com/uploads/article/20211216/40cdf0a888b77291d67953ad09ecea2a.png



操作部署:

1、添加helm repo

helm repo add rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable

2、部署域名证书:

省略


3、安装rancher

helm install rancher-server rancher-stable/rancher --namespace rancher-server --set hostname=xxxx --set replicas=2 --set ingress.tls.source=xxxx


4、卸载rancher

helm -n rancher-server uninstall rancher-server


5、重新安装rancher

helm install rancher rancher-stable/rancher --set hostname=xxxx --set replicas=2 --set ingress.tls.source=xxxx


问题描述:

执行第5步时间为18:01:06秒

https://forums.cnrancher.com/uploads/article/20211216/4cffaa93ee091ae53be6af984f9f6b9c.png

在18:01:37秒集群controller触发了node节点删除动作

https://forums.cnrancher.com/uploads/article/20211216/87c6afa8df1fe677ecded1e065cbee78.png

经排查发现是generic-garbage-collector这个serviceaccount用户执行的

https://forums.cnrancher.com/uploads/article/20211216/b32fa76a0c05bd1050132b15b14d4688.png

已邀请:

niusmallnan

赞同来自: hailong

原理解析

K8s本身拥有node原生资源,通常我们可以通过 kubectl get node 来获取到。Rancher为了协调管理,自建一个CRD(nodes.management.cattle.io),它会附加了一些我们期望的属性,并定期从原生node上同步数据。


这两个资源具备强关联性,所以在 crd node 上,Rancher使用了finalizer,这个finalizer的作用是在crd node删除时自动清理native node,从而避免脏数据残留。这对于custom RKE集群具有很重要的意义。


apiVersion: management.cattle.io/v3
kind: Node
metadata:
annotations:
cleanup.cattle.io/user-node-remove: "true"
lifecycle.cattle.io/create.node-controller: "true"
management.cattle.io/nodesyncer: "true"
creationTimestamp: "2021-09-17T17:23:12Z"
finalizers:
- controller.cattle.io/node-controller
...
...

问题描述的另外一个关键信息,是卸载Rancher时,又通过脚本强制删除了一些terminating的ns,其中也包括local ns。这里的local ns中会包含了crd node的数据,比如我模拟的三节点local集群,查看local ns的crd node:


> k get nodes.management.cattle.io -n local
NAME AGE
machine-266bs 90d
machine-fkzfx 90d
machine-lvjdx 90d

k8s本身的删除逻辑中,当删除ns时会关联删除ns中的数据。这里就是删除local ns,会关联删除其中的crd node数据。而问题就处在于crd node中存在finalizer,这些finalizer在Rancher stop后都失效了,那么crd node的删除过程就被block了。此时,我们强删local ns,表面上看到local ns没有了,但是实际上ns内部的crd node依然还存在。这一点,可以通过强制删除local ns后再新建local ns,你会发现crd node数据依然存在。


正由于crd node数据的删除被block,当再次安装Rancher时,这些finalizer开始生效,crd node被删除成功,同时finalizer还关联删除了native node。于是,问题中的现象就发生了。


解决方案

仅从临时解决这个问题角度,可以做这种操作避免问题。强删所有ns之前,先手动清理所有的crd node:


> k get nodes.management.cattle.io -A
NAMESPACE NAME AGE
c-j4lpn m-950661e70700 3d1h
local machine-266bs 90d
local machine-fkzfx 90d
local machine-lvjdx 90d

每个crd node的手动清理过程就是,编辑器yaml,删除finalizer,再删除这个crd node资源。


这样通过删除crd node,我们就取消了crd node和native node的绑定关系,Rancher再启动时不会触发删除native node。


使用建议

从产品正确使用路径角度,我们不建议在一个集群反复重装Rancher。如果重装Rancher(不保留历史数据),建议先重新部署Local,然后再安装Rancher。


K8s还是非常复杂的,完全干净绿色的删除Rancher并不简单。不建议用户在这个方向浪费太多时间。


产品改善

后续,会在产品层面优化一些crd node的finalizer,避免同步删除local和import集群的native node。

我安装描述的操作步骤没有重现,卸载rancher后重新部署rancher,cce上的node不会被删除,


如果有遗漏,请指出


如果和你的步骤一样的话,请尝试下在你的环境上按照相同的步骤是否可以重现。


本班测试的详细步骤如下:


cce 版本

https://tva1.sinaimg.cn/large/008i3skNly1gxfs19kwcbj30jg0g2wf5.jpg

安装 Rancher

helm repo add rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable


kubectl create namespace rancher-server


helm install rancher rancher-stable/rancher \
—namespace rancher-server \
—set hostname=rancher.kingsd.top \
—set replicas=3 \
—set ingress.tls.source=secret

kubectl -n rancher-server create secret tls tls-rancher-ingress \
—cert=5467202_rancher.kingsd.top.pem \
—key=5467202_rancher.kingsd.top.key

卸载Rancher

helm -n rancher-server uninstall rancher


重新安装Rancher

helm install rancher rancher-stable/rancher \
—namespace rancher-server \
—set hostname=rancher.kingsd.top \
—set replicas=3 \
—set ingress.tls.source=secret

验证结果


  • rancher pod


    kubectl get pods -A
    NAMESPACE NAME READY STATUS RESTARTS AGE
    cattle-fleet-local-system fleet-agent-59b74595c-v5kc5 1/1 Running 0 21m
    cattle-fleet-system fleet-controller-66cc4c6b5b-ztnfw 1/1 Running 0 6m12s
    cattle-fleet-system gitjob-5778966b7c-7l2fh 1/1 Running 0 6m12s
    cattle-system helm-operation-28rl4 0/2 Completed 0 6m16s
    cattle-system helm-operation-cjhrj 0/2 Completed 0 5m54s
    cattle-system rancher-webhook-66b5df5c88-rvw4t 1/1 Running 0 5m51s
    default rancher-669cdfb89-gp5zv 1/1 Running 0 7m18s
    default rancher-669cdfb89-h99p4 1/1 Running 0 7m18s
    default rancher-669cdfb89-wxql5 1/1 Running 0 7m18s
    kube-system coredns-5589ddf8fd-cjhm7 1/1 Running 0 58m
    kube-system coredns-5589ddf8fd-hl4ws 1/1 Running 0 58m
    kube-system everest-csi-controller-57fbb4cc8c-gbwlv 1/1 Running 2 58m
    kube-system everest-csi-controller-57fbb4cc8c-qh2f6 1/1 Running 0 58m
    kube-system everest-csi-driver-4559k 1/1 Running 0 14m
    kube-system everest-csi-driver-wphdt 1/1 Running 0 14m
    kube-system icagent-f97hb 1/1 Running 0 58m
    kube-system icagent-s9tt8 1/1 Running 0 58m
  • 验证node


    kubectl get node
    NAME STATUS ROLES AGE VERSION
    172.16.0.110 Ready 59m v1.19.10-r0-CCE21.11.1.B006-21.11.1.B006
    172.16.0.250 Ready 59m v1.19.10-r0-CCE21.11.1.B006-21.11.1.B006

要回复问题请先登录注册