前言
Deployment 中可以隨意的關(guān)閉和啟動(dòng)一個(gè) Pod阱穗,Pod 之間的關(guān)系是平等的。
當(dāng) Pod 之間有主從關(guān)系,以及每個(gè) Pod 對(duì)應(yīng)特定的存儲(chǔ)卷中的內(nèi)容時(shí)笼呆,無法使用 Deployment 控制器來隨意的操作 Pod。
我們需要使用一個(gè)叫做 StatefulSet 的控制器來處理這種有狀態(tài)應(yīng)用 Pod旨别。
更新歷史
- 20200605 - 初稿 - 左程立
- 原文地址 - https://blog.zuolinux.com/2020/06/05/about-controller-statefulset.html
StatefulSet 控制器工作原理
管理有狀態(tài)應(yīng)用 Pod 的秘訣是诗赌,提供穩(wěn)定不變的 Pod 標(biāo)識(shí)和穩(wěn)定不變的存儲(chǔ)。
穩(wěn)定不變的拓?fù)錉顟B(tài)秸弛,即不變的主機(jī)名
該標(biāo)識(shí)和 Pod 是綁定的铭若,不管 Pod 被調(diào)度到哪個(gè)節(jié)點(diǎn)上
StatefulSet 中每個(gè) Pod 將被分配一個(gè)整數(shù)序號(hào),從 0 到 N-1递览,該序號(hào)在 StatefulSet 上是唯一的
每個(gè) Pod 根據(jù) StatefulSet 的名稱和 Pod 的序號(hào)派生出它的主機(jī)名叼屠。組合主機(jī)名的格式為 (序號(hào))
StatefulSet 名稱為 web,replicas 為 3绞铃,那么將會(huì)創(chuàng)建三個(gè)名稱分別為 web-0镜雨、web-1、web-2 的 Pod憎兽。一旦每個(gè) Pod 創(chuàng)建成功冷离,就會(huì)得到一個(gè)匹配的 DNS 名稱,格式為:<pod-name>. <service-name>.<namespace>.svc.cluster.local纯命,其中 service-name 由 StatefulSet 的 serviceName 域來設(shè)定
并且這些 Pod 的創(chuàng)建西剥,是嚴(yán)格按照編號(hào)順序進(jìn)行的。比如亿汞,在 web-0 進(jìn)入到 Running 狀態(tài)瞭空、并且 Conditions 成為 Ready 之前,web-1 會(huì)一直處于 Pending 狀態(tài)
當(dāng)我們把這幾個(gè) Pod 刪除之后疗我,Kubernetes 會(huì)按照原先編號(hào)的順序咆畏,創(chuàng)建出新的 Pod。并且吴裤,Kubernetes 依然為它們分配了與原來相同的“網(wǎng)絡(luò)身份”
通過這種嚴(yán)格的對(duì)應(yīng)規(guī)則旧找,StatefulSet 就保證了 Pod 網(wǎng)絡(luò)標(biāo)識(shí)的穩(wěn)定性
穩(wěn)定不變的存儲(chǔ)
每個(gè) Pod 都會(huì)綁定一個(gè)固定編號(hào)的 PVC,這些 PVC 的名字都是 <PVC名>-<Pod名>
名叫 web-0 的 Pod麦牺,會(huì)聲明使用名叫 www-web-0 的 PVC
PV/PVC 通過動(dòng)態(tài)卷的方式存儲(chǔ)于遠(yuǎn)程存儲(chǔ)服務(wù)器
當(dāng)一個(gè) Pod 被刪除后钮蛛,對(duì)應(yīng)的 PVC 和 PV 并不會(huì)被刪除鞭缭,數(shù)據(jù)依然存在于遠(yuǎn)程服務(wù)器,Pod 被重建后魏颓,StatefulSet 會(huì)重新查找對(duì)應(yīng)名稱的 PVC 來進(jìn)行綁定
結(jié)束語
StatefulSet 擴(kuò)展了 Deployment岭辣,對(duì) Pod 和對(duì)應(yīng)的存儲(chǔ)卷都進(jìn)行了固定名稱和編號(hào),不管 Pod 如何處理甸饱,這些對(duì)應(yīng)關(guān)系都不會(huì)有變化沦童,從而將業(yè)務(wù)邏輯關(guān)系以及存儲(chǔ)關(guān)系固定了下來,確保了有狀態(tài)應(yīng)用正常運(yùn)行叹话。