<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      記一次kubernetes驅逐踩坑

      最近在公司的線上服務器上發現了一個現象: 將某個node的kubelet短暫的停掉之后,其上的pod馬上會被驅逐,這讓筆者大吃一驚,印象之中,停掉kubelet后,該node會變為NotReady狀態,隨后controller-manger會經過一段時間才開始驅逐其上的pod。還有個參數專門來控制這個時間:

      --pod-eviction-timeout The grace period for deleting pods on failed nodes. (default 5m0s)`

      該參數默認值為5min, 也就是說當node NotReady之后,最少也得五分鐘之后其上的pod才會被驅逐。但是現實情況明顯不符合預期啊,這樣就有點奇怪了。
      鑒于該問題影響巨大,筆者果斷開啟了debug之旅。

      首先我們從直接原因下手,需要了解一下當node NotReady之后,controller-manager是如何判斷并驅逐其上的pod的,這部分工作是由node lifecycel controller模塊負責。

      node lifecycle controller 主要負責對node生命周期進行檢查,判斷node是否存活,如果長時間檢測不到node心跳則驅逐其上的pod。在目前的版本(v1.16)中,默認開啟了TaintBasedEvictions, TaintNodesByCondition這兩個feature gate,則所有node生命周期管理都是通過condition + taint的方式進行管理。其主要邏輯由三部分組成:

      1. 不斷地檢查所有node狀態,設置對應的condition
      2. 不斷地根據node condition 設置對應的taint
      3. 不斷地根據taint驅逐node上面的pod

      想要詳細了解node lifecycle controller工作機制的同學可以翻閱筆者上一篇文章: kubernetes中node心跳處理邏輯分析

      查看代碼發現--pod-eviction-timeout并未起作用,原來在v1.13版本之前TaintBasedEvictions功能還未開啟,此時node not-ready之后,controller直接判斷not-ready時間是否超過了--pod-eviction-timeout,超過就進行刪除。而v1.13,TaintBasedEvictions功能開啟之后就不會使用了該參數,轉而使用了上面描述的condition+taint方案。也就是說node NotReady之后,pod的驅逐時間完全由每個pod toleration中 tolerationSecond決定,而不是由controller-manager的參數--pod-eviction-timeout統一決定。這樣想想也合情合理,每個pod對于故障的容忍時間不同,tolerationSecond可以更加靈活地為每個pod指定不同的驅逐時間。

      這樣說來,所有的pod都需要設置一個toleration才對,查閱相關資料后發現,社區已經有了一個DefaultTolerationSeconds admisson controller自動地幫助我們設置toleration,每次創建更新pod, 在請求發送到apiserver之后會自動設置5min的默認toleration。

      This admission controller sets the default forgiveness toleration for pods to tolerate the taints notready:NoExecute and unreachable:NoExecute for 5 minutes, if the pods don’t already have toleration for taints node.kubernetes.io/not-ready:NoExecute or node.alpha.kubernetes.io/unreachable:NoExecute.

      文檔上顯示該admission controller默認開啟,但是為什么我司的環境上面沒有生效,仔細看了一下文檔,是因為自己使用了一個deprecated的參數:--admission-control,使用這個參數的話必須顯式指定所有要開啟的admisson controller plugin列表。該參數在v1.10被廢棄,由兩個新的參數--enable-admission-plugins--disable-admission-plugins替換,這兩個參數如果不指定的話會有默認值,其中DefaultTolerationSeconds就屬于--enable-admission-plugins參數的默認值之一,也就是會默認開啟該plugin。又是一個升級導致的坑! 正確修改了該參數之后,新創建的pod就會默認帶上了toleration,DefaultTolerationSeconds adminssion controller plugin總算生效了。 

      新創建的pod總算沒有問題了,但是對于集群中已經存在的pod還沒有toleration該怎么辦? 顯然社區對這種情況未做處理,DefaultTolerationSeconds是社區很早就開發的一個feature,但是TaintBasedEvictions是v1.13才默認開啟,估計社區在開發時前后沒有做好兼容。翻了下DefaultTolerationSecondsadminssion plugin源碼,發現該plugin對于pod create, update操作都會設置toleration, 所以一般情況下, 我們升級集群的時候,總是能觸發pod發生update,該toleration會自動添加上,無需過多操作,大可不必擔心,心里知道有這個事情并檢查一下就行。但是筆者的環境已經升級完成了,只能手動觸發pod update了,思來想去,想要觸發pod update又不能影響業務,給pod打label是一個比較好的方式,于是筆者寫了一個腳本將集群中所有的pod都打了一個無關緊要的label, 觸發uodate后就自動添加了toleration。

      至此整個修復工作全部完成,回過頭來仔細想想,kubernetes版本間升級挑戰還是挺大的,兼容性問題防不勝防,很可能兩個小版本間完全兼容,沒任何問題,但是當一步步從低版本升級上來的時候問題就出現了,而且在兼容性測試的時候難以覆蓋到每種情況,很可能需要很久問題才能暴露出來。對于這種情況,唯有掌握內部機理,熟讀源碼才能快速診斷,修復。

      posted @ 2020-02-23 15:30  gaorong404  閱讀(4459)  評論(6)    收藏  舉報
      主站蜘蛛池模板: 亚洲av鲁丝一区二区三区黄| 日韩国产中文字幕精品| 免费AV片在线观看网址| 国产一区二区三区四区五区加勒比| 日本一区二区三区在线 |观看| 精品久久久久久中文字幕202| 黄色三级亚洲男人的天堂| 粉嫩一区二区三区精品视频| 亚洲精品日产AⅤ| 色成人亚洲| 长腿校花无力呻吟娇喘| 新版天堂资源中文8在线| 九九热精品在线观看| 国产成人精品一区二区秒拍1o| 国产精品日韩专区第一页| 国产亚洲tv在线观看| 青青草成人免费自拍视频| 午夜福利片1000无码免费| 国产69精品久久久久99尤物| 日韩高清不卡一区二区三区| 亚洲欧美色综合影院| 久久精品夜色噜噜亚洲aa| 亚洲AV国产福利精品在现观看| a级国产乱理伦片在线观看al| 成全高清在线播放电视剧| 国产亚洲天堂另类综合| 欧美黑人巨大xxxxx| 欧美人与禽2o2o性论交| 亚洲男人AV天堂午夜在| 精品国产亚洲午夜精品a| 中文字幕亚洲高清在线一区| 国产午夜福利精品视频| 国产精品福利中文字幕| 无码AV无码免费一区二区| 日本成人午夜一区二区三区| av色欲无码人妻中文字幕| 欧美成人精品一级在线观看| 午夜在线不卡| 色8久久人人97超碰香蕉987| 日本在线a一区视频高清视频| A级毛片100部免费看|