K8S有狀態服務-StatefulSet使用最佳實踐
介紹
StatefulSet是一種給Pod提供唯一標誌的控制器,它可以保證部署和擴充套件的順序。
Pod一致性:包含次序(啟動、停止次序)、網路一致性。此一致性與Pod相關,與被排程到哪個node節點無關。
穩定的次序:對於N個副本的StatefulSet,每個Pod都在[0,N)的範圍內分配一個數字序號,且是唯一的。
穩定的網路:Pod的hostname模式為$(statefulset名稱)-$(序號)。
穩定的儲存:通過VolumeClaimTemplate為每個Pod建立一個PV。刪除、減少副本,不會刪除相關的卷。
阿里云云盤支援動態掛載的功能,可以通過VolumeClaimTemplate方式部署statefulset應用。
部署Statefulset服務
volumeClaimTemplates:表示一類PVC的模板,系統會根據Statefulset配置的replicas數量,建立相應數量的PVC。這些PVC除了名字不一樣之外其他配置都是一樣的。
下面storageClassName配置為alicloud-disk-ssd,表示使用阿里雲SSD型別雲盤。
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: web
volumeMounts:
- name: disk-ssd
mountPath: /data
volumeClaimTemplates:
- metadata:
name: disk-ssd
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "alicloud-disk-ssd"
resources:
requests:
storage: 20Gi
驗證服務伸縮性
建立Statefulset服務:
# kubectl create -f statefulset.yaml
# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 21m
web-1 1/1 Running 0 20m
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
disk-ssd-web-0 Bound d-2ze9k2rrtcy92e97d3ie 20Gi RWO alicloud-disk-ssd 21m
disk-ssd-web-1 Bound d-2ze5dwq6gyjnvdcrmtwg 20Gi RWO alicloud-disk-ssd 21m
擴容服務到3個Pod,顯示會建立新的雲盤卷:
# kubectl scale sts web --replicas=3
statefulset.apps "web" scaled
# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 24m
web-1 1/1 Running 0 23m
web-2 1/1 Running 0 2m
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
disk-ssd-web-0 Bound d-2ze9k2rrtcy92e97d3ie 20Gi RWO alicloud-disk-ssd 24m
disk-ssd-web-1 Bound d-2ze5dwq6gyjnvdcrmtwg 20Gi RWO alicloud-disk-ssd 24m
disk-ssd-web-2 Bound d-2zea5iul9f4vgt82hxjj 20Gi RWO alicloud-disk-ssd 2m
縮容服務到2個Pod,顯示pvc/pv並不會一同刪除:
# kubectl scale sts web --replicas=2
statefulset.apps "web" scaled
# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 25m
web-1 1/1 Running 0 25m
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
disk-ssd-web-0 Bound d-2ze9k2rrtcy92e97d3ie 20Gi RWO alicloud-disk-ssd 25m
disk-ssd-web-1 Bound d-2ze5dwq6gyjnvdcrmtwg 20Gi RWO alicloud-disk-ssd 25m
disk-ssd-web-2 Bound d-2zea5iul9f4vgt82hxjj 20Gi RWO alicloud-disk-ssd 3m
再次擴容到3個Pod,新的pod會複用原來的PVC/PV:
# kubectl scale sts web --replicas=3
statefulset.apps "web" scaled
# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 27m
web-1 1/1 Running 0 27m
web-2 1/1 Running 0 2m
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
disk-ssd-web-0 Bound d-2ze9k2rrtcy92e97d3ie 20Gi RWO alicloud-disk-ssd 27m
disk-ssd-web-1 Bound d-2ze5dwq6gyjnvdcrmtwg 20Gi RWO alicloud-disk-ssd 27m
disk-ssd-web-2 Bound d-2zea5iul9f4vgt82hxjj 20Gi RWO alicloud-disk-ssd 5m
刪除StatefulSet服務,PVC、PV並不會隨著刪除;
驗證服務穩定性
刪除一個Pod前,Pod引用PVC:disk-ssd-web-1
# kubectl describe pod web-1 | grep ClaimName
ClaimName: disk-ssd-web-1
# kubectl delete pod web-1
pod "web-1" deleted
刪除Pod後,重新建立的Pod名字與刪除的一致,且使用同一個PVC:
# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 29m
web-1 1/1 Running 0 6s
web-2 1/1 Running 0 4m
# kubectl describe pod web-1 | grep ClaimName
ClaimName: disk-ssd-web-1
驗證服務高可用性
雲盤中建立臨時檔案:
# kubectl exec web-1 ls /data
lost+found
# kubectl exec web-1 touch /data/statefulset
# kubectl exec web-1 ls /data
lost+found
statefulset
刪除Pod,驗證資料永續性:
# kubectl delete pod web-1
pod "web-1" deleted
# kubectl exec web-1 ls /data
lost+found
statefulset
相關文章
- Kubernetes 實戰——有狀態應用(StatefulSet)
- 架構設計(五):有狀態服務和無狀態服務架構
- 從零開始入門 K8s | 有狀態應用編排 - StatefulSetK8S
- Super-Vuex 狀態管理最佳實踐Vue
- Dapr實現分散式有狀態服務的細節分散式
- Squirrel狀態機-從原理探究到最佳實踐UI
- k8s pod狀態有哪些K8S
- Go 單體服務開發最佳實踐Go
- Go單體服務開發最佳實踐Go
- Kubernetes 服務部署最佳實踐(二) ——如何提高服務可用性
- Elastic 使用Heartbeat監測服務執行狀態AST
- statefulset詳解及為何結合headless service部署有狀態應用
- Flutter 狀態管理實踐Flutter
- 客戶服務知識庫最佳實踐指南
- prometheus + consul 服務註冊+報警 最佳實踐Prometheus
- 揭祕有狀態服務上 Kubernetes 的核心技術
- Kubernetes學習筆記(九):StatefulSet--部署有狀態的多副本應用筆記
- 基於 swoole 的 websocket 服務實現狀態同步Web
- kubernetes實踐之四十二:StatefulSet
- Istio最佳實踐:在K8s上透過Istio服務網格進行灰度釋出K8S
- 使用聲網 SDK 構建 Piloteer 助盲服務平臺的最佳實踐
- Kubernetes(k8s)部署安全最佳實踐K8S
- 【flask】使用prometheus_client監控服務相關狀態FlaskPrometheusclient
- Kubernetes 微服務最佳實踐微服務
- 日誌服務 HarmonyOS NEXT 日誌採集最佳實踐
- 天翼云云主機上搭建FTP服務最佳實踐FTP
- 騰訊雲容器服務日誌採集最佳實踐
- 服務發現與配置管理高可用最佳實踐
- Node.js 服務連線 MongoDB 處理最佳實踐Node.jsMongoDB
- 在K8S中,Deployment和Statefulset有何區別?K8S
- 直播預告 | 容器服務 ACK 彈性預測最佳實踐
- 阿里巴巴 Dubbo Nacos 服務發現開發最佳實踐阿里
- 專案實戰:zabbix監控MySQL狀態、服務資訊MySql
- 微服務架構最佳實踐微服務架構
- .NET微服務最佳實踐 eShopOnContainers微服務AI
- #每日一記#前端與後端互動 資料狀態設計 最佳實踐前端後端
- 面向智算服務,構建可觀測體系最佳實踐
- Laravel頁面靜態化最佳實踐Laravel