摘要:千呼萬喚始出來,有狀態(tài)集群服務(wù)部署與管理下將著重介紹與有狀態(tài)集群服務(wù)相關(guān)的兩個新特性和。把這些特性和有狀態(tài)集群服務(wù)關(guān)聯(lián)起來串一下,我們可以用來管理一個有狀態(tài)服務(wù)集群,里每個對應(yīng)集群的一個成員,集群的初始化可以用來完成。
千呼萬喚始出來,《Kubernetes有狀態(tài)集群服務(wù)部署與管理(下)》將著重介紹Kubernetes與有狀態(tài)集群服務(wù)相關(guān)的兩個新特性:Init Container 和 Pet Set 。
Tips: 關(guān)注公眾號:tenxcloud2(時速云訂閱號),回復(fù) "1206"即可下載現(xiàn)場PPT。
什么是Init Container?從名字來看就是做初始化工作的容器??梢杂幸粋€或多個,如果有多個,這些 Init Container 按照定義的順序依次執(zhí)行,只有所有的Init Container 執(zhí)行完后,主容器才啟動。由于一個Pod里的存儲卷是共享的,所以 Init Container 里產(chǎn)生的數(shù)據(jù)可以被主容器使用到。
Init Container可以在多種 K8S 資源里被使用到如 Deployment、Daemon Set, Pet Set, Job等,但歸根結(jié)底都是在Pod啟動時,在主容器啟動前執(zhí)行,做初始化工作。
我們在什么地方會用到 Init Container呢?第一種場景是等待其它模塊Ready,比如我們有一個應(yīng)用里面有兩個容器化的服務(wù),一個是Web Server,另一個是數(shù)據(jù)庫。其中Web Server需要訪問數(shù)據(jù)庫。但是當(dāng)我們啟動這個應(yīng)用的時候,并不能保證數(shù)據(jù)庫服務(wù)先啟動起來,所以可能出現(xiàn)在一段時間內(nèi)Web Server有數(shù)據(jù)庫連接錯誤。為了解決這個問題,我們可以在運行Web Server服務(wù)的Pod里使用一個Init Container,去檢查數(shù)據(jù)庫是否準(zhǔn)備好,直到數(shù)據(jù)庫可以連接,Init Container才結(jié)束退出,然后Web Server容器被啟動,發(fā)起正式的數(shù)據(jù)庫連接請求。
第二種場景是做初始化配置,比如集群里檢測所有已經(jīng)存在的成員節(jié)點,為主容器準(zhǔn)備好集群的配置信息,這樣主容器起來后就能用這個配置信息加入集群。
還有其它使用場景,如將pod注冊到一個中央數(shù)據(jù)庫、下載應(yīng)用依賴等。
這些東西能夠放到主容器里嗎?從技術(shù)上來說能,但從設(shè)計上來說,可能不是一個好的設(shè)計。首先不符合單一職責(zé)原則,其次這些操作是只執(zhí)行一次的,如果放到主容器里,還需要特殊的檢查來避免被執(zhí)行多次。
這是Init Container的一個使用樣例
這個例子創(chuàng)建一個Pod,這個Pod里跑的是一個nginx容器,Pod里有一個叫workdir的存儲卷,訪問nginx容器服務(wù)的時候,就會顯示這個存儲卷里的index.html 文件。
而這個index.html 文件是如何獲得的呢?是由一個Init Container從網(wǎng)絡(luò)上下載的。這個Init Container 使用一個busybox鏡像,起來后,執(zhí)行一條wget命令,獲取index.html文件,然后結(jié)束退出。
由于Init Container和nginx容器共享一個存儲卷(這里這個存儲卷的名字叫workdir),所以在Init container里下載的index.html文件可以在nginx容器里被訪問到。
可以看到 Init Container 是在 annotation里定義的。Annotation 是K8S新特性的實驗場,通常一個新的Feature出來一般會先在Annotation 里指定,等成熟穩(wěn)定了,再給它一個正式的屬性名或資源對象名。
介紹完Init Container,千呼萬喚始出來,主角Pet Set該出場了。
什么是Pet Set?在數(shù)據(jù)結(jié)構(gòu)里Set是集合的意思,所以顧名思義Pet Set就是Pet的集合,那什么是Pet呢?我們提到過Cattle和Pet的概念,Cattle代表無狀態(tài)服務(wù),而Pet代表有狀態(tài)服務(wù)。具體在K8S資源對象里,Pet是一種需要特殊照顧的Pod。它有狀態(tài)、有身份、當(dāng)然也比普通的Pod要復(fù)雜一些。
具體來說,一個Pet有三個特征。
一是有穩(wěn)定的存儲,這是通過我們前面介紹的PV/PVC 來實現(xiàn)的。
二是穩(wěn)定的網(wǎng)絡(luò)身份,這是通過一種叫 Headless Service 的特殊Service來實現(xiàn)的。要理解Headless Service是如何工作的,需要先了解Service是如何工作。我們提到過Service可以為多個Pod實例提供一個穩(wěn)定的對外訪問接口。這個穩(wěn)定的接口是如何實現(xiàn)的的呢,是通過Cluster IP來實現(xiàn)的,Cluster IP是一個虛擬IP,不是真正的IP,所以穩(wěn)定。K8S會在每個節(jié)點上創(chuàng)建一系列的IPTables規(guī)則,實現(xiàn)從Cluster IP到實際Pod IP的轉(zhuǎn)發(fā)。同時還會監(jiān)控這些Pod的IP地址變化,如果變了,會更新IP Tables規(guī)則,使轉(zhuǎn)發(fā)路徑保持正確。所以即使Pod IP有變化,外部照樣能通過Service的ClusterIP訪問到后面的Pod。
普通Service的Cluster IP 是對外的,用于外部訪問多個Pod實例。而Headless Service的作用是對內(nèi)的,用于為一個集群內(nèi)部的每個成員提供一個唯一的DNS名字,這樣集群成員之間就能相互通信了。所以Headless Service沒有Cluster IP,這是它和普通Service的區(qū)別。
Headless Service為每個集群成員創(chuàng)建的DNS名字是什么樣的呢?右下角是一個例子,第一個部分是每個Pet自己的名字,后面foo是Headless Service的名字,default是PetSet所在命名空間的名字,cluser.local是K8S集群的域名。對于同一個Pet Set里的每個Pet,除了Pet自己的名字,后面幾部分都是一樣的。所以要有一個穩(wěn)定且唯一的DNS名字,就要求每個Pet的名字是穩(wěn)定且唯一的。
三是序號命名規(guī)則。Pet是一種特殊的Pod,那么Pet能不能用Pod的命名規(guī)則呢?答案是不能,因為Pod的名字是不穩(wěn)定的。Pod的命名規(guī)則是,如果一個Pod是由一個RC創(chuàng)建的,那么Pod的名字是RC的名字加上一個隨機字符串。為什么要加一個隨機字符串,是因為RC里指定的是Pod的模版,為了實現(xiàn)高可用,通常會從這個模版里創(chuàng)建多個一模一樣的Pod實例,如果沒有這個隨機字符串,同一個RC創(chuàng)建的Pod之間就會由名字沖突。
如果說某個Pod由于某種原因死掉了,RC會新建一個來代替它,但是這個新建里的Pod名字里的隨機字符串與原來死掉的Pod是不一樣的。所以Pod的名字跟它的IP一樣是不穩(wěn)定的。
為了解決名字不穩(wěn)定的問題,K8S對Pet的名字不再使用隨機字符串,而是為每個Pet分配一個唯一不變的序號,比如 Pet Set 的名字叫 mysql,那么第一個啟起來的Pet就叫 mysql-0,第二個叫 mysql-1,如此下去。
當(dāng)一個Pet down 掉后,新創(chuàng)建的Pet 會被賦予跟原來Pet一樣的名字。由于Pet名字不變所以DNS名字也跟以前一樣,同時通過名字還能匹配到原來Pet用到的存儲,實現(xiàn)狀態(tài)保存。
這些是Pet Set 相關(guān)的一些操作:
Peer discovery,這和我們上面的Headless Service有密切關(guān)系。通過Pet Set的 Headless Service,可以查到該Service下所有的Pet 的 DNS 名字。這樣就能發(fā)現(xiàn)一個Pet Set 里所有的Pet。當(dāng)一個新的Pet起來后,就可以通過Peer Discovery來找到集群里已經(jīng)存在的所有節(jié)點的DNS名字,然后用它們來加入集群。
更新Replicas的數(shù)目、實現(xiàn)擴容和縮容。
更新Pet Set里Pet的鏡像版本,實現(xiàn)升級。
刪除 Pet Set。刪除一個Pet Set 會先把這個Pet Set的Replicas數(shù)目縮減為0,等到所有的Pet都被刪除了,再刪除 Pet Set本身。注意Pet用到的存儲不會被自動刪除。這樣用戶可以把數(shù)據(jù)拷貝走了,再手動刪除。
以上,與有狀態(tài)服集群服務(wù)相關(guān)的K8S特性就介紹完了。
把這些特性和有狀態(tài)集群服務(wù)關(guān)聯(lián)起來串一下,我們可以用Pet Set來管理一個有狀態(tài)服務(wù)集群,Pet Set里每個Pet對應(yīng)集群的一個成員,集群的初始化可以用 Init Container來完成。集群里每個成員的狀態(tài)由Volume, Persistent Volume來存儲,集群里每個Pet 唯一的DNS名字通過Headless Service來提供,集群里的成員之間就可以通過這個名字,相互通信。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/32529.html
摘要:有狀態(tài)集群服務(wù),與普通有狀態(tài)服務(wù)相比,它多了集群管理的需求。為此開發(fā)了一套以為核心的全新特性,方便了有狀態(tài)集群服務(wù)在上的部署和管理。 2016年12月2日,時速云架構(gòu)師張壽紅應(yīng)邀參加ArchSummit2016全球架構(gòu)師峰會,并在微服務(wù)與容器實踐專場做了《Kubernetes有狀態(tài)集群服務(wù)部署與管理》的干貨分享。 showImg(https://segmentfault.com/img...
摘要:來源商業(yè)新知網(wǎng),原標(biāo)題干貨分享云服務(wù)平臺的架構(gòu)及優(yōu)勢上前言我們通常所說的云服務(wù)或云平臺廣義上是一個概念,但其實內(nèi)部是兩個部分。本期我們?yōu)槟庾x云平臺的業(yè)界概況和優(yōu)勢。來源商業(yè)新知網(wǎng),原標(biāo)題:【干貨分享】云服務(wù)平臺的架構(gòu)及優(yōu)勢(上)前言 我們通常所說的云服務(wù)或云平臺廣義上是一個概念,但其實內(nèi)部是兩個部分。 1.支撐云服務(wù)運行的硬件和軟件系統(tǒng)環(huán)境(云架構(gòu)平臺,簡稱云平臺); 2.實現(xiàn)業(yè)務(wù)邏輯,支...
摘要:使用命名空間的概念幫助解決集群中在管理對象時的復(fù)雜性問題。命名空間為集群中的對象名稱賦予作用域。同樣,命名空間范圍的策略允許運維人員為生產(chǎn)環(huán)節(jié)設(shè)置嚴(yán)格的權(quán)限。這會修改操作在活躍時應(yīng)用到的命名空間。 K8s使用命名空間的概念幫助解決集群中在管理對象時的復(fù)雜性問題。在本文中,會討論命名空間的工作原理,介紹常用實例,并分享如何使用命名空間來管理K8s對象。最后,介紹名為projects的Ra...
閱讀 1368·2021-11-24 09:39
閱讀 1358·2021-11-04 16:12
閱讀 2701·2021-09-24 09:47
閱讀 3346·2021-09-01 10:50
閱讀 1487·2019-08-30 15:55
閱讀 1432·2019-08-30 15:43
閱讀 652·2019-08-30 11:08
閱讀 3588·2019-08-23 18:33