PetSet—>StatefulSet
特点:
1、稳定且唯一的网络标识符
2、稳定且持久的存储
3、有序、平滑的部署和扩展
4、有序、平滑的删除和终止
5、有序的滚动更新
三个组件:headless,service,StatefulSet,volumeClaimTemplate

sts-pod示例:

  1. [root@master sts]# cat sts-pod.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: myapp
  6. labels:
  7. app: myapp
  8. spec:
  9. ports:
  10. - port: 80
  11. name: web
  12. clusterIP: None
  13. selector:
  14. app: myapp-pod
  15. ---
  16. apiVersion: apps/v1
  17. kind: StatefulSet
  18. metadata:
  19. name: myapp
  20. spec:
  21. serviceName: myapp
  22. replicas: 3
  23. selector:
  24. matchLabels:
  25. app: myapp-pod
  26. template:
  27. metadata:
  28. labels:
  29. app: myapp-pod
  30. spec:
  31. containers:
  32. - name: myapp
  33. image: ikubernetes/myapp:v1
  34. ports:
  35. - name: web
  36. containerPort: 80
  37. volumeMounts:
  38. - name: myappdata
  39. mountPath: /usr/share/nginx/html
  40. volumeClaimTemplates:
  41. - metadata:
  42. name: myappdata
  43. spec:
  44. accessModes: ["ReadWriteOnce"]
  45. resources:
  46. requests:
  47. storage: 5Gi
  48. 查看stspod
  49. [root@master sts]# kubectl get pod
  50. NAME READY STATUS RESTARTS AGE
  51. myapp-0 1/1 Running 0 38m
  52. myapp-1 1/1 Running 0 38m
  53. myapp-2 1/1 Running 0 38m
  54. 查看pv
  55. [root@master sts]# kubectl get pv
  56. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  57. pv001 5Gi RWO,RWX Retain Bound default/myappdata-myapp-1 2d18h
  58. pv002 5Gi RWO,RWX Retain Bound default/myappdata-myapp-2 2d18h
  59. pv003 5Gi RWO Retain Bound default/myappdata-myapp-0 2d18h
  60. pv004 8Gi RWX Retain Available 2d18h
  61. pv005 10Gi RWO,RWX Retain Available 2d18h
  62. 查看pvc
  63. [root@master sts]# kubectl get pvc
  64. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  65. myappdata-myapp-0 Bound pv003 5Gi RWO 38m
  66. myappdata-myapp-1 Bound pv001 5Gi RWO,RWX 38m
  67. myappdata-myapp-2 Bound pv002 5Gi RWO,RWX 38m
  68. 查看svc
  69. [root@master sts]# kubectl get svc
  70. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  71. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 56d
  72. myapp ClusterIP None <none> 80/TCP 58s

扩展sts的pod

  1. [root@master sts]# kubectl scale sts myapp --replicas=5
  2. statefulset.apps/myapp scaled
  3. [root@master sts]# kubectl get pod
  4. NAME READY STATUS RESTARTS AGE
  5. myapp-0 1/1 Running 0 50m
  6. myapp-1 1/1 Running 0 50m
  7. myapp-2 1/1 Running 0 50m
  8. myapp-3 1/1 Running 0 11s
  9. myapp-4 0/1 Running 0 7s

缩容sts的pod

  1. [root@master sts]# kubectl patch sts myapp -p '{"spec":{"replicas":3}}'
  2. statefulset.apps/myapp patched
  3. You have new mail in /var/spool/mail/root
  4. [root@master sts]# kubectl get pod
  5. NAME READY STATUS RESTARTS AGE
  6. myapp-0 1/1 Running 0 4m12s
  7. myapp-1 1/1 Running 0 4m8s
  8. myapp-2 1/1 Running 0 4m4s
  9. myapp-3 1/1 Running 0 3m16s
  10. myapp-4 0/1 Terminating 0 3m12s

