??明明跟你說過:個(gè)人主頁(yè)
??個(gè)人專欄:《Kubernetes航線圖:從船長(zhǎng)到K8s掌舵者》???
??行路有良友,便是天堂??
目錄
一、前言
1、k8s概述
2、有狀態(tài)服務(wù)和無狀態(tài)服務(wù)?
二、StatefulSet基本概念
1、StatefulSet特性?
2、StatefulSet與Deployment、DaemonSet的對(duì)比?
三、StatefulSet核心組件
1、Headless Service
2、VolumeClaimTemplates
四、StatefulSet的工作原理?
1、Pod名稱與網(wǎng)絡(luò)標(biāo)識(shí)的確定性
2、存儲(chǔ)卷的動(dòng)態(tài)分配與綁定?
3、故障恢復(fù)與重建機(jī)制
一、前言
1、k8s概述
?Kubernetes單詞起源于希臘語(yǔ), 是“舵手”或者“領(lǐng)航員、飛行員”的意思。
Kubernetes(簡(jiǎn)稱K8s)的前世今生可以追溯到谷歌(Google)內(nèi)部的一個(gè)項(xiàng)目,它起源于2003年,當(dāng)時(shí)谷歌正面臨著不斷增長(zhǎng)的應(yīng)用程序和服務(wù)的管理挑戰(zhàn)。這個(gè)項(xiàng)目最初被稱為"Borg",是一個(gè)早期的容器編排系統(tǒng)。Borg 的成功經(jīng)驗(yàn)成為 Kubernetes 開發(fā)的契機(jī)。
?有關(guān)k8s起源的介紹,請(qǐng)參考《初識(shí)K8s之前世今生、架構(gòu)、組件、前景》這篇文章
?
?
Kubernetes的優(yōu)點(diǎn)包括可移植性、可伸縮性和擴(kuò)展性。它使用輕型的YAML清單文件實(shí)現(xiàn)聲明性部署方法,對(duì)于應(yīng)用程序更新,無需重新構(gòu)建基礎(chǔ)結(jié)構(gòu)。管理員可以計(jì)劃和部署容器,根據(jù)需要擴(kuò)展容器并管理其生命周期。借助Kubernetes的開放源代碼API,用戶可以通過首選編程語(yǔ)言、操作系統(tǒng)、庫(kù)和消息傳遞總線來構(gòu)建應(yīng)用程序,還可以將現(xiàn)有持續(xù)集成和持續(xù)交付(CI/CD)工具集成。
?
2、有狀態(tài)服務(wù)和無狀態(tài)服務(wù)?
1.有狀態(tài)服務(wù)(Stateful Service):
- 有狀態(tài)服務(wù)在處理請(qǐng)求時(shí)會(huì)在多個(gè)請(qǐng)求之間維護(hù)一些狀態(tài)信息,這些狀態(tài)信息可能包括用戶會(huì)話信息、緩存數(shù)據(jù)、數(shù)據(jù)庫(kù)連接等。這些狀態(tài)信息會(huì)被保存在服務(wù)的內(nèi)存、數(shù)據(jù)庫(kù)或其他持久化存儲(chǔ)中。
- 有狀態(tài)服務(wù)會(huì)對(duì)每個(gè)請(qǐng)求的處理結(jié)果依賴于之前的請(qǐng)求狀態(tài),因此需要保持一致的狀態(tài)信息。這可能會(huì)導(dǎo)致在水平擴(kuò)展時(shí)出現(xiàn)一些問題,因?yàn)樾枰_保每個(gè)請(qǐng)求都被路由到正確的具有相同狀態(tài)的實(shí)例上。
- 典型的有狀態(tài)服務(wù)包括數(shù)據(jù)庫(kù)服務(wù)、消息隊(duì)列服務(wù)和一些分布式系統(tǒng)的狀態(tài)節(jié)點(diǎn)。
2.無狀態(tài)服務(wù)(Stateless Service):
- 無狀態(tài)服務(wù)在處理請(qǐng)求時(shí)不會(huì)保存任何狀態(tài)信息,每個(gè)請(qǐng)求都是獨(dú)立的,不依賴于之前的請(qǐng)求狀態(tài)。服務(wù)會(huì)根據(jù)請(qǐng)求的參數(shù)和當(dāng)前的環(huán)境進(jìn)行計(jì)算和處理,并返回結(jié)果。
- 無狀態(tài)服務(wù)通常會(huì)將狀態(tài)信息保存在外部的存儲(chǔ)系統(tǒng)中,如數(shù)據(jù)庫(kù)或緩存中。每個(gè)請(qǐng)求處理完成后,服務(wù)不會(huì)保留任何狀態(tài),因此可以輕松實(shí)現(xiàn)水平擴(kuò)展,通過增加更多的實(shí)例來處理更多的請(qǐng)求。
- 典型的無狀態(tài)服務(wù)包括Web服務(wù)器、負(fù)載均衡器、靜態(tài)文件服務(wù)器和一些微服務(wù)架構(gòu)中的服務(wù)。
總結(jié)起來說,無狀態(tài)服務(wù)通常包括前后端代碼、中間件等這些不需要做數(shù)據(jù)持久化的服務(wù),因?yàn)檫@些服務(wù)不用擔(dān)心因故障導(dǎo)致的服務(wù)重建而造成的數(shù)據(jù)丟失。
而有狀態(tài)服務(wù)通常指數(shù)據(jù)庫(kù)和消息隊(duì)列,比如說MySQL、ES、kafka等需要做數(shù)據(jù)持久化的服務(wù),因?yàn)檫@些服務(wù)所在的Pod如果沒有數(shù)據(jù)持久化,一旦Pod重啟或飄逸,就會(huì)丟失數(shù)據(jù)。
二、StatefulSet基本概念
1、StatefulSet特性?
StatefulSet是Kubernetes中用于管理有狀態(tài)應(yīng)用的控制器。與Deployment不同,StatefulSet維護(hù)了有狀態(tài)應(yīng)用的穩(wěn)定標(biāo)識(shí)符,并且為每個(gè)Pod分配了一個(gè)唯一的標(biāo)識(shí)符。這使得StatefulSet非常適合運(yùn)行需要穩(wěn)定標(biāo)識(shí)符的應(yīng)用程序,例如數(shù)據(jù)庫(kù)。
以下是StatefulSet的一些主要特性:
- 穩(wěn)定的網(wǎng)絡(luò)標(biāo)識(shí)符:每個(gè)StatefulSet中的Pod都具有穩(wěn)定的網(wǎng)絡(luò)標(biāo)識(shí)符,可以通過其索引或名稱進(jìn)行訪問。這些標(biāo)識(shí)符會(huì)隨著Pod的重啟而保持不變。
- 有序部署和擴(kuò)展:StatefulSet可以確保Pod按照指定的順序進(jìn)行部署和擴(kuò)展。這對(duì)于有狀態(tài)應(yīng)用程序非常重要,因?yàn)樗鼈兺ǔP枰诩褐械牟煌?jié)點(diǎn)上以特定的順序啟動(dòng)。
- 穩(wěn)定的存儲(chǔ):StatefulSet可以為每個(gè)Pod提供獨(dú)立的持久化存儲(chǔ)。這些存儲(chǔ)卷可以在Pod重啟時(shí)保持不變,確保數(shù)據(jù)的持久性。
- 有狀態(tài)的服務(wù)發(fā)現(xiàn):StatefulSet會(huì)為每個(gè)Pod分配一個(gè)唯一的DNS名稱,可以通過該名稱進(jìn)行服務(wù)發(fā)現(xiàn)。這使得有狀態(tài)應(yīng)用程序可以通過DNS名稱進(jìn)行通信,而不必?fù)?dān)心Pod的IP地址變化。
- 有序的Pod終止:與部署不同,StatefulSet可以確保Pod按照指定的順序終止。這對(duì)于有狀態(tài)應(yīng)用程序的升級(jí)和維護(hù)非常重要,因?yàn)樗鼈兛赡苄枰诮K止之前執(zhí)行一些清理操作。
??
2、StatefulSet與Deployment、DaemonSet的對(duì)比?
StatefulSet、Deployment和DaemonSet是Kubernetes中常用的控制器,用于管理不同類型的應(yīng)用。它們之間有以下幾點(diǎn)區(qū)別:
StatefulSet:
- 用于管理有狀態(tài)應(yīng)用程序,如數(shù)據(jù)庫(kù)。
- 每個(gè)Pod都有一個(gè)唯一的穩(wěn)定標(biāo)識(shí)符,可以持久化地保留在Pod的整個(gè)生命周期中。
- 可以按照指定的順序部署、擴(kuò)展和終止Pod,以確保有狀態(tài)應(yīng)用程序的穩(wěn)定性。
- 可以為每個(gè)Pod提供獨(dú)立的持久化存儲(chǔ)。
Deployment:
- 用于管理無狀態(tài)應(yīng)用程序,如Web服務(wù)。
- 負(fù)責(zé)確保指定數(shù)量的Pod副本運(yùn)行在集群中,無需關(guān)注Pod的順序或標(biāo)識(shí)符。
- 可以進(jìn)行滾動(dòng)更新,快速部署新版本的應(yīng)用程序,并確保不中斷服務(wù)。
- 適用于需要水平擴(kuò)展的應(yīng)用程序,例如負(fù)載均衡的Web服務(wù)。
DaemonSet:
- 用于在集群中的每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè)副本的Pod,通常用于運(yùn)行后臺(tái)任務(wù)或監(jiān)控代理。
- 與Deployment不同,DaemonSet確保每個(gè)節(jié)點(diǎn)都有一個(gè)Pod副本運(yùn)行,而不管節(jié)點(diǎn)的數(shù)量如何變化。
- 可以用于部署一些與節(jié)點(diǎn)相關(guān)的服務(wù),例如日志收集器或網(wǎng)絡(luò)代理。
???
三、StatefulSet核心組件
1、Headless Service
StatefulSet與Headless Service通常結(jié)合使用,以管理有狀態(tài)應(yīng)用程序的網(wǎng)絡(luò)通信。這兩者的關(guān)系如下:
StatefulSet:
- 用于管理有狀態(tài)的應(yīng)用程序,如數(shù)據(jù)庫(kù)或其他需要持久標(biāo)識(shí)符的服務(wù)。
- 每個(gè)Pod都有一個(gè)唯一的、穩(wěn)定的標(biāo)識(shí)符,可以通過索引或名稱訪問。
- 通常需要與Headless Service結(jié)合使用,以便為每個(gè)Pod提供唯一的DNS記錄,以支持服務(wù)發(fā)現(xiàn)和網(wǎng)絡(luò)通信。
Headless Service:
- 是一種特殊類型的Kubernetes Service,它沒有ClusterIP。
- 通過為每個(gè)Pod提供一個(gè)DNS記錄,允許直接通過Pod的IP地址進(jìn)行網(wǎng)絡(luò)通信。
- 通常與StatefulSet一起使用,為StatefulSet中的每個(gè)Pod提供唯一的DNS記錄,以便其他應(yīng)用程序可以通過這些DNS記錄直接訪問每個(gè)Pod。
在StatefulSet中,每個(gè)Pod都有一個(gè)唯一的DNS記錄,該DNS記錄遵循以下格式:
$(podname).$(service name).$(namespace).svc.cluster.local
通過這種方式,其他應(yīng)用程序可以直接使用該DNS記錄來訪問StatefulSet中的每個(gè)Pod,從而實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和網(wǎng)絡(luò)通信。
???
2、VolumeClaimTemplates
VolumeClaimTemplates是StatefulSet中的一個(gè)重要組件,用于定義與每個(gè)Pod相關(guān)聯(lián)的PersistentVolumeClaim(PVC)的模板。在StatefulSet中,每個(gè)Pod都會(huì)有一個(gè)關(guān)聯(lián)的PVC,用于請(qǐng)求持久化存儲(chǔ)資源,以便數(shù)據(jù)在Pod之間的遷移和持久化。
VolumeClaimTemplates的主要作用包括:
-
定義模板:VolumeClaimTemplates允許定義PVC的模板,其中包括存儲(chǔ)類、訪問模式、存儲(chǔ)資源請(qǐng)求等信息。這些模板將被用于為StatefulSet中的每個(gè)Pod創(chuàng)建對(duì)應(yīng)的PVC。
-
自動(dòng)生成PVC:根據(jù)定義的模板,Kubernetes會(huì)自動(dòng)為StatefulSet中的每個(gè)Pod創(chuàng)建對(duì)應(yīng)的PVC。這樣可以確保每個(gè)Pod都有自己的持久化存儲(chǔ)資源。
-
與StatefulSet關(guān)聯(lián):VolumeClaimTemplates與StatefulSet關(guān)聯(lián),使得它們能夠一起協(xié)同工作。當(dāng)創(chuàng)建或更新StatefulSet時(shí),Kubernetes會(huì)根據(jù)VolumeClaimTemplates的定義自動(dòng)創(chuàng)建或更新PVC。
-
簡(jiǎn)化配置:通過使用VolumeClaimTemplates,可以簡(jiǎn)化配置,避免手動(dòng)為每個(gè)Pod創(chuàng)建PVC的繁瑣工作。只需定義一個(gè)模板,Kubernetes就會(huì)為每個(gè)Pod生成相應(yīng)的PVC,提高了部署和管理的效率。
???
四、StatefulSet的工作原理?
1、Pod名稱與網(wǎng)絡(luò)標(biāo)識(shí)的確定性
StatefulSet在創(chuàng)建Pod時(shí),會(huì)為每個(gè)Pod分配一個(gè)唯一的名稱,并使用該名稱來確定Pod的網(wǎng)絡(luò)標(biāo)識(shí)。這種確定性是通過StatefulSet控制器的設(shè)計(jì)來實(shí)現(xiàn)的,
其工作原理如下:
Pod名稱的確定性:
- StatefulSet控制器根據(jù)定義的Pod模板和副本數(shù)量,生成一系列Pod的名稱。通常,Pod的名稱會(huì)包含StatefulSet的名稱以及一個(gè)唯一的索引號(hào),例如<statefulset-name>-<ordinal>。
- 這些Pod名稱的確定性保證了每個(gè)Pod都有一個(gè)唯一的標(biāo)識(shí)符,便于管理和識(shí)別。
網(wǎng)絡(luò)標(biāo)識(shí)的確定性:
- StatefulSet控制器會(huì)為每個(gè)Pod分配一個(gè)穩(wěn)定的DNS名稱,通常是基于Pod名稱的域名。例如,如果StatefulSet的名稱是myapp,則第一個(gè)Pod的DNS名稱可能是myapp-0.myapp.default.svc.cluster.local。
- 這種確定性的DNS名稱確保了每個(gè)Pod都有一個(gè)穩(wěn)定的網(wǎng)絡(luò)標(biāo)識(shí)符,其他應(yīng)用可以通過DNS來發(fā)現(xiàn)和訪問這些Pod。
啟動(dòng)和更新順序:
- StatefulSet控制器按照定義的副本數(shù)量和啟動(dòng)順序逐個(gè)創(chuàng)建和更新Pod。通常情況下,后續(xù)Pod的啟動(dòng)和更新會(huì)等待前一個(gè)Pod完全啟動(dòng)和準(zhǔn)備就緒后再開始。
- 這種有序的啟動(dòng)和更新順序保證了應(yīng)用的可靠性和穩(wěn)定性,確保了應(yīng)用的初始化和數(shù)據(jù)同步等過程能夠順利進(jìn)行。
2、存儲(chǔ)卷的動(dòng)態(tài)分配與綁定?
StatefulSet的工作原理中,存儲(chǔ)卷的動(dòng)態(tài)分配與綁定是通過volumeClaimTemplates字段實(shí)現(xiàn)的。這個(gè)字段允許定義一個(gè)或多個(gè)VolumeClaimTemplates,它們描述了每個(gè)Pod所需的存儲(chǔ)卷大小和訪問模式。在創(chuàng)建StatefulSet時(shí),Kubernetes將根據(jù)這些模板動(dòng)態(tài)地創(chuàng)建PersistentVolumeClaim(PVC),然后將其與對(duì)應(yīng)的PersistentVolume(PV)綁定。
工作原理大致如下:
定義VolumeClaimTemplates:
- 在StatefulSet的配置中,通過volumeClaimTemplates字段定義每個(gè)Pod所需的存儲(chǔ)卷模板。這些模板包含了存儲(chǔ)卷的名稱、大小、訪問模式等信息。
動(dòng)態(tài)創(chuàng)建PVC:
- 當(dāng)創(chuàng)建StatefulSet時(shí),Kubernetes會(huì)根據(jù)定義的VolumeClaimTemplates動(dòng)態(tài)地創(chuàng)建對(duì)應(yīng)數(shù)量的PVC。每個(gè)PVC都會(huì)根據(jù)模板中的定義,分配一個(gè)唯一的名稱,并指定所需的存儲(chǔ)卷大小和訪問模式。
PV的動(dòng)態(tài)綁定:
- 一旦PVC被創(chuàng)建,Kubernetes會(huì)自動(dòng)查找滿足其需求的可用PV。如果存在符合條件的PV,則將PVC與PV進(jìn)行綁定。如果沒有可用的PV,Kubernetes將根據(jù)定義的StorageClass動(dòng)態(tài)創(chuàng)建新的PV,并將其與PVC進(jìn)行綁定。
PVC的掛載:
- 綁定完成后,StatefulSet會(huì)將每個(gè)Pod的PVC掛載到對(duì)應(yīng)的容器中。容器可以通過掛載的PVC來訪問和使用持久化存儲(chǔ)。
通過這種方式,StatefulSet能夠自動(dòng)管理存儲(chǔ)卷的動(dòng)態(tài)分配和綁定過程,確保每個(gè)Pod都擁有自己獨(dú)立的持久化存儲(chǔ),并且能夠持久化地保存應(yīng)用程序的數(shù)據(jù)。這種動(dòng)態(tài)的存儲(chǔ)卷管理機(jī)制使得StatefulSet適用于需要持久化存儲(chǔ)的有狀態(tài)應(yīng)用,如數(shù)據(jù)庫(kù)、消息隊(duì)列等。
3、故障恢復(fù)與重建機(jī)制
- 穩(wěn)定的網(wǎng)絡(luò)標(biāo)識(shí)和穩(wěn)定的持久化存儲(chǔ):StatefulSet保證每個(gè)Pod都有唯一的網(wǎng)絡(luò)標(biāo)識(shí)和持久化存儲(chǔ)。即使Pod重新啟動(dòng)或遷移到其他節(jié)點(diǎn),它們也會(huì)保持相同的網(wǎng)絡(luò)標(biāo)識(shí)和持久化存儲(chǔ),從而確保應(yīng)用程序狀態(tài)的持久性。
- 有序的Pod部署和終止:StatefulSet會(huì)按照定義的順序逐個(gè)部署和終止Pod。這確保了在更新或擴(kuò)容時(shí),每個(gè)Pod都能以有序的方式啟動(dòng)和停止,從而避免了并發(fā)啟動(dòng)或停止可能導(dǎo)致的問題。
- 滾動(dòng)更新策略:StatefulSet支持滾動(dòng)更新策略,可以逐個(gè)替換舊的Pod實(shí)例。在進(jìn)行滾動(dòng)更新時(shí),它會(huì)等待新Pod就緒后再繼續(xù)更新下一個(gè)Pod,從而確保更新過程的穩(wěn)健性和可控性。
- 自動(dòng)重啟和重建:如果某個(gè)Pod失敗或被終止,StatefulSet會(huì)自動(dòng)重啟該P(yáng)od或在另一個(gè)節(jié)點(diǎn)上重建一個(gè)新的Pod,以保持所需的副本數(shù)量。
- 管理PVC的生命周期:StatefulSet還負(fù)責(zé)管理與之關(guān)聯(lián)的PersistentVolumeClaim(PVC)的生命周期。當(dāng)StatefulSet被刪除時(shí),它會(huì)根據(jù)定義的回收策略來處理PVC,可以選擇保留或刪除與之關(guān)聯(lián)的持久化存儲(chǔ)。
??????每一次的分享都是一次成長(zhǎng)的旅程,感謝您的陪伴和關(guān)注。希望這些關(guān)于Kubernetes的文章能陪伴您走過技術(shù)的一段旅程,共同見證成長(zhǎng)和進(jìn)步!??????文章來源:http://www.zghlxwxcb.cn/news/detail-854796.html
??????讓我們一起在技術(shù)的海洋中探索前行,共同書寫美好的未來!??!文章來源地址http://www.zghlxwxcb.cn/news/detail-854796.html
到了這里,關(guān)于k8s 控制器StatefulSet原理解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!