(十四)Kubernetes資源管理StatefulSet
一、Kubernetes SatefulSet(有狀態應用部署)
Statefulset(有狀態集,縮寫為sts)常用於部署有狀態的且需要有序啟動的應用程式,比如在進行SpringCloud專案容器化時,Eureka的部署是比較適用StatefulSet部署方式的,可一個每個Eureka例項建立一個唯一且固定的識別符號,並且每個Eurkeka例項無需配置多餘的Service,其餘SpringCloud應用可以直接通過Eureka的Headless即可進行註冊。
Eurake的statefulset的資源名稱是eureka,eureka-0,eureka-1,eureka-2
Service是headless service,沒有Cluster IP, eureka-svc
Eureka-0.eureka-svc.NAMESPACE_NAME
1.1 部署有狀態應用
- 解決Pod獨立生命週期,保持Pod啟動順序和唯一性
- 穩定,唯一的網路識別符號,持久儲存
- 有序,優雅的部署和擴充套件、刪除和終止
- 有序,滾動更新
1.2 應用場景:資料庫
說明
常規的service
service:一組pod訪問策略,提供負載均衡和服務發現
其他:service 會分配一個 CLUSTER-IP 虛擬IP 使整個容器進行通訊。
headless service:無頭服務
headless service:與service類似,不同點在於clusterIP為None
需要部署一個dns伺服器
https://www.cnblogs.com/xiangsikai/p/11413970.html
1.3 案例
1、建立有狀態應用
vim sts.yaml 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: nginx-statefulset namespace: default spec: # 指定使用的service serviceName: nginx replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
2、建立容器
kubectl create -f sts.yaml
3、檢視建立容器以及service、通過dns名稱,保證每個固定的身份(pod/nginx-statefulset-x)標識。
kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
# statefulset-x 為身份標識
pod/nginx-statefulset-0 1/1 Running 0 16s
pod/nginx-statefulset-1 1/1 Running 0 13s
pod/nginx-statefulset-2 1/1 Running 0 10s
pod/sh-77649dbd59-ppfbx 1/1 Running 0 21m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 5d16h
service/nginx ClusterIP None <none> 80/TCP 26s
4、臨時啟動程式測試解析,通過dns解析唯一標識的容器
kubectl run --image=busybox:1.28.4 -it sh
/ # nslookup nginx-statefulset-0
Server: 10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local
nslookup: can't resolve 'nginx-statefulset-0'
如此可以比對出效果
StatefulSet與Deployment區別:有身份的!
身份三要素:
- 域名
- 主機名
- 儲存(PVC)
ClusterIP A記錄格式:<service-name>.<namespace-name>.svc.cluster.local
ClusterIP=None A記錄格式:<statefulsetName-index>.<service-name>.svc.cluster.local
示例:web-0.nginx.default.svc.cluster.local
二、statsfulset更新策略
建立從第一個開始,更新從最後一個開始,刪除也是從最後一個開始。
預設為:RollingUpdate #滾動式更新
OnDelete
Partition: 3 #只更新大於等3的pod,來實現簡單的灰度釋出。(statefulset實現分段更新)
三、statsfulset刪除策略
級聯刪除:kuebctl delete sts nginx(刪除statefulset同時刪除Pod)
非級聯刪除:kubectl delete sts nginx --cascade=false(刪除statefulset不刪除pod,此時Pod變成孤兒Pod,刪除之後惠被建立)