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 開啟功能。