在维护公司k8s集群时发现了一个问题:当某台node节点挂掉后,上面的pod要过5~6分钟才会开始往其他节点调度,这个等待时间太长了,如何减小呢(k8s版本:v1.21.0)?

经过调研发现,k8s 1.12版本之后,k8s使用default-not-ready-toleration-seconds和default-unreachable-toleration-seconds两个参数来控制节点宕机后pod的等待调度时间,可以通过修改此配置来减小等待时间。

  1. 进入master节点 修改kubelet.service配置(可选)

    vi /var/lib/kubelet/config.yaml
    #将config.yaml中evictionPressureTransitionPeriod的值改为20s
    #此参数含义是:当节点压力过大,持续超过20s,就驱逐此节点上的部分pod
    evictionPressureTransitionPeriod: 20s
    
  2. 修改kube-apiserver.service配置

    vi /etc/systemd/system/kube-apiserver.service
    
    #在[Service]ExecStart= 下新增两行配置  
    #这里两个参数意思是:节点notReady或者unreachable后20s还未恢复的话,就把此节点上的pod调度到其他节点
      --default-not-ready-toleration-seconds=20 \
      --default-unreachable-toleration-seconds=20 \
    
  3. 修改kube-controller-manager.service配置

    vi /etc/systemd/system/kube-controller-manager.service
    #在[Service]ExecStart= 下新增两行配置
    #这两个参数的意思是:
    #1.控制器每5秒检查一次节点状态  2.在节点被认为是未响应后,等待15秒再将其标记为不可用
      --node-monitor-period=5s \
      --node-monitor-grace-period=15s \
    
  4. 重新加载系统配置

    systemctl daemon-reload
    
  5. 重启三个服务

    systemctl restart kubelet.service
    systemctl restart kube-apiserver.service
    systemctl restart kube-controller-manager.service
    #查看服务状态
    systemctl status kubelet.service   #如果状态为Active: active (running) 表示重启成功 
    systemctl status kube-apiserver.service
    systemctl status kube-controller-manager.service
    
  6. 注意:上述配置只对新创建的pod生效,所以需要手动重启所有的pod来应用此配置

    #快速重启某个名空间下的所有pod,可以用这个命令  kubectl delete pod -n 【namespace】 --all (生产环境不要随便搞)
    #比如重启所有pod
    kubectl delete pod -A --all
    

不知道还没有其他更好的办法,欢迎讨论

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