升级版本

  1. [root@master sts]# kubectl patch sts myapp -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":4}}}}'
  2. statefulset.apps/myapp patched
  3. You have new mail in /var/spool/mail/root
  4. [root@master sts]# kubectl describe sts myapp
  5. Name: myapp
  6. Namespace: default
  7. CreationTimestamp: Mon, 21 Jun 2021 12:34:07 +0800
  8. Selector: app=myapp-pod
  9. Labels: <none>
  10. Annotations: <none>
  11. Replicas: 3 desired | 3 total
  12. Update Strategy: RollingUpdate
  13. Partition: 4 //分区的方式进行升级,默认为0,就是审计所有,此处改为4,大于等于4的才会升级,其余的不会升级
  14. Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
  15. Pod Template:
  16. Labels: app=myapp-pod
  17. Containers:
  18. myapp:
  19. Image: ikubernetes/myapp:v1
  20. Port: 80/TCP
  21. Host Port: 0/TCP
  22. Environment: <none>
  23. Mounts:
  24. /usr/share/nginx/html from myappdata (rw)
  25. Volumes: <none>
  26. Volume Claims:
  27. Name: myappdata
  28. StorageClass:
  29. Labels: <none>
  30. Annotations: <none>
  31. Capacity: 5Gi
  32. Access Modes: [ReadWriteOnce]
  33. Events:
  34. Type Reason Age From Message
  35. ---- ------ ---- ---- -------
  36. Normal SuccessfulCreate 8m16s statefulset-controller create Claim myappdata-myapp-0 Pod myapp-0 in StatefulSet myapp success
  37. Normal SuccessfulCreate 8m16s statefulset-controller create Pod myapp-0 in StatefulSet myapp successful
  38. Normal SuccessfulCreate 8m12s statefulset-controller create Claim myappdata-myapp-1 Pod myapp-1 in StatefulSet myapp success
  39. Normal SuccessfulCreate 8m12s statefulset-controller create Pod myapp-1 in StatefulSet myapp successful
  40. Normal SuccessfulCreate 8m8s statefulset-controller create Claim myappdata-myapp-2 Pod myapp-2 in StatefulSet myapp success
  41. Normal SuccessfulCreate 8m8s statefulset-controller create Pod myapp-2 in StatefulSet myapp successful
  42. Normal SuccessfulCreate 7m20s statefulset-controller create Claim myappdata-myapp-3 Pod myapp-3 in StatefulSet myapp success
  43. Normal SuccessfulCreate 7m20s statefulset-controller create Pod myapp-3 in StatefulSet myapp successful
  44. Normal SuccessfulCreate 7m16s statefulset-controller create Claim myappdata-myapp-4 Pod myapp-4 in StatefulSet myapp success
  45. Normal SuccessfulCreate 7m16s statefulset-controller (combined from similar events): create Pod myapp-4 in StatefulSet myapp successful
  46. Normal SuccessfulDelete 4m15s statefulset-controller delete Pod myapp-4 in StatefulSet myapp successful
  47. Normal SuccessfulDelete 3m37s statefulset-controller delete Pod myapp-3 in StatefulSet myapp successful
  48. 升级镜像版本到v2
  49. [root@master sts]# kubectl set image sts myapp myapp=ikubernetes/myapp:v2
  50. [root@master sts]# kubectl get pods
  51. NAME READY STATUS RESTARTS AGE
  52. myapp-0 1/1 Running 0 16m
  53. myapp-1 1/1 Running 0 16m
  54. myapp-2 1/1 Running 0 16m
  55. myapp-3 1/1 Running 0 79s
  56. myapp-4 1/1 Running 0 77s
  57. [root@master sts]# kubectl get pods myapp-4 -o wide
  58. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  59. myapp-4 1/1 Running 0 91s 10.244.140.117 node02 <none> <none>
  60. [root@master sts]# kubectl get pods myapp-4 -o yaml #会发现只有myapp-4升级到了v2,其余的pod版本还是v1,想要升级其余pod,需要将partition的值改为0