如何优化节点关闭(node down)检查时延

环境信息:
K3s 版本: v1.27.3+k3s1

节点 CPU 架构、操作系统和版本:Linux shk3s-3 5.4.0-153-generic #170-Ubuntu SMP Fri Jun 16 13:43:31 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

集群配置: 3 servers

问题描述:
在集群里运行一个3 replicas的服务(例如 redis),一个serveice在正常情况下关联了3个endpoints,如下:

❯ kubectl describe endpoints/redis
Name:         redis
Namespace:    dbs
Labels:       app.kubernetes.io/component=node
              app.kubernetes.io/instance=redis
              app.kubernetes.io/managed-by=Helm
              app.kubernetes.io/name=redis
              helm.sh/chart=redis-18.0.2
Annotations:  <none>
Subsets:
  Addresses:          10.42.0.23,10.42.1.37,10.42.2.22
  NotReadyAddresses:  <none>
  Ports:
    Name          Port   Protocol
    ----          ----   --------
    tcp-redis     6379   TCP
    tcp-sentinel  26379  TCP

Events:  <none>

使用 kubectl delete po/redis-node-0 可以发现,其endpoint很快地从列表里被移除,但是当关闭某个节点(shutdown -h now)时,观察endpoints列表,却要等待大概30s - 1min的时间才会被移除,这样就会导致业务访问服务时,还会将流量分配到已经失败了的pod上,导致错误。

k3s server 的启动参数请看下面。

请问该如何优化k3s集群对节点关机的检查时延?

复现步骤:

  • 安装 K3s 的命令:
k3s server --prefer-bundled-bin \
  --disable local-storage \
  --write-kubeconfig-mode 644 \
  --kube-apiserver-arg default-not-ready-toleration-seconds=30 \
  --kube-apiserver-arg default-unreachable-toleration-seconds=30 \
  --kube-controller-manager-arg node-monitor-grace-period=10s

预期结果:
加速集群发现节点关闭,然后快速删除该节点上的pod,以更新服务的endpoints列表。

实际结果:
比较慢。

附加上下文/日志:

日志


可以参考下面这个 yaml 添加 tolerations 试试

https://github.com/kingsd041/tmp/blob/master/hz-busybox.yml#L17-L25

尝试了,好像没什么效果,感觉主要是关闭节点,apiserver需要一定的时间才能确定节点not-ready,然后才回去终止节点上的pods

节点关闭到 pod 迁移,需要至少 4 个时间段完成之后才能迁移,你可以查查 k8s 相关的过程和参数,到时直接在 K3s 中配置就行了