在使用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 "