溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Kubernetes服務(wù)中StatefulSets有什么用

發(fā)布時間:2021-11-19 11:03:14 來源:億速云 閱讀:144 作者:小新 欄目:云計算

小編給大家分享一下Kubernetes服務(wù)中StatefulSets有什么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

StatefulSets在v1.5時還是個beta特性,它取代了v1.4的PetSets特性。PetSets的用戶可以參考v1.5的升級指導(dǎo),將正在運(yùn)行的PeetSets升級到StatefulSets。
  StatefulSet是一個給Pod提供唯一標(biāo)志的控制器,它可以保證部署和擴(kuò)展的順序。

使用StatefulSet

  當(dāng)應(yīng)用有以下任意要求時,StatefulSet的價值就體現(xiàn)出來了。
   ● 穩(wěn)定的、唯一的網(wǎng)絡(luò)標(biāo)識。
   ● 穩(wěn)定的、持久化的存儲。
   ● 有序的、優(yōu)雅的部署和擴(kuò)展。
   ● 有序的、優(yōu)雅的刪除和停止。
  上面提到的點(diǎn)中,在Pod調(diào)度時,穩(wěn)定性和持久化是同一個意思。如果一個應(yīng)用不需要任何穩(wěn)定的標(biāo)識或順序的部署、刪除和擴(kuò)展,那么你應(yīng)該使用提供無狀態(tài)備份的控制器來部署你的應(yīng)用。諸如Deployment或者ReplicaSet可能更適合你的無狀態(tài)服務(wù)需求。

限制

   ● StatefulSet還是beta版本,Kubernetes v1.5之前不可用。
   ● 和所有的alpha/beta資源一樣,可以將--runtime-config選項傳遞給apiserver,來禁止StatefulSet。
   ● 給定Pod的存儲必須是:基于請求存儲等級(Storage Class)的PersistentVolume Provisioner,或者是由管理員預(yù)先配置。
   ● 刪除和(或)減少StatefulSet副本,不會刪除StatefulSet相關(guān)的卷。這樣做是為了保證數(shù)據(jù)安全,比自動的清除StatefulSet相關(guān)資源更有價值。    ● 當(dāng)前StatefulSet需要Headless服務(wù)來負(fù)責(zé)Pod的網(wǎng)絡(luò)一致性。你需要創(chuàng)建該服務(wù)。
   ● 當(dāng)前,更新已經(jīng)存在的StatefulSet需要手動執(zhí)行。

組件

  下面的示例演示了StatefulSet的組件。
   ● 一個Headless服務(wù),名為nginx,用來控制網(wǎng)絡(luò)域。
   ● StatefulSet,名為web,在同一個Pod中起3個nginx容器的副本。
   ● volumeClaimTemplates使用PV供應(yīng)商的PV來提供穩(wěn)定的存儲。

---
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有著唯一的一致性,該一致性包含次序(啟動和停止次序)、穩(wěn)定的網(wǎng)絡(luò)一致性,和穩(wěn)定的網(wǎng)絡(luò)。該一致性和Pod緊密相關(guān),無論P(yáng)od被調(diào)度到哪個node節(jié)點(diǎn)上。

次序索引

  對于有N個副本的StatefulSet,StatefulSet的每個Pod都被分配了一個數(shù)字序號,序號在[0,N)的范圍內(nèi),并且在Set中是唯一的。

穩(wěn)定的網(wǎng)絡(luò)ID

  StatefulSet中每個Pod都從StatefulSet的名稱和Pod的序號派生其主機(jī)名。組成的hostname的模式為$(statefulset名稱)-$(序號)。上面的例子會創(chuàng)建名為web-0,web-1,web-2。StatefulSet可以以使用Headless服務(wù)來控制Pod的域,這個域使用的格式為:$(service name).$(namespace).svc.cluster.local,其中,“cluster.local”指的是集群域。Pod被創(chuàng)建后,每個Pod都會得到一個匹配的DNS子域,格式為$(podname).$(governing service domain),其中的“governing service”是在StatefulSet中通過serviceName字段來定義的。
  這里有幾個示例,可以展示StatefulSet的Pod的DNS組成。

Cluster DomainService (ns/name)StatefulSet (ns/name)StatefulSet DomainPod DNSPod Hostname
cluster.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}
  注意:除非另外的配置,集群域就會被設(shè)置為cluster.local。




穩(wěn)定的存儲

  Kubernetes為每個VolumeClaimTemplate創(chuàng)建一個PV。在上面的nginx例子中,每個Pod會得到一個PV,該P(yáng)V的存儲等級(storagee class)為anything,大小為1Gb。當(dāng)Pod被調(diào)度到其他node節(jié)點(diǎn)上時,volumeMounts會重新映射對應(yīng)的PVC。注意,當(dāng)Pod或者StatefulSet被刪除時,對應(yīng)的PV和PVC不會被刪除,這個刪除操作必須手動來執(zhí)行。

部署和擴(kuò)展

   ● 對于擁有N個拷貝的StatefulSet,當(dāng)部署Pod時,它們會被順序地創(chuàng)建(從0到N-1)。
   ● 當(dāng)Pod被刪除時,它們被終止的順序是從N-1到0。
   ● 當(dāng)對Pod執(zhí)行擴(kuò)展操作時,它前面的Pod必須都處于Running和Ready狀態(tài)。
   ● 當(dāng)Pod被終止時,它所有的successors都必須被完全地關(guān)閉。
  不應(yīng)該將StatefulSet的pod.Spec.TerminationGracePeriodSeconds值設(shè)置為0,因為該操作不安全,強(qiáng)烈不建議使用。若需要更深層次的解釋,請參考強(qiáng)制刪除StatefulSet Pod。
  當(dāng)創(chuàng)建了上面的nginx示例后,會按順序部署三個Pod,名字依次為web-0、web-1和web-2。web--1在web-0變?yōu)镽unning and Ready之后才會再部署,同理,web-2也會等web-1變?yōu)镽unning and Ready狀態(tài)后才部署。如果在web-1變?yōu)镽unning and Ready之后,但web-2還沒有啟動之前,此時web-0運(yùn)行失敗了,那么直到web-0再次成功啟動并變?yōu)镽unning and Ready之前,web-2都不會啟動。
  如果用戶希望改變上面例子中Pod的個數(shù),比如修改replicas=1,那么web-2首先被終止。直到web-2完全被關(guān)閉和刪除后,web-1才會被終止。如果在web-2被終止和完全關(guān)閉后,但web-1還沒有被終止之前,此時web-0運(yùn)行出錯了,那么直到web-0再次變?yōu)镽unning and Ready狀態(tài)之后,web-1才會被終止。

以上是“Kubernetes服務(wù)中StatefulSets有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI