k8s-ReplicaSet副本集考點有哪些腻异?生產(chǎn)環(huán)境想要對某個Pod排錯进副、數(shù)據(jù)恢復(fù)、故障復(fù)盤有什么辦法悔常?

1.簡單描述一下k8s副本集ReplicaSet有什么作用影斑?

ReplicaSet的主要作用是控制副本數(shù)量的,這里的每一個副本就是一個Pod机打,ReplicaSet它是用來確保我們有指定數(shù)量的Pod副本正在運行的Kubernetes控制器矫户,這里為了方便后面統(tǒng)一把ReplicaSet簡稱 RS

進(jìn)一步說什么是控制副本數(shù)量?

RS確保Pod以你指定的副本數(shù)運行残邀,即如果有容器異常退出皆辽,會
自動創(chuàng)建新的 Pod 來替代,而異常多出來的容器也會自動回收芥挣。
  
假設(shè)k8s集群中驱闷,你想要運行10個Pod,如果這時候有4個Pod發(fā)生故障空免,
異常退出空另,那么RS會自動創(chuàng)建新的4個Pod來替代發(fā)生故障的4個Pod。  
  
RS盡力保證系統(tǒng)當(dāng)前正在運行的Pod數(shù)等于期望狀態(tài)里指定的Pod數(shù)目蹋砚。

你想要10個扼菠,那么RS就盡可能保證在任何時候都給你提供10個,
沒有就創(chuàng)建坝咐,多了就刪除循榆。  
  
總之,ReplicaSet 盡可能確保任何時間都有指定數(shù)量的 Pod 副本在運行墨坚。  

2.為什么ReplicaSet將取代ReplicationController控制器秧饮?

ReplicationController控制器(簡稱為RC)。

在之前舊版本的k8s中,使用的是RC控制器實現(xiàn)了k8s集群的高可用性浦楣,它跟現(xiàn)在的RS控制器作用類似袖肥,作用是,確保Pod以指定的副本數(shù)運行振劳。

ReplicaSet繼承了RC的功能椎组,并實現(xiàn)了擴(kuò)展,主要突出擴(kuò)展是更強(qiáng)大的標(biāo)簽選擇能力 历恐,即selector寸癌。

進(jìn)一步說什么是標(biāo)簽選擇能力?

ReplicaSet會通過標(biāo)簽選擇器(Label-Selector)管理所有被打上與選擇器匹配的標(biāo)簽的容器弱贼。

舉個例子

兩組Pod蒸苇,env標(biāo)簽分別是production和devel
  Pod-A     env=production
  Pod-B     env=devel
 
RC 只能匹配其中的Pod-A或者Pod-B中的一個;

RS 則可以同時可以匹配并將它們視為一個大組吮旅,
無論標(biāo)簽env的值具體是什么(env=*),都可以標(biāo)簽名來進(jìn)行匹配溪烤;

3.編寫 ReplicaSet 的 spec 有什么需要注意的點?

類似其他Kubernetes API 對象庇勃,RS也需要指定 apiVersion檬嘀、kind、和 metadata 字段责嚷。

1.對于 ReplicaSets 而言鸳兽,其 kind 始終是 ReplicaSet。

2.ReplicaSet 對象的名稱必須是合法的 DNS 子域名

3.屬性.spec.template 是一個Pod 模版罕拂, 要求設(shè)置標(biāo)簽揍异,注意不要將標(biāo)簽與其他控制器的標(biāo)簽選擇器重疊

4.屬性.spec.template.spec.restartPolicy 指定模板的重啟策略 ,允許的取值是 Always

5.屬性.spec.selector 字段是一個標(biāo)簽選擇器 用來篩選匹配標(biāo)簽的Pod歸屬

6.在ReplicaSet中.spec.template.metadata.labels的值必須與spec.selector值相匹配爆班,否則該配置
會被API拒絕衷掷。 

4.k8s集群中創(chuàng)建非模板 Pod 為什么可能會被副本集自動收納?

