K8S之StatefulSet摘要
概述
RC、Deployment、DaemonSetStatefulSet都是面向無狀態(tài)的服務,它們所管理的Pod的IP、名字,啟停順序等都是隨機的,而StatefulSet是什么?顧名思義,有狀態(tài)應用的集合,管理所有有狀態(tài)的服務,比如MySQL、MongoDB集群等。
StatefulSet本質(zhì)上是Deployment的一種變體,它是為了解決有狀態(tài)服務的問題,它所管理的Pod擁有固定的Pod名稱,啟停順序,在StatefulSet中,Pod名字稱為網(wǎng)絡標識,還必須要用到共享存儲,在v1.9版本中已成為GA版本。
在Deployment中,與之對應的服務是service,而在StatefulSet中與之對應的headless service,headless service,即無頭服務,與service的區(qū)別就是它沒有Cluster IP,解析它的名稱時將返回該Headless Service對應的全部Pod的Endpoint列表。
除此之外,StatefulSet在Headless Service的基礎上又為StatefulSet控制的每個Pod副本創(chuàng)建了一個DNS域名,這個域名的格式為:
$(podname).(headless?server?name)??? FQDN:?$(podname).(headless?server?name).namespace.svc.cluster.local
StatefulSet示例
接下來看一些示例,演示下上面所說的特性,以加深理解。
apiVersion:?v1 kind:?Service metadata: ??name:?nginx ??labels: ????app:?nginx spec: ??ports: ??-?port:?80 ????name:?web ??clusterIP:?None ??selector: ????app:?nginx --- apiVersion:?apps/v1 kind:?StatefulSet metadata: ??name:?web spec: ??selector: ????matchLabels: ??????app:?nginx?#?has?to?match?.spec.template.metadata.labels ??serviceName:?"nginx"??#聲明它屬于哪個Headless?Service. ??replicas:?3?#?by?default?is?1 ??template: ????metadata: ??????labels: ????????app:?nginx?#?has?to?match?.spec.selector.matchLabels ????spec: ??????terminationGracePeriodSeconds:?10 ??????containers: ??????-?name:?nginx ????????image:?k8s.gcr.io/nginx-slim:0.8 ????????ports: ????????-?containerPort:?80 ??????????name:?web ????????volumeMounts: ????????-?name:?www ??????????mountPath:?/usr/share/nginx/html ??volumeClaimTemplates:???#可看作pvc的模板 ??-?metadata: ??????name:?www ????spec: ??????accessModes:?[?"ReadWriteOnce"?] ??????storageClassName:?"gluster-heketi"??#存儲類名,改為集群中已存在的 ??????resources: ????????requests: ??????????storage:?1Gi
通過該配置文件,可看出StatefulSet的組成部分:
Headless Service,名為nginx,用來定義Pod網(wǎng)絡標識( DNS domain)。
StatefulSet,定義具體應的,名為Nginx,有三個Pod副本,并為每個Pod定義了一個域名。
volumeClaimTemplates,名為www,pvc模板,指定pvc名稱大小,將自動創(chuàng)建pvc,且pvc必須由存儲類供應。
$?kubectl?create?-f?nginx.yaml? service?"nginx"?created statefulset?"web"?created
看下這三個Pod創(chuàng)建過程:
#第一個是創(chuàng)建web-0 $?kubectl?get?pod web-0?????????????????????1/1???????ContainerCreating???0??????????51s #待web-0?running且ready時,創(chuàng)建web-1 $?kubectl?get?pod web-0?????????????????????1/1???????Running?????????????0??????????51s web-1?????????????????????0/1???????ContainerCreating???0??????????42s #待web-1?running且ready時,啟動web-2 $?kubectl?get?pod web-0?????????????????????1/1???????Running?????????????0??????????1m web-1?????????????????????1/1???????Running?????????????0??????????45s web-2?????????????????????1/1???????ContainerCreating???0??????????36s #最后三個Pod全部running且ready $?kubectl?get?pod NAME??????????????????????READY?????STATUS????RESTARTS???AGE web-0?????????????????????1/1???????Running???0??????????4m web-1?????????????????????1/1???????Running???0??????????3m web-2?????????????????????1/1???????Running???0??????????1m
Statefulset 名稱:web 三個副本
創(chuàng)建出來的Pod: web-0,web-1,web-2
volumeClaimTemplates名稱為:www,那么自動創(chuàng)建出來的PVC名稱為www-web[0-2],為每個Pod創(chuàng)建一個PVC。
#根據(jù)volumeClaimTemplates自動創(chuàng)建的PVC? ?$?kubectl?get?pvc NAME??????????????STATUS????VOLUME??????????????????????????????????CAPACITY???ACCESS?MODES???STORAGECLASS?????AGE www-web-0?????????Bound?????pvc-ecf003f3-828d-11e8-8815-000c29774d39???2G????????RWO??????????gluster-heketi???7m www-web-1?????????Bound?????pvc-0615e33e-828e-11e8-8815-000c29774d39???2G????????RWO??????????gluster-heketi???6m www-web-2?????????Bound?????pvc-43a97acf-828e-11e8-8815-000c29774d39???2G????????RWO??????????gluster-heketi???4m
概率總結(jié)
Statefulset的啟動順序:
匹配Pod name(網(wǎng)絡標識)的模式為:$(statefulset名稱)-$(序號),比如上面的示例:web-0,web-1,web-2。
StatefulSet為每個Pod副本創(chuàng)建了一個DNS域名,這個域名的格式為: $(podname).(headless server name)
StatefulSet使用Headless服務來控制Pod的域名,這個域名的FQDN為:$(service name).$(namespace).svc.cluster.local,其中,“cluster.local”指的是集群的域名。
根據(jù)volumeClaimTemplates,為每個Pod創(chuàng)建一個pvc,pvc匹配模式為:(volume_name)-(pod_name),如上面的volumeMounts.name=www, Pod name=web-[0-2],因此創(chuàng)建出來的PVC是www-web-0、www-web-1、www-web-2。
刪除Pod不會刪除其pvc,刪除pvc將自動釋放pv。
通常上面的示例發(fā)現(xiàn):
有序部署:部署StatefulSet時,如果有多個Pod副本,它們會被順序地創(chuàng)建(從0到N-1)。
有序刪除:當Pod被刪除時,它們被終止的順序是從N-1到0。
有序擴展:當對Pod執(zhí)行擴展操作時,與部署一樣,它前面的Pod必須都處于Running和Ready狀態(tài)。
Statefulset Pod管理策略:
在v1.7以后,通過允許修改Pod排序策略,同時通過.spec.podManagementPolicy字段確保其身份的唯一性。
OrderedReady:?上述的啟停順序,默認設置。
Parallel:?告訴StatefulSet控制器并行啟動或終止所有Pod,并且在啟動或終止另一個Pod之前不等待前一個Pod變?yōu)镽unning and Ready或完全終止。
更新策略
在Kubernetes 1.7及更高版本中,通過.spec.updateStrategy字段允許配置或禁用Pod、labels、esource request/limits、annotations自動滾動更新功能。
OnDelete:通過.spec.updateStrategy.type 字段設置為OnDelete,StatefulSet控制器不會自動更新StatefulSet中的Pod。用戶必須手動刪除Pod,以使控制器創(chuàng)建新的Pod
RollingUpdate:通過.spec.updateStrategy.type 字段設置為RollingUpdate,實現(xiàn)了Pod的自動滾動更新,如果.spec.updateStrategy未指定,則此為默認策略。
StatefulSet控制器將刪除并重新創(chuàng)建StatefulSet中的每個Pod。它將以Pod終止(從最大序數(shù)到最小序數(shù))的順序進行,一次更新每個Pod。在更新下一個Pod之前,必須等待這個Pod Running and Ready。
Partitions:通過指定 .spec.updateStrategy.rollingUpdate.partition 來對 RollingUpdate 更新策略進行分區(qū),如果指定了分區(qū),則當 StatefulSet 的 .spec.template 更新時,具有大于或等于分區(qū)序數(shù)的所有 Pod 將被更新。
具有小于分區(qū)的序數(shù)的所有 Pod 將不會被更新,即使刪除它們也將被重新創(chuàng)建。如果 StatefulSet 的 .spec.updateStrategy.rollingUpdate.partition 大于其 .spec.replicas,則其 .spec.template 的更新將不會傳播到 Pod。
云計算 K8S
版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。
版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。