【k8s學(xué)習(xí)】Kubernetes StatefulSet介紹

【本文目標(biāo)】

  • StatefulSet介紹
  • DeploymentStatefulSet組件的區(qū)別

【前置文章】


1. StatefulSet介紹

官網(wǎng):https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/statefulset/

StatefulSet組件是用來管理stateful applications的(有狀態(tài)的應(yīng)用)丑念,如:MySQL吃嘿,elasticsearch贱迟,mongoDB等娜氏〔霰玻或者別的需要存儲數(shù)據(jù)的應(yīng)用。

對應(yīng)的stateless applications即無狀態(tài)的應(yīng)用率拒,比如普通的前端UI項目或是后臺java項目(自身不存儲數(shù)據(jù))崩泡。

2. Deployment vs. StatefulSet

StatefulSet組件和Deployment組件都可以使用Storage

  • 針對無狀態(tài)的服務(wù)猬膨,Kubernetes使用Deployment組件來管理角撞。
  • 針對有狀態(tài)的服務(wù),Kubernetes使用StatefulSet組件來管理勃痴。

具體來說谒所,假設(shè)我們需要部署my-app項目(目標(biāo)3個Pod),以及數(shù)據(jù)庫mysql(目標(biāo)也是3個Pod)沛申。

2.1 Deployment

對于my-app Pod劣领,我們會寫一個Deployment的yaml配置文件,在里面配上ReplicaSet=3铁材,表示需要創(chuàng)建3個Pod尖淘,以及my-app Container的鏡像,用來創(chuàng)建Pod時用著觉。創(chuàng)建出來的my-app會是:

  • identical and interchangeable:即創(chuàng)建的三個my-app Pod是相同的村生,以及如果一個掛了,很容易再新創(chuàng)建一個饼丘。
  • created in random order with random hashes:三個my-app Pod啟動也沒有先后順序梆造,可以隨意。
  • one Service that load balances to any Pod:一個Service組件可以幫助做負(fù)載均衡葬毫。
2.2 StatefulSet

而對于mysql Pod,會使用StatefulSet組件來創(chuàng)建:

  • can't be created/deleted at same time:創(chuàng)建的時候是有順序的
  • can't be randomly addressed:并不是隨機訪問的
  • replica Pods are not identical:主要原因是創(chuàng)建的Pod之間屡穗,并不是完全相同的贴捡,相反的,每個創(chuàng)建的Pod都有自己額外的標(biāo)志(這個標(biāo)志是唯一的)村砂。
2.2.1 Pod Identity(Pod標(biāo)志)
  • sticky identity for each pod:即上述說的針對有狀態(tài)的服務(wù)烂斋,Pod除了id外,還有額外的唯一標(biāo)志础废,比如創(chuàng)建的3個mysql Pod汛骂,Pod標(biāo)志可以是:mysql-0, mysql-1, mysql-2,一般為${statefulset name}-${order}评腺。
  • created from same specification, but not interchangeable!:雖然都是從同一個StatefulSet配置中創(chuàng)建的帘瞭,但有狀態(tài)的Pod并不像無狀態(tài)的Pod一樣是可交換的。
  • persistent identifier across any re-scheduling:比如ID-2 down了蒿讥,并不是會再生成一個ID-3或是別的蝶念,而是會新生成一個Pod來代替這個ID-2抛腕,即Identity不變

聽上去很繞媒殉,以及有狀態(tài)的服務(wù)為啥需要額外的Pod Identity呢担敌?
主要原因是如下的架構(gòu),會導(dǎo)致數(shù)據(jù)的不一致廷蓉,多個Pod全封,都有讀寫,數(shù)據(jù)就會變的不同步桃犬。

未命名文件 (5).png

通常情況下刹悴,只會有一臺負(fù)責(zé)寫,負(fù)責(zé)寫的這臺叫MASTER疫萤,其余的叫WORKER

未命名文件 (6).png