前面提到了蛋济,RS采用了最新的標(biāo)簽選擇能力棍鳖,通過指定.spec.selector標(biāo)簽選擇器,不僅可根據(jù)標(biāo)簽值碗旅,甚至連標(biāo)簽名一致都可以進(jìn)行匹配。

首先如果采用Pod模板創(chuàng)建Pod镜悉,會被指定標(biāo)簽祟辟,RS會根據(jù)標(biāo)簽自動接管Pod。

再來看看非模板侣肄,非模板創(chuàng)建旧困,其實就是直接創(chuàng)建裸的 Pods。

為什么可能會被副本集RS自動接管?

除非在創(chuàng)建裸Pod的時候吼具,你確保這些裸的 Pods 并不包含可能與你的某個 ReplicaSet 的.spec.selector相匹配的標(biāo)簽僚纷。

在創(chuàng)建裸Pods前,必須完全排除跟任何RS有可能相同的標(biāo)簽拗盒,否則怖竭,RS認(rèn)為你創(chuàng)建的Pod 就是要指定給自己接管的。

5.線上預(yù)警k8s集群循環(huán)創(chuàng)建陡蝇、刪除Pod副本痊臭,一直無法穩(wěn)定指定目標(biāo)副本數(shù)量,排除了是Pod內(nèi)部發(fā)生了故障登夫,從RS角度你猜測可能是什么原因广匙?

首先理解一下問題,循環(huán)創(chuàng)建Pod副本恼策?

RS一直在正常工作鸦致,維持Pod副本數(shù)量,缺少就創(chuàng)建涣楷,多了就刪除分唾。問題來了,一直創(chuàng)建总棵,然后又刪除鳍寂,卻不能穩(wěn)定Pod副本數(shù)量?

看下這個循環(huán)過程

  RS指定Pod副本數(shù)量10個
  
  當(dāng)前副本7個
  RS檢測不夠10個
  RS開啟平衡機(jī)制情龄,創(chuàng)建2個維持穩(wěn)定
  
  再檢測發(fā)現(xiàn) 15個
  RS開啟平衡機(jī)制迄汛,刪除5個維持穩(wěn)定
  
  再檢測發(fā)現(xiàn)13個
  RS開啟平衡機(jī)制,刪除3個維持穩(wěn)定
  
  再檢測發(fā)現(xiàn)9個
  RS開啟平衡機(jī)制骤视,增加1個維持穩(wěn)定
  
  再檢測發(fā)現(xiàn)10個
  無需穩(wěn)定
  
  再檢測發(fā)現(xiàn)8個...
  再檢測發(fā)現(xiàn)18個... 

總之鞍爱,RS檢測副本數(shù)量,不是比10個多专酗,就是比10少睹逃,一直難以維持10個有效副本

既然排除了是Pod內(nèi)部故障問題,那么從RS角度進(jìn)行可能分析祷肯,初步判定是多個
RS標(biāo)簽選擇器規(guī)則重復(fù)導(dǎo)致的 

分析初步判定原因

ReplicaSet會通過標(biāo)簽選擇器(Label-Selector)管理所有帶有與選擇器匹配的標(biāo)簽的容器沉填。

創(chuàng)建Pod時,它會認(rèn)為所有Pod 是一樣的佑笋,是無狀態(tài)的翼闹,所以在創(chuàng)建順序上不會有先后之分。

使用相同的標(biāo)簽選擇器創(chuàng)建多個ReplicaSet蒋纬,則多個RS無法識別哪個Pod是自己創(chuàng)建的猎荠,都會認(rèn)為是歸屬于自己管理的Pod坚弱。

