PetSet—>StatefulSet
特点:
1、稳定且唯一的网络标识符
2、稳定且持久的存储
3、有序、平滑的部署和扩展
4、有序、平滑的删除和终止
5、有序的滚动更新
三个组件:headless,service,StatefulSet,volumeClaimTemplate
sts-pod示例:
[root@master sts]# cat sts-pod.yamlapiVersion: v1kind: Servicemetadata:name: myapplabels:app: myappspec:ports:- port: 80name: webclusterIP: Noneselector:app: myapp-pod---apiVersion: apps/v1kind: StatefulSetmetadata:name: myappspec:serviceName: myappreplicas: 3selector:matchLabels:app: myapp-podtemplate:metadata:labels:app: myapp-podspec:containers:- name: myappimage: ikubernetes/myapp:v1ports:- name: webcontainerPort: 80volumeMounts:- name: myappdatamountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: myappdataspec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 5Gi查看sts的pod[root@master sts]# kubectl get podNAME READY STATUS RESTARTS AGEmyapp-0 1/1 Running 0 38mmyapp-1 1/1 Running 0 38mmyapp-2 1/1 Running 0 38m查看pv[root@master sts]# kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpv001 5Gi RWO,RWX Retain Bound default/myappdata-myapp-1 2d18hpv002 5Gi RWO,RWX Retain Bound default/myappdata-myapp-2 2d18hpv003 5Gi RWO Retain Bound default/myappdata-myapp-0 2d18hpv004 8Gi RWX Retain Available 2d18hpv005 10Gi RWO,RWX Retain Available 2d18h查看pvc[root@master sts]# kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEmyappdata-myapp-0 Bound pv003 5Gi RWO 38mmyappdata-myapp-1 Bound pv001 5Gi RWO,RWX 38mmyappdata-myapp-2 Bound pv002 5Gi RWO,RWX 38m查看svc[root@master sts]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 56dmyapp ClusterIP None <none> 80/TCP 58s
扩展sts的pod
[root@master sts]# kubectl scale sts myapp --replicas=5statefulset.apps/myapp scaled[root@master sts]# kubectl get podNAME READY STATUS RESTARTS AGEmyapp-0 1/1 Running 0 50mmyapp-1 1/1 Running 0 50mmyapp-2 1/1 Running 0 50mmyapp-3 1/1 Running 0 11smyapp-4 0/1 Running 0 7s
缩容sts的pod
[root@master sts]# kubectl patch sts myapp -p '{"spec":{"replicas":3}}'statefulset.apps/myapp patchedYou have new mail in /var/spool/mail/root[root@master sts]# kubectl get podNAME READY STATUS RESTARTS AGEmyapp-0 1/1 Running 0 4m12smyapp-1 1/1 Running 0 4m8smyapp-2 1/1 Running 0 4m4smyapp-3 1/1 Running 0 3m16smyapp-4 0/1 Terminating 0 3m12s
升级版本
[root@master sts]# kubectl patch sts myapp -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":4}}}}'statefulset.apps/myapp patchedYou have new mail in /var/spool/mail/root[root@master sts]# kubectl describe sts myappName: myappNamespace: defaultCreationTimestamp: Mon, 21 Jun 2021 12:34:07 +0800Selector: app=myapp-podLabels: <none>Annotations: <none>Replicas: 3 desired | 3 totalUpdate Strategy: RollingUpdatePartition: 4 //分区的方式进行升级,默认为0,就是审计所有,此处改为4,大于等于4的才会升级,其余的不会升级Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 FailedPod Template:Labels: app=myapp-podContainers:myapp:Image: ikubernetes/myapp:v1Port: 80/TCPHost Port: 0/TCPEnvironment: <none>Mounts:/usr/share/nginx/html from myappdata (rw)Volumes: <none>Volume Claims:Name: myappdataStorageClass:Labels: <none>Annotations: <none>Capacity: 5GiAccess Modes: [ReadWriteOnce]Events:Type Reason Age From Message---- ------ ---- ---- -------Normal SuccessfulCreate 8m16s statefulset-controller create Claim myappdata-myapp-0 Pod myapp-0 in StatefulSet myapp successNormal SuccessfulCreate 8m16s statefulset-controller create Pod myapp-0 in StatefulSet myapp successfulNormal SuccessfulCreate 8m12s statefulset-controller create Claim myappdata-myapp-1 Pod myapp-1 in StatefulSet myapp successNormal SuccessfulCreate 8m12s statefulset-controller create Pod myapp-1 in StatefulSet myapp successfulNormal SuccessfulCreate 8m8s statefulset-controller create Claim myappdata-myapp-2 Pod myapp-2 in StatefulSet myapp successNormal SuccessfulCreate 8m8s statefulset-controller create Pod myapp-2 in StatefulSet myapp successfulNormal SuccessfulCreate 7m20s statefulset-controller create Claim myappdata-myapp-3 Pod myapp-3 in StatefulSet myapp successNormal SuccessfulCreate 7m20s statefulset-controller create Pod myapp-3 in StatefulSet myapp successfulNormal SuccessfulCreate 7m16s statefulset-controller create Claim myappdata-myapp-4 Pod myapp-4 in StatefulSet myapp successNormal SuccessfulCreate 7m16s statefulset-controller (combined from similar events): create Pod myapp-4 in StatefulSet myapp successfulNormal SuccessfulDelete 4m15s statefulset-controller delete Pod myapp-4 in StatefulSet myapp successfulNormal SuccessfulDelete 3m37s statefulset-controller delete Pod myapp-3 in StatefulSet myapp successful升级镜像版本到v2[root@master sts]# kubectl set image sts myapp myapp=ikubernetes/myapp:v2[root@master sts]# kubectl get podsNAME READY STATUS RESTARTS AGEmyapp-0 1/1 Running 0 16mmyapp-1 1/1 Running 0 16mmyapp-2 1/1 Running 0 16mmyapp-3 1/1 Running 0 79smyapp-4 1/1 Running 0 77s[root@master sts]# kubectl get pods myapp-4 -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESmyapp-4 1/1 Running 0 91s 10.244.140.117 node02 <none> <none>[root@master sts]# kubectl get pods myapp-4 -o yaml #会发现只有myapp-4升级到了v2,其余的pod版本还是v1,想要升级其余pod,需要将partition的值改为0