這也是為什么會就StatefulSet創(chuàng)建的Pod并不是完全相同的Pod颂跨,因為只有一臺是Master。

  • They do not use the same physical storage扯饶!臼疫,即上述的三個volume,并不是相同的地址落萎,可以是:/data/vol/pv-0, /data/vol/pv-1, data/vol/pv-2迷郑,相當(dāng)于是有數(shù)據(jù)的備份。
  • Continuously synchronizing of the data:這意味著Master和Worker節(jié)點間有數(shù)據(jù)的同步每币。Master是唯一有寫權(quán)限的携丁,所以Worker需要及時知道數(shù)據(jù)的改動,以及它自己的pv中的數(shù)據(jù)得到更新兰怠。
  • the first one is the Master:最先啟動的Pod為Master梦鉴。
  • Next Pod is only created, if previous is up and running!:即有狀態(tài)的Pod是安順序啟動的,并且要等前面的Pod啟動好了再啟動新的Pod揭保。
  • Deletion in reverse order, starting from the last one:如果刪除該StatefulSet肥橙,那么Pod的刪除是啟動順序的倒序,即最先刪除最后啟動的那個Pod秸侣,刪除成功后再接著刪除倒數(shù)第2存筏,以此類推。

【整個過程】
Master修改了數(shù)據(jù) --> 所有的Worker感知到了數(shù)據(jù)的變動味榛,開始修改自己的pv --> 這時候要是新加入一個Pod椭坚,叫mysql-3,它會創(chuàng)建自己的Storage搏色,然后會先從它順序的前一個的Pod中clone數(shù)據(jù)善茎。 --> mysql-3完成了clone數(shù)據(jù)后,也會開始監(jiān)聽數(shù)據(jù)的改動频轿,以便及時更新到它自己的Storage中

Pod state
有狀態(tài)的服務(wù)巾表,它的Storage存放的不僅是Pod的數(shù)據(jù)汁掠,還會存Pod的狀態(tài),如它所連的Pod是Master Pod還是Worker Pod等集币。當(dāng)這個Storage所連的Pod掛了考阱,如上述說的,并不是新起一個Pod鞠苟,Pod標(biāo)志什么的都變了乞榨,而是新起的這個Pod會替換掉原來的Pod,即Pod Identity都不會變当娱,這時候之前的Storage會re-attached(重新連接)上這個Pod吃既,這樣就可以避免新起的Pod上來就先clone數(shù)據(jù)。--> 當(dāng)然這里需要使用的是Remote storage跨细!因為Local storage可能會跟隨著舊的Node一起掛掉鹦倚。

Pod endpoints
有服務(wù)狀態(tài)的Service會有自己的DNS name,名字格式:${pod name}.${governing service domain}冀惭,如mysql-0.svc2震叙,mysql-1.svc2mysql-2.svc2散休。
這意味著如果Pod重啟了媒楼,那么IP地址可以變了,但是name以及endpoint不會變戚丸。

3. 總結(jié)

關(guān)于有狀態(tài)服務(wù)的部署划址,并沒有像無狀態(tài)服務(wù)部署來的容易。需要額外做很多事:

  • 需要關(guān)心數(shù)據(jù)的sync同步問題限府。
  • 需要Remote Storage(假使集群down了數(shù)據(jù)仍然在)
  • 數(shù)據(jù)備份問題夺颤。

參考:
https://www.youtube.com/watch?v=X48VuDVv0do

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市胁勺,隨后出現(xiàn)的幾起案子拂共,更是在濱河造成了極大的恐慌,老刑警劉巖姻几,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異势告,居然都是意外死亡蛇捌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門咱台,熙熙樓的掌柜王于貴愁眉苦臉地迎上來络拌,“玉大人,你說我怎么就攤上這事回溺〈好常” “怎么了混萝?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長萍恕。 經(jīng)常有香客問我逸嘀,道長,這世上最難降的妖魔是什么允粤? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任崭倘,我火速辦了婚禮,結(jié)果婚禮上类垫,老公的妹妹穿的比我還像新娘司光。我一直安慰自己,他們只是感情好悉患,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布残家。 她就那樣靜靜地躺著,像睡著了一般售躁。 火紅的嫁衣襯著肌膚如雪坞淮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天迂求,我揣著相機與錄音碾盐,去河邊找鬼。 笑死揩局,一個胖子當(dāng)著我的面吹牛毫玖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凌盯,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼付枫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了驰怎?” 一聲冷哼從身側(cè)響起阐滩,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎县忌,沒想到半個月后掂榔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡症杏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年装获,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厉颤。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡穴豫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逼友,到底是詐尸還是另有隱情精肃,我是刑警寧澤秤涩,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站司抱,受9級特大地震影響筐眷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜状植,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一浊竟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧津畸,春花似錦振定、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至暖途,卻和暖如春卑惜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背驻售。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工露久, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人欺栗。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓毫痕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親迟几。 傳聞我的和親對象是個殘疾皇子消请,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355