您好,登錄后才能下訂單哦!
這篇文章主要介紹了docker中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了。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“docker中stateful控制器怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。