摘要:在中,被用來管理有狀態(tài)應(yīng)用的對(duì)象。并行管理并行管理告訴控制器以并行的方式啟動(dòng)或者終止所有的。如果設(shè)置為,則控制器將會(huì)刪除和重建中的每一。在大部分的情況下,不會(huì)使用分隔當(dāng)希望進(jìn)行金絲雀發(fā)布,或者執(zhí)行階段發(fā)布時(shí),分隔是很有用的。
在Kubernetes中,StatefulSet被用來管理有狀態(tài)應(yīng)用的API對(duì)象。StatefulSets在Kubernetes 1.9版本才穩(wěn)定。StatefulSet管理Pod部署和擴(kuò)容,并為這些Pod提供順序和唯一性的保證。與Deployment相似的地方是,StatefulSet基于spec規(guī)格管理Pod;與Deployment不同的地方是,StatefulSet需要維護(hù)每一個(gè)Pod的唯一身份標(biāo)識(shí)。這些Pod基于同樣的spec創(chuàng)建,但互相之間不能替換,每一個(gè)Pod都保留自己的持久化標(biāo)識(shí)。
對(duì)于下面的應(yīng)用場(chǎng)景,StatefulSets是有價(jià)值的:
穩(wěn)定、唯一的網(wǎng)絡(luò)標(biāo)識(shí)
穩(wěn)定、持久的存儲(chǔ)
按照順序、優(yōu)雅的部署和擴(kuò)容
按照順序、優(yōu)雅的刪除和終止
按照順序、自動(dòng)滾動(dòng)更新
上述的穩(wěn)定是持久的同義詞,如果應(yīng)用不需要穩(wěn)定的標(biāo)識(shí)或者順序的部署、刪除、擴(kuò)容,則應(yīng)該使用無狀態(tài)的副本集。Deployment或者ReplicaSet的控制器更加適合無狀態(tài)業(yè)務(wù)場(chǎng)景。
2、StatefulSet的限制在Kubernetes 1.9版本之前是beta版本,在Kubernetes 1.5版本之前是不提供的。
Pod存儲(chǔ)由PersistentVolume(storage類或者管理員預(yù)先創(chuàng)建)提供。
刪除或者縮容StatefulSet不會(huì)刪除與StatefulSet關(guān)聯(lián)的數(shù)據(jù)卷,這樣能夠保證數(shù)據(jù)的安全性。
當(dāng)前的StatefulSets需要一個(gè)Headless服務(wù)來為Pod提供網(wǎng)絡(luò)標(biāo)識(shí),此Headless服務(wù)需要通過手工創(chuàng)建。
3、組件下面是一個(gè)StatefuleSet組成的示例:
一個(gè)名稱為nginx的Headless服務(wù),用來控制網(wǎng)絡(luò)域。
一個(gè)名稱為web的statefulSet,它擁有nginx容器(在唯一的Pod啟動(dòng))的3個(gè)副本集。
使用PersistenVolumes(由PersistentVolume
Provisioner提供)提供穩(wěn)定存儲(chǔ)的volumeClaimTemplates。
apiVersion:v1 kind:Service metadata: name:nginx labels: app:nginx spec: ports: -port:80 name:web clusterIP:None //Headless服務(wù) selector: app:nginx --- apiVersion:apps/v1 kind:StatefulSet metadata: name:web spec: selector: matchLabels: app:nginx# has to match .spec.template.metadata.labels serviceName:"nginx" replicas:3 # by default is 1 template: metadata: labels: app:nginx # has to match .spec.selector.matchLabels spec: terminationGracePeriodSeconds:10 containers: -name:nginx image:k8s.gcr.io/nginx-slim:0.8 ports: -containerPort:80 name:web volumeMounts: #掛接數(shù)據(jù)卷 -name:www mountPath:/usr/share/nginx/html #掛接路徑為容器的/usr/share/nginx/html volumeClaimTemplates: #數(shù)據(jù)卷生命模板 -metadata: name:www spec: accessModes:["ReadWriteOnce"] storageClassName:my-storage-class resources: requests: storage:1Gi4、Pod選擇器
必須設(shè)置StatefulSet的sepc.selector,以匹配.spec.template.metadata.labels。在Kubernetes 1.8之前,spec.selector是可以忽略的,它被設(shè)置一個(gè)默認(rèn)值。在1.8或者后續(xù)的版本,如果不設(shè)置sepc.selector,則會(huì)導(dǎo)致創(chuàng)建StatefulSet失敗。
5、Pod身份標(biāo)識(shí)StatfuleSet Pod擁有一個(gè)唯一的身份標(biāo)識(shí),它由順序、穩(wěn)定的網(wǎng)絡(luò)標(biāo)識(shí)和穩(wěn)定的存儲(chǔ)所組成。此身份標(biāo)識(shí)一直跟隨著Pod,不過它被調(diào)度到那個(gè)Node上。
5.1 序數(shù)索引(Ordinal Index)對(duì)于擁有N個(gè)副本集的StatefulSet,在StatefulSet中的每一個(gè)Pod都會(huì)被指派一個(gè)整型的序數(shù),此序數(shù)在0和N之間,在整個(gè)集合中是唯一的。
5.2 網(wǎng)絡(luò)ID(Stable Network ID)在StatefulSet中,每一個(gè)Pod的主機(jī)名稱都由StatefulSet的名稱和序數(shù)所組成。Pod的主機(jī)名稱的格式:$(statefulset name)-$(ordinal)。如果創(chuàng)建了三個(gè)Pod,這他們的主機(jī)名稱為web-0,web-1,web-2。StatefulSet能夠使用Headless服務(wù)來控制Pod的域。Service管理的域的格式為:$(service name).$(namespace).svc.cluster.local,cluster.local是集群域。對(duì)于每一個(gè)被創(chuàng)建的Pod,它將得到一個(gè)DNS子域,格式為: $(podname).$(governing service domain),這里的管理服務(wù)在StatefulSet中,通過serviceName設(shè)置。
下面是StatefulSet中Pod在DNS中的名稱:
5.3 穩(wěn)定的存儲(chǔ)kubernetes為每一個(gè)VolumeClaimTemplate創(chuàng)建一個(gè)對(duì)應(yīng)的PersistentVolume。在前面的nginx實(shí)例中,每一個(gè)Pod將會(huì)my-storage-class存儲(chǔ)類型的PersistenVolume單一實(shí)例和1Gib的存儲(chǔ)空間。
如果沒有指定存儲(chǔ)類,則會(huì)使用默認(rèn)的存儲(chǔ)。但一個(gè)Pod被調(diào)度到Node上,它的volumeMounts將會(huì)掛接PersistentVolumes,并將其與PersistentVolumeClaims進(jìn)行關(guān)聯(lián)。需要注意的是,即使在Pod被刪除,PersistentVolumes與PersistentVolumeClaims之間的關(guān)聯(lián)關(guān)系也不會(huì)被刪除。
5.4 Pod命名標(biāo)簽當(dāng)StatefulSet控制器創(chuàng)建了Pod,它將會(huì)添加一個(gè)標(biāo)簽,為此Pod名稱的集合。此標(biāo)簽將能夠管理服務(wù)到指定的Pod。
6、部署和擴(kuò)容保證對(duì)于一個(gè)帶有N個(gè)副本集的StatefulSet,當(dāng)Pod被部署,它們將按0到N-1的順序被創(chuàng)建。
當(dāng)一Pod被刪除時(shí),它們將按照N-1到0的倒序被終止。
在進(jìn)行Pod擴(kuò)容前,所有依賴的Pod應(yīng)該都已在運(yùn)行和準(zhǔn)備好。
在Pod被終止前,所有的依賴它的Pod都必須完全停止。
在前文創(chuàng)建的nginx例子中,將按照順序部署web-0,web-1和web-2。web-1只能在web-0運(yùn)行和準(zhǔn)備好以后才能夠被部署,web-2只能在web-1運(yùn)行和準(zhǔn)備好以后才能夠被部署。如果web-0失敗,就算web-1正在運(yùn)行,web-2也是不能正常啟動(dòng)的,除非web-0被重啟,并正常運(yùn)行。
如果縮容上述例子,設(shè)置replicas=1,則web-2首先被終止,接著是web-1。如果在web-2被終止后,但在web-1被終止前,web-0失敗了,web-1將不能被終止,除非web-0處于正常運(yùn)行狀態(tài)。
6.1 Pod管理策略在Kubernetes 1.7以后,StatefulSet的唯一性標(biāo)識(shí)可以通過.spec.podManagementPolicy的值進(jìn)行保證。
6.1.1 OrderedReady Pod管理OrderedReady pod管理是StatefulSets默認(rèn)的管理模式,此模式安裝順序啟動(dòng)或者終止Pod。
6.1.2 并行Pod管理并行Pod管理告訴StatefulSet控制器以并行的方式啟動(dòng)或者終止所有的Pod。
7、更新策略在Kubernetes 1.7之后,運(yùn)行通過配置StatefulSet的.spec.updateStrategy,實(shí)現(xiàn)Pod的容器、標(biāo)簽、資源請(qǐng)求/限制和注釋自動(dòng)更新。
7.1 On Delete策略OnDelete更新策略是1.6之前版本的行為。當(dāng)StatefulSet的.spec.updateStrategy.type被設(shè)置為OnDelete,則StatefulSet控制器將不會(huì)知道更新Pod。
7.2 Rolling Updates策略RollingUpdate更新策略將實(shí)現(xiàn)StatefulSet中Pod的自動(dòng)滾動(dòng)更新,這是StatefulSet的默認(rèn)更新模式。如果.spec.updateStrategy.type設(shè)置為 RollingUpdate,則StatefulSet控制器將會(huì)刪除和重建StatefulSet中的每一Pod。它將會(huì)按照從最大到最小的序數(shù)終止Pod,并按照從小到大順序重建Pod。
7.3 PartitionsRollingUpdate更新策略能夠通過指定.spec.updateStrategy.rollingUpdate.partition進(jìn)行分隔。當(dāng)分隔被指定,所有序數(shù)大于或等于分隔的Pod將會(huì)被更新,其它的Pod將被不會(huì)進(jìn)行更新。在大部分的情況下,不會(huì)使用分隔;當(dāng)希望進(jìn)行金絲雀發(fā)布,或者執(zhí)行階段發(fā)布時(shí),分隔是很有用的。
作者簡(jiǎn)介: 季向遠(yuǎn),北京神舟航天軟件技術(shù)有限公司產(chǎn)品經(jīng)理。本文版權(quán)歸原作者所有。
微信號(hào):RancherLabs
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/32665.html
摘要:的核心是以容器為中心的管理環(huán)境。命名空間提供了名稱范圍。換句話說,確保或同類組始終可用。用于管理有狀態(tài)應(yīng)用程序,它管理一組的部署和擴(kuò)展,并提供有關(guān)這些的排序和唯一性的保證。 條分縷析帶你充分理解Kubernetes的各個(gè)細(xì)節(jié)與部分:它是什么,它如何解決容器編排問題,它包含哪些你必須掌握的關(guān)鍵對(duì)象,以及如何快速上手部署使用Kubernetes。 showImg(https://segme...
摘要:提供用于獲取有關(guān)容器和容器組狀態(tài)的實(shí)時(shí)信息的服務(wù),以及有關(guān)群集中開發(fā)人員操作的詳細(xì)信息。集群最高級(jí)別的抽象是指運(yùn)行本身是集群應(yīng)用程序的一組機(jī)器及其管理的容器,一個(gè)集群必須有一個(gè),即命令和控制集群中所有其他機(jī)器的系統(tǒng)。Docker容器改變了人們對(duì)開發(fā)、部署和維護(hù)軟件的思考方式,利用現(xiàn)代操作系統(tǒng)的本機(jī)隔離功能,容器支持類似于虛擬機(jī)的關(guān)注點(diǎn)分離,但是與基于虛擬機(jī)監(jiān)控程序的虛擬機(jī)相比,它的開銷要小得...
摘要:本文分享了擴(kuò)展以及管理混合云環(huán)境時(shí)可能遇到的挑戰(zhàn),以及如何簡(jiǎn)單高效地完成擴(kuò)展??缭茢U(kuò)展的挑戰(zhàn)你已經(jīng)決定使用云了,所以讓我們回過頭來思考一下最初的問題。節(jié)點(diǎn)組件是中的。在向上或向下擴(kuò)展或調(diào)整集群大小時(shí),為部署命中公有,響應(yīng)狀態(tài)代碼始終為。 流量突增時(shí),我們需要擴(kuò)展應(yīng)用程序以滿足用戶需求。本文分享了擴(kuò)展Kubernetes以及管理混合云環(huán)境時(shí)可能遇到的挑戰(zhàn),以及如何簡(jiǎn)單高效地完成Kuber...
摘要:此時(shí),一些聰明的技術(shù)公司紛紛跟進(jìn),推出了自家的容器集群管理項(xiàng)目,并且稱之為。容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口。管理集群的所有行為例如應(yīng)用調(diào)度改變應(yīng)用的狀態(tài),擴(kuò)縮容,更新降級(jí)應(yīng)用等。 showImg(https://segmentfault.com/img/remote/1460000018689306); 阿里妹導(dǎo)讀:Kubernetes 近幾年很熱門,在各大技術(shù)論壇上被...
摘要:本文內(nèi)容節(jié)選自由主辦的第七屆,架構(gòu)師高欣分享的的實(shí)踐實(shí)錄。當(dāng)然,在部署完成后,我們要做一個(gè)監(jiān)測(cè)以便掌握它的運(yùn)行狀況。規(guī)劃配置運(yùn)行環(huán)境在正式部署前,還要考慮如何規(guī)劃并配置好運(yùn)行環(huán)境。在使用部署時(shí),可以利用這些命令做驗(yàn)證,檢驗(yàn)部署是否正常。 showImg(https://segmentfault.com/img/bVblRHj?w=2880&h=1920); 本文內(nèi)容節(jié)選自由msup主辦...
閱讀 3611·2021-11-23 09:51
閱讀 2813·2021-11-23 09:51
閱讀 693·2021-10-11 10:59
閱讀 1693·2021-09-08 10:43
閱讀 3244·2021-09-08 09:36
閱讀 3306·2021-09-03 10:30
閱讀 3309·2021-08-21 14:08
閱讀 2214·2021-08-05 09:59