序言
? ??怎么發現我的同事們很上進呢,估計做了下賤的事兒吧。
? ? 傷不到我,不代表不疼!
sidecar產生的問題
? ? 1 背景
? ? 在k8s的環境中,pod的使用越來越多了,也就產生了sidecar容器,在現在的環境中,一個pod可以帶差不多快10個sidecar容器了,各種各樣的場景,例如監控的sidecar容器,例如日志的sidecar容器。
? ? sidecar容器最好用的地方在于只要在pod中加了一個annotations就可以無縫啟動一個容器了,而且當pod刪除之后,如果sidecar容器的配置發生了變化,那么就會自動生效了。
? ? 日志sidecar容器,主要用來將pod的日志進行收集,發送到kafka中,從而保存日志,在pod中寫了一個annotions進行保存,而sidecar的配置的相關的容器,用一個helm進行安裝,一個k8s中一個集群就好了。
? ? 2 sidecar容器引發的問題
? ? 在某一個月黑風高夜,要進行kafka的topic變更,從而就理所當然的修改了sidecar容器的配置,將topic修改,然后進行升級,升級完成之后,重啟了一個測試pod,發現配置未發生變化。
? ? 查看sidecar的cm配置,發現沒有變化,手動進行修改cm,然后再重啟容器,發現生效了,但是再次更新helm,依舊變成了老的值。
? ? 沒有想出特別好的辦法,從而將sidecar 配置的2的pod同時進行了刪除,然后發現pod居然不能重新啟動了,emmm,有點慌。
? ? 趕緊將業務的測試pod刪除一個,看是否能啟動,發現pod能正常刪除,但是啟動不了,生產環境有點壓力,這個時候只要有pod掛掉或者是宿主機掛機,那么所有的業務pod將不能啟動,必然會造成故障。
? ? 掐指一算,沒辦法了,先喊人一起幫忙查,pod都沒啟動,看不到任何錯誤信息,只能直接查看namespace的事件了。
kubectl?get?events -n fuck
? ? 發現有事件,事件顯示pod無法啟動,是因為sidecar的svc端點無法找到,這不是很正常嗎,因為服務的pod都被刪除了,那么svc肯定用不了,從而形成了一個死循環。
? ? pod啟動需要經過驗證,也就是要調用svc,而svc的兩個pod被刪除了,那么就卡死在這里,都不能啟動。
webhooks.failurePolicyfailurePolicy 定義了如何處理來自準入端點的無法識別的錯誤 -?允許的值是 Ignore 或 Fail。默認為 Fail
? ?默默地修改了webhook的失敗策略,從默認值修改為Ignore,然后發現控制的pod啟動了,發現業務的pod也啟動了,危機解決,默默地送了一口氣,說了一句fuck,居然還會有循環依賴的情況發生。
? ? 我知道你很急,但是請先別急,找找思路,實在不行,就只能搖人了。
? ? 故障都是天注定的,所以急也沒用,沒用也急。
validatingwebhookconfiguration?全局資源,用來進行驗證使用。
? ? 3 日志sidecar存在的問題
? ? 在使用日志sidecar的時候,碰到幾個問題,注意避雷。
? ? 使用sidecar的時候,如果修改配置,必須要重啟原來的pod,如果重啟pod影響很大,可能要使用其他的方案,因為在使用sidecar的時候,如果單獨啟動sidecar容器,配置是不能生效的;如果對于發布部署類的,這種比較好用,如果是中間件那種萬年不啟動的,有點難度,所以選擇sidecar的時候,最好的是pod能自動對修改的配置生效。
? ? 在使用sidecar的時候,注意分配好對應的request和limit,如果一個宿主機上的機器過多,不要把request和limit設置成一樣,設置的很大,因為sidecar占用的資源也很大,最好是request很少,limit稍微大一點,而且這個配置都是固定的,不能說有的pod是一個值,其他的pod又是一個值。
? ? 在使用日志配置的時候,有一個是多行的配置,默認值是開啟的,這個容易產生一個bug,在有的云上面,如果日志為空,那么會直接將這個宿主機的磁盤直接吃滿,不過沒仔細查,當時也就草草的把這個配置設置為false就解決了。
? ? sidecar的配置是全局的時候,你會發送最新的配置更新了,但是在其他的namespace里面的配置沒更新,直到你重啟了一個pod,才會發現配置更新,這點也需要注意,經常會在重啟pod之前去檢查配置,然后發現沒更新,在那折騰半天。
? ? 在使用helm的時候,如果發現upgrade的時候,set的值未生效,檢查一下template,沒準就會發現有些傻叉把對應的配置要么就是不能配置,要么就是配置的位置不對,從而導致不能生效。
風言風語
? ??sidecar用起來的確很爽,因為使用起來很簡單,只要加一個annotation,但是要注意使用的時候,可能會阻塞pod的啟動,如果你使用了istio,也可能存在這種問題。
? ? 兩個pod同時刪除,就導致了webhook不能使用,這個也是個風險點,如果2個pod同時在一個機器上,而這臺機器宕機了;如果這兩個pod所在的兩個機器同時宕機了,也不能使用了,而且這個時候,如果業務容器重啟了,那還啟不起來,如果告警做的不好,那估計等整個集群掛了,你才能發現這個問題,告警做的是否充足,也是個考驗。
? ? ?上進和下賤有區別嗎?當然沒分別了,凡是有上進心的人一定會做出下賤的事兒,這下賤的人也一定會有上進心的。