生產環境想要對某個Pod排錯、數據恢復、故障復盤有什麼辦法?

生產環境想要對某個Pod排錯、數據恢復、故障復盤有什麼辦法?

k8s考點靈魂拷問9連擊之5

考點之簡單描述一下k8s副本集ReplicaSet有什麼作用?
考點之為什麼ReplicaSet將取代ReplicationController控制器?
考點之編寫 ReplicaSet 的 spec 有什麼需要注意的點?
考點之k8s集群中創建非模板 Pod 為什麼可能會被副本集自動收納?
考點之線上預警k8s集群循環創建、刪除Pod副本,一直無法穩定指定目標副本數量?

如果排除了是Pod內部發生了故障,從RS角度你猜測可能是什麼原因?

上一期,討論了前面五個考點,感興趣去可以看一看【點我進入傳送門】,好了,接下來繼續看本期4個考點!

考點之標籤Pod和可識別標籤副本集ReplicaSet 先後創建順序不同,會造成什麼影響?
考點之生產環境想要對某個Pod排錯、數據恢復、故障復盤有什麼辦法?
考點之縮放 RepliaSet 有哪些算法策略?
考點之如何去影響淘汰策略,設置單獨偏好?

囧么肥事-胡說八道

img

img

考點之標籤Pod和可識別標籤副本集ReplicaSet 先後創建順序不同,會造成什麼影響?

假設給Pod打上的標籤是 AA,同時RS標籤選擇器設置匹配 AA。

分為兩種情況

### 預設RS標籤和副本數量
RS-AA 標籤選擇器可識別 AA 標籤
設置副本15個

### 預設Pod標籤
裸Pod-AA 標誌標籤 AA

第一種:RS已經創建,裸Pod隨後創建

情況一:
	副本等於15個,此時創建 Pod-AA
結果:
	新的 裸Pod-AA 會被該 RS-AA 識別
	副本數 > 15,開啟平衡機制
	新Pod立即被 RS 終止並實行刪除操作
	
	
情況二:
	副本小於15個,此時創建 Pod-AA
結果:
	裸Pod-AA 創建後立即被 RS-AA識別
	副本數 <= 15,開啟平衡機制,收管裸Pod

第二種:裸Pod先創建,隨後創建RS

情況一:
	創建了小於等與15個裸Pod-AA,此時創建 RS-AA
結果:
	RS-AA 創建成功後
	發現存在有AA標籤的Pod
	將所有的Pod-AA納入自己管轄範圍
	副本數 < 15,開啟平衡機制
	由RS-AA繼續創建剩餘Pod-AA補充夠15個
	
	
情況二:
	創建了大於15個裸Pod-AA,此時創建 RS-AA
結果:
	RS-AA 創建成功後
	發現存在有AA標籤的Pod
	將所有的Pod-AA納入自己管轄範圍
	副本數 > 15,開啟平衡機制
	RS-AA實行刪除多餘Pod操作
	直到副本數維持在15個

結論:無論RS何時創建,一旦創建,會將自己標籤選擇器能識別到的所有Pod納入麾下,接管生存權,遵循RS規約定義的有效副本數,去開啟平衡機制,維持有效標籤Pod的副本數。

總之,RS儘力保證系統當前正在運行的Pod等於期望狀態里指定的Pod數目。

如果想要獨立創建可生存的裸Pod,一定要檢查所有的RS標籤選擇器的可識別範圍,避免自己創建的裸Pod被收納接管。

img

考點之生產環境想要對某個Pod排錯、數據恢復、故障復盤有什麼辦法?

如果線上發現有些Pod沒有按照我們期望的狀態來進行運行,發生了某些故障,但是其他同類型Pod卻沒有發生。

這種故障一般屬於不易復現的故障,只會在某些偶然性的條件下觸發故障,但是這個觸發條件我們又不清楚,所以我們要專門針對這個故障進行問題排查。

這個時候又不希望在排查過程中影響服務的正常響應,那該怎麼辦呢?

