Pod控制器詳解(StatefulSet)
StatefulSet(有狀態)
概述
無狀態應用:
認為Pod都是一樣的。
沒有順序要求。
不用考慮在哪個Node節點上運行。
隨意進行伸縮和擴展。
有狀態應用:
有順序的要求。
認為每個Pod都是不一樣的。
需要考慮在哪個Node節點上運行。
需要按照順序進行伸縮和擴展。
讓每個Pod都是獨立的,保持Pod啟動順序和唯一性。
StatefulSet是Kubernetes提供的管理有狀態應用的負載管理控制器。
StatefulSet部署需要HeadLinessService(無頭服務)
為什么需要HeadLinessService(無頭服務)?
在用Deployment時,每一個Pod名稱是沒有順序的,是隨機字符串,因此是Pod名稱是無序的,但是在StatefulSet中要求必須是有序 ,每一個Pod不能被隨意取代,Pod重建后pod名稱還是一樣的。
而Pod IP是變化的,所以是以Pod名稱來識別。Pod名稱是Pod唯一性的標識符,必須持久穩定有效。這時候要用到無頭服務,它可以給每個Pod一個唯一的名稱 。
StatefulSet常用來部署RabbitMQ集群、Zookeeper集群、MySQL集群、Eureka集群等。
創建StatefulSet
創建pc-stateful.yaml文件,內容如下
apiVersion: v1 kind: Service metadata: name: service-headliness namespace: dev spec: selector: app: nginx-pod clusterIP: None # 將clusterIP設置為None,即可創建headliness Service type: ClusterIP ports: - port: 80 # Service的端口 targetPort: 80 # Pod的端口 --- apiVersion: apps/v1 kind: StatefulSet metadata: name: pc-statefulset namespace: dev spec: replicas: 3 serviceName: service-headliness selector: matchLabels: app: nginx-pod template: metadata: labels: app: nginx-pod spec: containers: - name: nginx image: nginx:1.17.1 ports: - containerPort: 80
創建StatefulSet
[root@master ~]# vim pc-stateful.yaml [root@master ~]# kubectl create -f pc-stateful.yaml [root@master ~]# kubectl get statefulset pc-statefulset -n dev -o wide [root@master ~]# kubectl get pod -n dev -o wide [root@master ~]# kubectl get svc -n dev [root@master ~]# kubectl delete -f pc-stateful.yaml

Deployment和StatefulSet的區別
Deployment和StatefulSet的區別:Deployment沒有唯一標識而StatefulSet有唯一標識。 StatefulSet的唯一標識是根據主機名+一定規則生成的。 StatefulSet的唯一標識是主機名.無頭Service名稱.命名空間.svc.cluster.local。
StatefulSet的金絲雀發布
StatefulSet支持兩種更新策略:OnDelete和RollingUpdate(默認),其中OnDelete表示刪除之后才更新,RollingUpdate表示滾動更新。
updateStrategy: rollingUpdate: # 如果更新的策略是OnDelete,那么rollingUpdate就失效 partition: 2 # 表示從第2個分區開始更新,默認是0 type: RollingUpdate /OnDelete # 滾動更新
示例:pc-statefulset.yaml
apiVersion: v1 kind: Service metadata: name: service-headliness namespace: dev spec: selector: app: nginx-pod clusterIP: None # 將clusterIP設置為None,即可創建headliness Service type: ClusterIP ports: - port: 80 # Service的端口 targetPort: 80 # Pod的端口 --- apiVersion: apps/v1 kind: StatefulSet metadata: name: pc-statefulset namespace: dev spec: replicas: 3 serviceName: service-headliness selector: matchLabels: app: nginx-pod template: metadata: labels: app: nginx-pod spec: containers: - name: nginx image: nginx:1.17.1 ports: - containerPort: 80 updateStrategy: rollingUpdate: partition: 0 type: RollingUpdate
參考
黑馬B站k8s課程https://www.bilibili.com/video/BV1Qv41167ck/
https://gitee.com/yooome/golang/blob/main/k8s%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B-%E8%B0%83%E6%95%B4%E7%89%88/k8s%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B.md
https://www.yuque.com/fairy-era/yg511q/xyqxge
浙公網安備 33010602011771號