StatefulSet是控制器的一種,可以創建獨特身份的POD。它提供有序的部署和伸縮。
使用statefulset
使用限制
組成部分
pod身份識別
保證部署和伸縮
使用statefulset
statefulset對以下應用是有價值的。
穩定、唯一的網絡訪問地址
穩定、持久的存儲
有序、優雅的部署和伸縮
有序。優雅的刪除和終止
上述描述中,穩定等同于在POD再次調度之后可以持久。如果應用不需要穩定的認證或有序的部署、刪除、伸縮,你可以使用無狀態的副本(例如Deployment或ReplicaSet)來部署你的應用,這將更適合無狀態應用。
使用限制
Statefulset目前為bate版本,在1.5之前在任何發布版中都不可用
類似所有alpha/beta資源,你可以通過apiserver參數--runtime-config禁用Statefulset
POD使用的持久化存儲可以是基于storage class的動態卷,也可以是預先管理員分配的
刪除或縮減Statefulset不會刪除分配的volumes。這是為了確保數據安全,數據比自動清除與statefulset關聯的資源更重要
Statefulset當前需要一個Headless Service提供網絡訪問地址
目前需要手動完成更新存在Statefulset
組成部分
下面的示例描述Statefulset的組件。
一個名為nginx的Headless Service,用于控制網絡訪問
名為web的Statefulset,啟動三個副本POD
volumeClaimTemplates將提供持久化存儲
--- 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: webspec: serviceName: "nginx" replicas: 3 template: metadata: labels: app: nginx spec: terminationGracePeriodSeconds: 10 containers: - name: nginx p_w_picpath: 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有一個獨特的身份識別,由一個序號、一個穩定的網絡身份和穩定的存儲。身份綁定POD,不管POD被調度到哪個節點上。
1)序號索引
Statefulset有N個實例,每個POD將被分配一個唯一的整數序號,范圍在[1,N]。
2)穩定的網絡ID
StatefulSet的每個POD的名稱是由StatefulSet的名稱和Pod序號組成。POD名稱的格式為$(statefulset name)-$(ordinal)。上述示例中創建的POD名稱為web-0,web-1,web-2。statefulset使用Headless Service控制POD的域名。service域名的格式為$(service name).$(namespace).svc.cluster.local,cluster.local為cluster domain。每個POD創建后會有一個匹配的域名,格式為$(podname).$(service_domain)。下表為示例,描述cluster domain、service name和statefulset name如何相互作用。
Cluster Domain Service (ns/name) StatefulSet (ns/name) StatefulSet Domain Pod DNS Pod Hostname
cluster.local default/nginx default/web nginx.default.svc.cluster.local web-{0..N-1}.nginx.default.svc.cluster.local web-{0..N-1}
cluster.local foo/nginx foo/web nginx.foo.svc.cluster.local web-{0..N-1}.nginx.foo.svc.cluster.local web-{0..N-1}
kube.local foo/nginx foo/web nginx.foo.svc.kube.local web-{0..N-1}.nginx.foo.svc.kube.local web-{0..N-1}
3)穩定的存儲
kubernetes為每一個VolumeClaimTemplate創建一個PV。在上述nginx的示例中,每一個POD將獲得一個大小為1G的PV。當POD被調度到一個節點上的時候,volumeMounts將通過與之綁定的PVC掛載PV。
說明:與PVC綁定的PV不會因POD或statefulset刪除而刪除,需要手動執行刪除。
保證部署和伸縮
對于statefulset的N個副本,當POD被部署,它們將是有序的,[0..N-1]
當POD被刪除,它們將按反向的順序終止,先終止N-1的POD
在伸縮操作應用到POD之前,必須保證之前所有POD的狀態是running且ready。
在POD被終止之前,所有當前序號之后的POD必須完全關閉
StatefulSet不應該指定pod.Spec.TerminationGracePeriodSeconds為0。這種做法是不安全的,強烈勸阻。為進一步解釋,請參閱強制刪除StatefulSet POD。
上面的nginx例子創建后,三個POD將按web-0 web-1 web-2順序部署。web-1不會在web-0 running并ready之前部署,web-2直到web-1處于running并ready狀態后才會開始部署。web-1 running且ready之后,但web-2還未啟動,此時如果web-0故障,web-2將不會被啟動,直到web-0成功被重啟并達到running且ready的狀態。
如果一個用戶修改已部署的statefulset,例如replicas=1,web-2會先被終止。web-1將不會終止,直到web-2完全關閉和刪除。web-2已經終止并完全關閉,但在web-1終止前,此時如果web-0故障,web-1將不會被終止,直到web-0處于running且ready的狀態。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。