隔離法,所謂隔離法,就是將 Pod 從 ReplicaSet 集合中隔離出來,讓Pod脫離RS的管控範圍,額有點類似贖身。

可以通過改變標籤來從 ReplicaSet 的目標集中移除 Pod。

這種技術可以用來從服務中去除 Pod,以便進行排錯、數據恢復等。

以這種方式移除的 Pod 將被自動替換(假設副本的數量沒有改變)。

通過隔離這個目標Pod,RS會自動補充副本Pod去保證集群的高可用,我們不必擔心影響到服務線的正常響應。這時候就可以針對這個目標Pod做排查,研究,里里外外的想幹啥,就幹啥,嘿嘿😋。

班級(標籤666班)
老師(RS-666)
學生15個(學生證標籤666班)
-----------------------------

每天上課,老師都檢查學生證入班
學生1號:學生證-666班,進去
學生2號:學生證-666班,進去
...
學生20號:學生證-666班,進去


某天,學生9號的學生證被人改了999班
學生1號:學生證-666班,進去
學生2號:學生證-666班,進去
...
學生9號:學生證-999班,老師攔住了9號,不許進
...
學生20號:學生證-666班,進去

這個老師跟RS一樣,很偏激,只認學生證(RS只認標籤),不認人。如果改了標籤,就認不出了,自己也不會再去接管了。

img

考點之縮放 RepliaSet 有哪些算法策略?

通過更新 .spec.replicas 字段,指定目標Pod副本數量,ReplicaSet 可以很輕鬆的實現縮放。

而且,ReplicaSet 控制器能確保經過縮放完成留下來的Pod數量不僅符合要求副本數量,而且Pod是可用,可操作的。

RS擴容不必說,肯定創建新的Pod副本,納入管理。

至於縮容,降低集合規模時ReplicaSet 控制器會對所有可用的Pods 進行一次權重排序,剔除最不利於系統高可用,穩健運行的Pod。

其一般性算法如下:

  1. 首先優先選擇剔除阻塞(Pending)且不可調度的 Pods。
  2. 如果設置了 controller.kubernetes.io/pod-deletion-cost 註解,則註解值較小的優先被剔除。
  3. 所處節點上副本個數較多的 Pod 優先於所處節點上副本較少者被剔除。
  4. 如果 Pod 的創建時間不同最近創建的 Pod 優先於早前創建的 Pod 被剔除

如果以上比較結果都相同,則隨機剔除

考點之如何去影響淘汰策略,設置單獨偏好?

前說了,RS在進行縮容操作時,有自己的一套淘汰策略根據四種淘汰策略進行權重排序,去剔除RS認為不利於系統穩健運行的Pod。

同一應用的不同 Pods 可能其利用率是不同的。在對應用執行縮容操作時,可能希望移除利用率較低的 Pods。

那麼我們怎麼做,才能去影響到RS的淘汰機制,保留我們自己認為需要保留的Pod呢?

前面提到了controller.kubernetes.io/pod-deletion-cost 註解值較小的Pod會優先被剔除。

我們可以通過這個註解去影響RS淘汰機制,設置個人保留偏好。

那麼什麼是controller.kubernetes.io/pod-deletion-cost 註解?

此註解設置到 Pod 上,取值範圍為 [-2147483647, 2147483647],如果註解值非法,API 服務器會拒絕對應的 Pod。

表示從RS中刪除Pod所需要花費的開銷。

RS認為刪除開銷較小的 Pods 比刪除開銷較高的 Pods 更容易被刪除,更有利於系統的穩健運行。

不過此機制實施僅是儘力而為,並不能保證一定會影響 Pod 的刪除順序。只能說是愛妃給皇上吹枕邊風,真正做出決定的還是皇上。

注意:

此功能特性處於 Beta 階段,默認被禁用。
通過為 kube-apiserver 和 kube-controller-manager 設置特性門控 PodDeletionCost 開啟功能。

img

推薦閱讀:【探針配置失誤,線上容器應用異常死鎖後,kubernetes集群未及時響應自愈重啟容器?】

推薦休閑閱讀:【囧么肥事】