例如:  
  第一個 RS-A,指定副本數(shù)量 10
  標(biāo)簽選擇器可以匹配 env=xxx
  
  RS-A生成10個Pod標(biāo)簽為 env=xxx
  一組Pod:
  Pod-1(env=xxx)
  Pod-2(env=xxx)
  Pod-3(env=xxx)
  ...
  ...
  Pod-10(env=xxx)
  
  
  這時候創(chuàng)建了一個RS-B
  
  第二個 RS-B关摇,指定副本數(shù)量 25
  標(biāo)簽選擇器和 RS-A 相同
  標(biāo)簽選擇器可以匹配 env=xxx
  
  
  因為選擇器匹配一樣
  RS-B 匹配到了RS-A創(chuàng)建的10個Pod
  RS-B 發(fā)現(xiàn)Pod-x(env=xxx)數(shù)量不夠25
  
  RS-B 繼續(xù)創(chuàng)建額外的10個
  
  Pod-11(env=xxx)
  Pod-12(env=xxx)
  Pod-13(env=xxx)
  ...
  ...
  
  此時RS-A 發(fā)現(xiàn)自己匹配的Pod > 10
  它認(rèn)為是自己創(chuàng)建多了
  啟動平衡機(jī)制
  
  刪除超過 10 個的額外Pod
  刪除 Pod-Xi(env=xxx)
  
  而RS-B 發(fā)現(xiàn)自己匹配的Pod < 25
  就啟動平衡機(jī)制
  創(chuàng)建 Pod-Xi(env=xxx)
  
  
  就這樣
  一個不停的創(chuàng)建
  一個不停的刪除
  
  最終總是無法滿足穩(wěn)定數(shù)量的 10 和 25  
  
雙方的當(dāng)前狀態(tài)始終不等于期望狀態(tài)荒叶,這就會引發(fā)問題
因此確保ReplicaSet標(biāo)簽選擇器的唯一性這一點很重要

6.標(biāo)簽Pod和可識別標(biāo)簽副本集ReplicaSet 先后創(chuàng)建順序不同,會造成什么影響输虱?

假設(shè)給Pod打上的標(biāo)簽是 AA些楣,同時RS標(biāo)簽選擇器設(shè)置匹配 AA

分為兩種情況

1) 預(yù)設(shè)RS標(biāo)簽和副本數(shù)量
RS-AA 標(biāo)簽選擇器可識別 AA 標(biāo)簽
設(shè)置副本15個

2) 預(yù)設(shè)Pod標(biāo)簽
裸Pod-AA 標(biāo)志標(biāo)簽 AA  
##第一種:RS已經(jīng)創(chuàng)建,裸Pod隨后創(chuàng)建  
  情況一:
      副本等于15個悼瓮,此時創(chuàng)建 Pod-AA
  結(jié)果:
      新的 裸Pod-AA 會被該 RS-AA 識別
      副本數(shù) > 15戈毒,開啟平衡機(jī)制
      新Pod立即被 RS 終止并實行刪除操作
  
  情況二:
      副本小于15個,此時創(chuàng)建 Pod-AA
  結(jié)果:
      裸Pod-AA 創(chuàng)建后立即被 RS-AA識別
      副本數(shù) <= 15横堡,開啟平衡機(jī)制埋市,收管裸Pod 
    
    
##第二種:裸Pod先創(chuàng)建,隨后創(chuàng)建RS  
  情況一:
      創(chuàng)建了小于等與15個裸Pod-AA命贴,此時創(chuàng)建 RS-AA
  結(jié)果:
      RS-AA 創(chuàng)建成功后
      發(fā)現(xiàn)存在有AA標(biāo)簽的Pod
      將所有的Pod-AA納入自己管轄范圍
      副本數(shù) < 15道宅,開啟平衡機(jī)制
      由RS-AA繼續(xù)創(chuàng)建剩余Pod-AA補(bǔ)充夠15個
  
  
  情況二:
      創(chuàng)建了大于15個裸Pod-AA,此時創(chuàng)建 RS-AA
  結(jié)果:
      RS-AA 創(chuàng)建成功后
      發(fā)現(xiàn)存在有AA標(biāo)簽的Pod
      將所有的Pod-AA納入自己管轄范圍
      副本數(shù) > 15胸蛛,開啟平衡機(jī)制
      RS-AA實行刪除多余Pod操作
      直到副本數(shù)維持在15個  

結(jié)論:無論RS何時創(chuàng)建污茵,一旦創(chuàng)建,會將自己標(biāo)簽選擇器能識別到的所有Pod納入麾下葬项,接管生存權(quán)泞当,遵循RS規(guī)約定義的有效副本數(shù),去開啟平衡機(jī)制民珍,維持有效標(biāo)簽Pod的副本數(shù)

