docker筆記28-stateful(有狀態應用副本集)控制器
在應用程式中,可以分為有狀態應用和無狀態應用。
無狀態的應用更關注於群體,任何一個成員都可以被取代。
對有狀態的應用是關注個體。
像我們前面用deployment控制器管理的nginx、myapp等都屬於無狀態應用。
像mysql、redis,zookeeper等都屬於有狀態應用,他們有的還有主從之分、先後順序之分。
statefulset控制器能實現有狀態應用的管理,但實現起來也是非常麻煩的。需要把我們運維管理的過程寫入指令碼並注入到statefulset中才能使用。雖然網際網路上有人做好了stateful的指令碼,但是還是建議大家不要輕易的把redis、mysql等這樣有狀態的應用遷移到k8s上。
在k8s中,statefulset主要管理一下特效的應用:
a)、每一個Pod穩定且有唯一的網路識別符號;
b)、穩定且持久的儲存裝置;
c)、要求有序、平滑的部署和擴充套件;
d)、要求有序、平滑的終止和刪除;
e)、有序的滾動更新,應該先更新從節點,再更新主節點;
statefulset由三個元件組成:
a) headless service(無頭的服務,即沒名字);
b)statefulset控制器
c)volumeClaimTemplate(儲存卷申請模板,因為每個pod要有專用儲存卷,而不能共用儲存卷)
[root@master ~]# kubectl explain sts #stateful的簡稱
[root@master stateful]# cat stateful-demo.yaml apiVersion: v1 kind: Service metadata: name: myapp-svc labels: app: myapp-svc spec: ports: - port: 80 name: web clusterIP: None selector: app: myapp-pod --- apiVersion: apps/v1 kind: StatefulSet metadata: name: myapp spec: serviceName: myapp-svc replicas: 2 selector: matchLabels: app: myapp-pod template: metadata: labels: app: myapp-pod spec: containers: - name: myapp image: ikubernetes/myapp:v1 ports: - containerPort: 80 name: web volumeMounts: - name: myappdata mountPath: /usr/share/nginx/html volumeClaimTemplates: #儲存卷申請模板,可以為每個pod定義volume;可以為pod所在的名稱空間自動建立pvc。 - metadata: name: myappdata spec: accessModes: ["ReadWriteOnce"] #storageClassName: "gluster-dynamic" resources: requests: storage: 5Gi #2G的pvc
[root@master stateful]# kubectl apply -f stateful-demo.yaml service/myapp-svc unchanged statefulset.apps/myapp created
[root@master stateful]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE myapp-svc ClusterIP None <none> 80/TCP 12m
看到myapp-svc是無頭服務。
[root@master stateful]# kubectl get sts NAME DESIRED CURRENT AGE myapp 2 2 6m
[root@master stateful]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE myappdata-myapp-0 Bound pv002 2Gi RWO 3s myappdata-myapp-1 Bound pv003 1Gi RWO,RWX 1s
[root@master stateful]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv001 1Gi RWO,RWX Retain Available 1d pv002 2Gi RWO Retain Bound default/myappdata-myapp-0 1d pv003 1Gi RWO,RWX Retain Bound default/myappdata-myapp-1 1d pv004 1Gi RWO,RWX Retain Bound default/mypvc 1d pv005 1Gi RWO,RWX Retain Available
[root@master stateful]# kubectl get pods NAME READY STATUS RESTARTS AGE myapp-0 1/1 Running 0 4m myapp-1 1/1 Running 0 4m
[root@master stateful]# kubectl delete -f stateful-demo.yaml service "myapp-svc" deleted statefulset.apps "myapp" deleted
上面刪除會使pod和service刪除,但是pvc是不會刪除,所以還能恢復。
[root@master stateful]# kubectl exec -it myapp-0 -- /bin/sh / # nslookup myapp-0.myapp-svc.default.svc.cluster.local nslookup: can't resolve '(null)': Name does not resolve Name: myapp-0.myapp-svc.default.svc.cluster.local Address 1: 10.244.1.110 myapp-0.myapp-svc.default.svc.cluster.local / # / # / # nslookup myapp-1.myapp-svc.default.svc.cluster.local nslookup: can't resolve '(null)': Name does not resolve Name: myapp-1.myapp-svc.default.svc.cluster.local Address 1: 10.244.2.97 myapp-1.myapp-svc.default.svc.cluster.local
myapp-0.myapp-svc.default.svc.cluster.local
格式為:pod_name.service_name.namespace.svc.cluster.local
下面擴充套件myapp pod為5個:
[root@master stateful]# kubectl scale sts myapp --replicas=5 statefulset.apps/myapp scaled
[root@master stateful]# kubectl get pods NAME READY STATUS RESTARTS AGE client 0/1 Error 0 17d myapp-0 1/1 Running 0 37m myapp-1 1/1 Running 0 37m myapp-2 1/1 Running 0 46s myapp-3 1/1 Running 0 43s myapp-4 0/1 Pending 0 41s
[root@master stateful]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE myappdata-myapp-0 Bound pv002 2Gi RWO 52m myappdata-myapp-1 Bound pv003 1Gi RWO,RWX 52m myappdata-myapp-2 Bound pv005 1Gi RWO,RWX 2m myappdata-myapp-3 Bound pv001 1Gi RWO,RWX 2m myappdata-myapp-4 Pending 2m
另外也可以用patch打補丁的方法來進行擴容和縮容:
[root@master stateful]# kubectl patch sts myapp -p '{"spec":{"replicas":2 statefulset.apps/myapp patched
下面我們再來介紹一下滾動更新。
[root@master stateful]# kubectl explain sts.spec.updateStrategy.rollingUpdate
假設有4個pod(pod0,pod1,pod2,pod3),如果設定partition為5,那麼說明大於等於5的pod更新,我們四個Pod就都不更新;如果partition為4,那麼說明大於等於4的pod更新,即pod3更新,其他pod都不更新;如果partiton為3,那麼說明大於等於3的pod更新,那麼就是pod2和pod3更新,其他pod都不更新。
[root@master stateful]# kubectl patch sts myapp -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":4}}}}' statefulset.apps/myapp patched
[root@master stateful]# kubectl describe sts myapp Update Strategy: RollingUpdate Partition: 4
下面把myapp升級為v2版本
[root@master stateful]# kubectl set image sts/myapp myapp=ikubernetes/myapp:v2 statefulset.apps/myapp image updated
[root@master ~]# kubectl get sts -o wide NAME DESIRED CURRENT AGE CONTAINERS IMAGES myapp 2 2 1h myapp ikubernetes/myapp:v2
[root@master ~]# kubectl get pods myapp-4 -o yaml containerStatuses: - containerID: docker://898714f2e5bf4f642e2a908e7da67eebf6d3074c89bbd0d798d191a2061a3115 image: ikubernetes/myapp:v2
可以看到pod myapp-4使用的模板版本是v2了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28916011/viewspace-2215046/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 十速微控制器應用筆記筆記
- Kubernetes學習筆記(九):StatefulSet--部署有狀態的多副本應用筆記
- docker筆記24-pod控制器Docker筆記
- Kubernetes有狀態應用管理——PetSet
- mongodb 4.0副本集搭建MongoDB
- MongoDB 6.0.3副本集搭建MongoDB
- SAP BSP應用有狀態和無狀態行為差異比較
- Kubernetes 實戰——有狀態應用(StatefulSet)
- SPA-3~shell控制器下錨已經應用狀態管理
- 主用ATC系統執行狀態筆記(一)筆記
- React學習筆記-State(狀態)React筆記
- MongoDB日常運維-04副本集搭建MongoDB運維
- Javascript 設計模式系統講解與應用——學習筆記10-狀態模式JavaScript設計模式筆記
- ASP.NET2.0揭祕讀書筆記五——維護應用程式狀態之cookieASP.NET筆記Cookie
- 探索FSM (有限狀態機)應用
- docker學習筆記(4)- 應用資料管理(容器外)Docker筆記
- 有狀態和無狀態的區別
- Mongodb3.0.5副本集搭建及spring和java連線副本集配置MongoDBSpringJava
- MongoDB 4.2副本集新增/刪除副本(一主一副一仲裁)MongoDB
- MongoDB 副本集的原理、搭建、應用MongoDB
- ASP.NET Core 應用程式狀態ASP.NET
- Java應用異常狀態監測Java
- 最全的HTTP響應狀態碼列表:除了404,HTTP狀態碼還有啥?HTTP
- docker - 生命週期和狀態Docker
- 筆記:Docker筆記Docker
- Docker筆記Docker筆記
- docker 筆記Docker筆記
- 什麼時候用有狀態session bean,什麼時候用無狀態session bean (轉)SessionBean
- MongoDB日常運維-05副本集故障切換MongoDB運維
- 設計模式學習筆記之狀態模式設計模式筆記
- MongoDB 4.2副本集自動故障轉移(一主一副一仲裁)MongoDB
- statefulset詳解及為何結合headless service部署有狀態應用
- 使用 Provider 管理 Flutter 應用狀態 (下)IDEFlutter
- 使用 Provider 管理 Flutter 應用狀態 (上)IDEFlutter
- [譯] Flutter 中的原生應用程式狀態Flutter
- 32. http狀態碼 應用場景HTTP
- 使用NAS動態儲存卷建立有狀態應用
- ChartDirector應用筆記(一)筆記