在使用kubernetes的使用,不知道你有没有遇到或者关注到当你的Node节点挂掉,也就是kubelet没法提供工做的时候,你的pod是否自动的调度到其余的节点上去,而调度到节点上的时间有没有注意大概花了多长时间,我相信若是你仔细关注这件事,你对kubernetes项目也很熟练了,因为官方给了相关的参数,可是真正怎么用,怎么来实现这个问题,还须要咱们本身进行验证它,而在生产过程当中,对pod的驱逐迁移到其余的节点时间咱们须要从新考量,由于它决定了咱们生产的稳定性、可靠性,更快的迁移能够减小咱们业务的影响性,至少我是这么以为。node
来测试一下你的kubernetes环境,来断定node节点挂掉的时间以及pod驱逐的时间nginx
官方api-server参数具体做用:https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/ 官方kube-controller-manager 参数具体做用:https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/ 官方kubelet参数具体做用:https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/
如下调整是须要加入到集群中的,最后效果验证pod的迁移时间为1mapi
kube-controller-manager调整app
- --node-monitor-period="5s" . #在NodeController中同步节点状态的周期。默认5s - --node-monitor-grace-period: "20s" #咱们容许运行的节点在标记为不健康以前没有响应的时间。必须是kubelet的nodeStatusUpdateFrequency的N倍,其中N表示容许kubelet发布节点状态的重试次数默认40s。 - --node-startup-grace-period: "30s" #咱们容许启动节点在标记为不健康以前没有响应的时间。,默认1m0s。 - --pod-eviction-timeout: "1m" #删除失败节点上的pods的宽限期。默认5m
kube-apiserver调整ide
最终判断驱逐时间的调整仍是根据kube-apiserver的参数测试
- --default-not-ready-toleration-seconds=60 指示notReady:NoExecute的容忍秒数,默认状况下添加到没有这种容忍的每一个pod中。 - --default-unreachable-toleration-seconds=60 指示对不可到达的:NoExecute的容忍秒数,默认状况下添加到没有这种容忍的每一个pod中。 - --enable-admission-plugins=NodeRestriction,PodSecurityPolicy,DefaultTolerationSeconds 默认容忍的秒数开启
若是在全局中不增长此参数,那就须要在pod中单独指定,通常不建议此项操做spa
tolerations: - key: node.kubernetes.io/not-ready effect: NoExecute tolerationSeconds: 60 - key: node.kubernetes.io/unreachable operator: Exists effect: NoExecute tolerationSeconds: 60
举个例子可是生产中不建议这么作,仍是使用全局方式定义驱逐方式来决定node节点not ready状态pod的迁移code
apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx namespace: kube-system spec: replicas: 5 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: tolerations: - key: node.kubernetes.io/not-ready effect: NoExecute tolerationSeconds: 30 - key: node.kubernetes.io/unreachable operator: Exists effect: NoExecute tolerationSeconds: 30 containers: - image: nginx name: nginx resources: requests: cpu: "10m" memory: "30Mi" limits: cpu: "10m" memory: "30Mi"
kubelet调整server
指定的频率连续报告节点状态更新,其默认值为 10s。 # 指定kubelet多长时间向master发布一次节点状态。注意: 它必须与kube-controller中的nodeMonitorGracePeriod一块儿协调工做。(默认 10s) node-status-update-frequency: 10s
测试关闭一个node节点,停掉kubelet,查看默认驱逐的时候为60s,若是不设置的话,默认官方5m才会驱逐podblog
建立一个nginx的示例测试,并停掉kubelet服务,查看pod的驱逐1m的变化状况
经过watch -n 1 "kubectl get pod -n kube-system |grep xxx "