總之襟士,RS盡力保證系統(tǒng)當(dāng)前正在運行的Pod數(shù)等于期望狀態(tài)里指定的Pod數(shù)目

如果想要獨立創(chuàng)建可生存的裸Pod,一定要檢查所有的RS標(biāo)簽選擇器的可識別范圍嚷量,避免自己創(chuàng)建的裸Pod被收納接管

7.生產(chǎn)環(huán)境想要對某個Pod排錯陋桂、數(shù)據(jù)恢復(fù)、故障復(fù)盤有什么辦法蝶溶?

如果線上發(fā)現(xiàn)有些Pod沒有按照我們期望的狀態(tài)來進(jìn)行運行嗜历,發(fā)生了某些故障,但是其他同類型Pod卻沒有發(fā)生

這種故障一般屬于不易復(fù)現(xiàn)的故障抖所,只會在某些偶然性的條件下觸發(fā)故障梨州,但是這個觸發(fā)條件我們又不清楚,所以我們要專門針對這個故障進(jìn)行問題排查

這個時候又不希望在排查過程中影響服務(wù)的正常響應(yīng)田轧,那該怎么辦呢摊唇?

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

可以通過改變標(biāo)簽來從 ReplicaSet 的目標(biāo)集中移除 Pod岛请。

這種技術(shù)可以用來從服務(wù)中去除 Pod,以便進(jìn)行排錯警绩、數(shù)據(jù)恢復(fù)等崇败。

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

通過隔離這個目標(biāo)Pod肩祥,RS會自動補(bǔ)充副本Pod去保證集群的高可用后室,我們不必?fù)?dān)心影響到服務(wù)線的正常響應(yīng)。這時候就可以針對這個目標(biāo)Pod做排查混狠,研究岸霹,里里外外的想干啥,就干啥

  班級(標(biāo)簽666班)
  老師(RS-666)
  學(xué)生15個(學(xué)生證標(biāo)簽666班)
  -----------------------------
  
  每天上課将饺,老師都檢查學(xué)生證入班
  學(xué)生1號:學(xué)生證-666班贡避,進(jìn)去
  學(xué)生2號:學(xué)生證-666班,進(jìn)去
  ...
  學(xué)生20號:學(xué)生證-666班予弧,進(jìn)去
  
  
  某天刮吧,學(xué)生9號的學(xué)生證被人改了999班
  學(xué)生1號:學(xué)生證-666班,進(jìn)去
  學(xué)生2號:學(xué)生證-666班掖蛤,進(jìn)去
  ...
  學(xué)生9號:學(xué)生證-999班杀捻,老師攔住了9號,不許進(jìn)
  ...
  學(xué)生20號:學(xué)生證-666班蚓庭,進(jìn)去  
  
這個老師跟RS一樣致讥,很偏激,只認(rèn)學(xué)生證(RS只認(rèn)標(biāo)簽)彪置,不認(rèn)人拄踪。
如果改了標(biāo)簽,就認(rèn)不出了拳魁,自己也不會再去接管了

8.縮放 RepliaSet 有哪些算法策略惶桐?

通過更新 .spec.replicas 字段,指定目標(biāo)Pod副本數(shù)量潘懊,ReplicaSet 可以很輕松的實現(xiàn)縮放姚糊。

而且,ReplicaSet 控制器能確保經(jīng)過縮放完成留下來的Pod數(shù)量不僅符合要求副本數(shù)量授舟,而且Pod是可用救恨,可操作的。

RS擴(kuò)容不必說释树,肯定創(chuàng)建新的Pod副本肠槽,納入管理擎淤。

至于縮容,降低集合規(guī)模時ReplicaSet 控制器會對所有可用的Pods 進(jìn)行一次權(quán)重排序秸仙,剔除最不利于系統(tǒng)高可用嘴拢,穩(wěn)健運行的Pod。

其一般性算法如下:

