共計(jì) 3604 個(gè)字符,預(yù)計(jì)需要花費(fèi) 10 分鐘才能閱讀完成。
丸趣 TV 小編給大家分享一下 Kubernetes 服務(wù)中 StatefulSets 有什么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
StatefulSets 在 v1.5 時(shí)還是個(gè) beta 特性,它取代了 v1.4 的 PetSets 特性。PetSets 的用戶可以參考 v1.5 的升級(jí)指導(dǎo),將正在運(yùn)行的 PeetSets 升級(jí)到 StatefulSets。
StatefulSet 是一個(gè)給 Pod 提供唯一標(biāo)志的控制器,它可以保證部署和擴(kuò)展的順序。
使用 StatefulSet
當(dāng)應(yīng)用有以下任意要求時(shí),StatefulSet 的價(jià)值就體現(xiàn)出來了。
● 穩(wěn)定的、唯一的網(wǎng)絡(luò)標(biāo)識(shí)。
● 穩(wěn)定的、持久化的存儲(chǔ)。
● 有序的、優(yōu)雅的部署和擴(kuò)展。
● 有序的、優(yōu)雅的刪除和停止。
上面提到的點(diǎn)中,在 Pod 調(diào)度時(shí),穩(wěn)定性和持久化是同一個(gè)意思。如果一個(gè)應(yīng)用不需要任何穩(wěn)定的標(biāo)識(shí)或順序的部署、刪除和擴(kuò)展,那么你應(yīng)該使用提供無狀態(tài)備份的控制器來部署你的應(yīng)用。諸如 Deployment 或者 ReplicaSet 可能更適合你的無狀態(tài)服務(wù)需求。
限制
● StatefulSet 還是 beta 版本,Kubernetes v1.5 之前不可用。
● 和所有的 alpha/beta 資源一樣,可以將 –runtime-config 選項(xiàng)傳遞給 apiserver,來禁止 StatefulSet。
● 給定 Pod 的存儲(chǔ)必須是:基于請(qǐng)求存儲(chǔ)等級(jí)(Storage Class)的 PersistentVolume Provisioner,或者是由管理員預(yù)先配置。
● 刪除和(或)減少 StatefulSet 副本,不會(huì)刪除 StatefulSet 相關(guān)的卷。這樣做是為了保證數(shù)據(jù)安全,比自動(dòng)的清除 StatefulSet 相關(guān)資源更有價(jià)值。● 當(dāng)前 StatefulSet 需要 Headless 服務(wù)來負(fù)責(zé) Pod 的網(wǎng)絡(luò)一致性。你需要?jiǎng)?chuàng)建該服務(wù)。
● 當(dāng)前,更新已經(jīng)存在的 StatefulSet 需要手動(dòng)執(zhí)行。
組件
下面的示例演示了 StatefulSet 的組件。
● 一個(gè) Headless 服務(wù),名為 nginx,用來控制網(wǎng)絡(luò)域。
● StatefulSet,名為 web,在同一個(gè) Pod 中起 3 個(gè) nginx 容器的副本。
● volumeClaimTemplates 使用 PV 供應(yīng)商的 PV 來提供穩(wěn)定的存儲(chǔ)。
---
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: gcr.io/google_containers/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
annotations:
volume.beta.kubernetes.io/storage-class: anything
spec:
accessModes: [ ReadWriteOnce ]
resources:
requests:
storage: 1Gi
Pod 一致性
StatefulSet Pod 有著唯一的一致性,該一致性包含次序(啟動(dòng)和停止次序)、穩(wěn)定的網(wǎng)絡(luò)一致性,和穩(wěn)定的網(wǎng)絡(luò)。該一致性和 Pod 緊密相關(guān),無論 Pod 被調(diào)度到哪個(gè) node 節(jié)點(diǎn)上。
次序索引
對(duì)于有 N 個(gè)副本的 StatefulSet,StatefulSet 的每個(gè) Pod 都被分配了一個(gè)數(shù)字序號(hào),序號(hào)在 [0,N) 的范圍內(nèi),并且在 Set 中是唯一的。
穩(wěn)定的網(wǎng)絡(luò) ID
StatefulSet 中每個(gè) Pod 都從 StatefulSet 的名稱和 Pod 的序號(hào)派生其主機(jī)名。組成的 hostname 的模式為 $(statefulset 名稱)-$(序號(hào))。上面的例子會(huì)創(chuàng)建名為 web-0,web-1,web-2。StatefulSet 可以以使用 Headless 服務(wù)來控制 Pod 的域,這個(gè)域使用的格式為:$(service name).$(namespace).svc.cluster.local,其中,“cluster.local”指的是集群域。Pod 被創(chuàng)建后,每個(gè) Pod 都會(huì)得到一個(gè)匹配的 DNS 子域,格式為 $(podname).$(governing service domain),其中的“governing service”是在 StatefulSet 中通過 serviceName 字段來定義的。
這里有幾個(gè)示例,可以展示 StatefulSet 的 Pod 的 DNS 組成。
Cluster DomainService (ns/name)StatefulSet (ns/name)StatefulSet DomainPod DNSPod Hostnamecluster.localdefault/nginxdefault/webnginx.default.svc.cluster.localweb-{0..N-1}.nginx.default.svc.cluster.localweb-{0..N-1}cluster.localfoo/nginxfoo/webnginx.foo.svc.cluster.localweb-{0..N-1}.nginx.foo.svc.cluster.localweb-{0..N-1}kube.localfoo/nginxfoo/webnginx.foo.svc.kube.localweb-{0..N-1}.nginx.foo.svc.kube.localweb-{0..N-1} 注意:除非另外的配置,集群域就會(huì)被設(shè)置為 cluster.local。
穩(wěn)定的存儲(chǔ)
Kubernetes 為每個(gè) VolumeClaimTemplate 創(chuàng)建一個(gè) PV。在上面的 nginx 例子中,每個(gè) Pod 會(huì)得到一個(gè) PV,該 PV 的存儲(chǔ)等級(jí) (storagee class) 為 anything,大小為 1Gb。當(dāng) Pod 被調(diào)度到其他 node 節(jié)點(diǎn)上時(shí),volumeMounts 會(huì)重新映射對(duì)應(yīng)的 PVC。注意,當(dāng) Pod 或者 StatefulSet 被刪除時(shí),對(duì)應(yīng)的 PV 和 PVC 不會(huì)被刪除,這個(gè)刪除操作必須手動(dòng)來執(zhí)行。
部署和擴(kuò)展
● 對(duì)于擁有 N 個(gè)拷貝的 StatefulSet,當(dāng)部署 Pod 時(shí),它們會(huì)被順序地創(chuàng)建(從 0 到 N -1)。
● 當(dāng) Pod 被刪除時(shí),它們被終止的順序是從 N - 1 到 0。
● 當(dāng)對(duì) Pod 執(zhí)行擴(kuò)展操作時(shí),它前面的 Pod 必須都處于 Running 和 Ready 狀態(tài)。
● 當(dāng) Pod 被終止時(shí),它所有的 successors 都必須被完全地關(guān)閉。
不應(yīng)該將 StatefulSet 的 pod.Spec.TerminationGracePeriodSeconds 值設(shè)置為 0,因?yàn)樵摬僮鞑话踩瑥?qiáng)烈不建議使用。若需要更深層次的解釋,請(qǐng)參考強(qiáng)制刪除 StatefulSet Pod。
當(dāng)創(chuàng)建了上面的 nginx 示例后,會(huì)按順序部署三個(gè) Pod,名字依次為 web-0、web- 1 和 web-2。web–1 在 web- 0 變?yōu)?Running and Ready 之后才會(huì)再部署,同理,web- 2 也會(huì)等 web- 1 變?yōu)?Running and Ready 狀態(tài)后才部署。如果在 web- 1 變?yōu)?Running and Ready 之后,但 web- 2 還沒有啟動(dòng)之前,此時(shí) web- 0 運(yùn)行失敗了,那么直到 web- 0 再次成功啟動(dòng)并變?yōu)?Running and Ready 之前,web- 2 都不會(huì)啟動(dòng)。
如果用戶希望改變上面例子中 Pod 的個(gè)數(shù),比如修改 replicas=1,那么 web- 2 首先被終止。直到 web- 2 完全被關(guān)閉和刪除后,web- 1 才會(huì)被終止。如果在 web- 2 被終止和完全關(guān)閉后,但 web- 1 還沒有被終止之前,此時(shí) web- 0 運(yùn)行出錯(cuò)了,那么直到 web- 0 再次變?yōu)?Running and Ready 狀態(tài)之后,web- 1 才會(huì)被終止。
以上是“Kubernetes 服務(wù)中 StatefulSets 有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道!