1.首先優(yōu)先選擇剔除阻塞(Pending)且不可調(diào)度的 Pods寂纪。
2.如果設(shè)置了controller.kubernetes.io/pod-deletion-cost注解席吴,則注解值較小的優(yōu)先被剔除。
3.所處節(jié)點上副本個數(shù)較多的 Pod 優(yōu)先于所處節(jié)點上副本較少者被剔除捞蛋。
4.如果 Pod 的創(chuàng)建時間不同孝冒,最近創(chuàng)建的 Pod 優(yōu)先于早前創(chuàng)建的 Pod 被剔除。

如果以上比較結(jié)果都相同拟杉,則隨機(jī)剔除庄涡。

9.如何去影響淘汰策略,設(shè)置單獨偏好捣域?

RS在進(jìn)行縮容操作時啼染,有自己的一套淘汰策略。根據(jù)四種淘汰策略進(jìn)行權(quán)重排序焕梅,去剔除RS認(rèn)為不利于系統(tǒng)穩(wěn)健運行的Pod迹鹅。

同一應(yīng)用的不同 Pods 可能其利用率是不同的。在對應(yīng)用執(zhí)行縮容操作時贞言,可能希望移除利用率較低的 Pods斜棚。

那么我們怎么做,才能去影響到RS的淘汰機(jī)制该窗,保留我們自己認(rèn)為需要保留的Pod呢扬跋?

前面提到了controller.kubernetes.io/pod-deletion-cost 注解值較小的Pod會優(yōu)先被剔除悍及。

我們可以通過這個注解去影響RS淘汰機(jī)制奈搜,設(shè)置個人保留偏好墩崩。

那么什么是controller.kubernetes.io/pod-deletion-cost 注解?

此注解設(shè)置到 Pod 上规肴,取值范圍為 [-2147483647, 2147483647]捶闸,如果注解值非法,API 服務(wù)器會拒絕對應(yīng)的 Pod拖刃。
表示從RS中刪除Pod所需要花費的開銷

RS認(rèn)為刪除開銷較小的 Pods 比刪除開銷較高的 Pods 更容易被刪除删壮,更有利于系統(tǒng)的穩(wěn)健運行。

不過此機(jī)制實施僅是盡力而為兑牡,并不能保證一定會影響 Pod 的刪除順序央碟。只能說是愛妃給皇上吹枕邊風(fēng),真正做出決定的還是皇上均函。

注意:
此功能特性處于 Beta 階段亿虽,默認(rèn)被禁用菱涤。
通過為 kube-apiserver 和 kube-controller-manager 設(shè)置特性門控 PodDeletionCost 開啟功能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末经柴,一起剝皮案震驚了整個濱河市狸窘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坯认,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氓涣,死亡現(xiàn)場離奇詭異牛哺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)劳吠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門引润,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人痒玩,你說我怎么就攤上這事淳附。” “怎么了蠢古?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵奴曙,是天一觀的道長。 經(jīng)常有香客問我草讶,道長洽糟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任堕战,我火速辦了婚禮坤溃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嘱丢。我一直安慰自己薪介,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布越驻。 她就那樣靜靜地躺著汁政,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伐谈。 梳的紋絲不亂的頭發(fā)上烂完,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音诵棵,去河邊找鬼抠蚣。 笑死,一個胖子當(dāng)著我的面吹牛履澳,可吹牛的內(nèi)容都是我干的嘶窄。 我是一名探鬼主播怀跛,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柄冲!你這毒婦竟也來了吻谋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤现横,失蹤者是張志新(化名)和其女友劉穎漓拾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戒祠,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡骇两,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了姜盈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片低千。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖馏颂,靈堂內(nèi)的尸體忽然破棺而出示血,到底是詐尸還是另有隱情,我是刑警寧澤救拉,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布难审,位于F島的核電站,受9級特大地震影響近上,放射性物質(zhì)發(fā)生泄漏剔宪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一壹无、第九天 我趴在偏房一處隱蔽的房頂上張望葱绒。 院中可真熱鬧,春花似錦斗锭、人聲如沸地淀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帮毁。三九已至,卻和暖如春豺撑,著一層夾襖步出監(jiān)牢的瞬間烈疚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工聪轿, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留爷肝,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像灯抛,于是被迫代替她去往敵國和親金赦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容