StatefulSets服务部署测试

本文详细介绍了Kubernetes中的StatefulSet用于部署有状态应用的特性,包括稳定的网络标识、持久化存储、有序部署及更新。通过示例展示了如何创建、扩展、监控和更新StatefulSet,以及不同更新策略如RollingUpdate和OnDelete。此外,还提到了灰度发布和级联删除的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

StatefulSets服务部署测试

1:StatefulSet:有状态应用部署
StatefulSet被设计用来部署有状态应用,比如有以下一个或多个需求:

Pod具有稳定且唯一的网络标识符;
Pod需要分配稳定的、持久化的存储;
有序地部署、扩缩容、删除和停止Pod;
自动且有序地实现Pod的滚动更新。

StatefulSet的使用限制
为Pod分配的存储必须由PersistentVolume Provisioner基于所请求的存储类(storage class)来制备,或者由集群管理员预先制备。
删除或者扩缩容StatefulSet并不会删除它关联的存储卷,这样做是为了保证数据安全。
需要创建无头服务(Headless Service)来负责StatefulSet中Pod的网络标识。
当删除一个StatefulSet时,该StatefulSet不提供任何终止Pod的保证。为了实现StatefulSet中的Pod可以有序且优雅地终止,可以在删除之前将StatefulSet缩容到0。
在默认Pod管理策略(OrderedReady)下进行滚动更新时,可能会进入需要人工干预才能修复的损坏状态。

2:部署实践

创建一个nginx-sts.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None       # 指定集群内部IP为None
  selector:
    app: nginx

---
apiVersion: apps/v1
kind: StatefulSet       # 类型为StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx        # 必须与.spec.template.metadata.labels匹配
  serviceName: "nginx"  # 必须与上面Service中.metadata.name匹配
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx      # 必须与.spec.selector.matchLabels匹配
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
kubectl create -f nginx-sts.yaml

3: 查看sts的创建删除过程

查看pod的labels

kubectl get pod --show-labels

4:监控pod的状态

kubectl get pod -l app=nginx -w
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          19m
web-1   1/1     Running   0          19m
web-2   1/1     Running   0          18m

5:测试

kubectl scale --replicas=5 sts web
kubectl scale --replicas=2 sts web
kubectl get pod -l app=nginx -w
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          19m
web-1   1/1     Running   0          19m
web-2   1/1     Running   0          18m
web-3   0/1     Pending   0          0s
web-3   0/1     Pending   0          0s
web-3   0/1     ContainerCreating   0          0s
web-3   1/1     Running             0          5s
web-4   0/1     Pending             0          0s
web-4   0/1     Pending             0          0s
web-4   0/1     ContainerCreating   0          0s
web-4   1/1     Running             0          4s
web-0   1/1     Terminating         0          21m
web-0   0/1     Terminating         0          21m
web-0   0/1     Terminating         0          21m
web-0   0/1     Terminating         0          21m
web-0   0/1     Pending             0          0s
web-0   0/1     Pending             0          0s
web-0   0/1     ContainerCreating   0          0s
web-0   1/1     Running             0          3s
web-4   1/1     Terminating         0          2m33s
web-4   0/1     Terminating         0          2m34s
web-4   0/1     Terminating         0          2m46s
web-4   0/1     Terminating         0          2m46s
web-3   1/1     Terminating         0          2m51s
web-3   0/1     Terminating         0          2m52s
web-3   0/1     Terminating         0          2m53s
web-3   0/1     Terminating         0          2m53s
web-2   1/1     Terminating         0          23m
web-2   0/1     Terminating         0          23m
web-2   0/1     Terminating         0          23m
web-2   0/1     Terminating         0          23m

6:RollingUpdate更新,可以看得出是倒序更新的。

 updateStrategy:
    rollingUpdate:
      partition: 0
    type: RollingUpdate   #滚动更新

web-1   1/1     Terminating         0          35m
web-1   0/1     Terminating         0          35m
web-1   0/1     Terminating         0          35m
web-1   0/1     Terminating         0          35m
web-1   0/1     Pending             0          0s
web-1   0/1     Pending             0          0s
web-1   0/1     ContainerCreating   0          0s
web-1   1/1     Running             0          76s
web-0   1/1     Terminating         0          16m
web-0   0/1     Terminating         0          16m
web-0   0/1     Terminating         0          16m
web-0   0/1     Terminating         0          16m
web-0   0/1     Pending             0          0s
web-0   0/1     Pending             0          0s
web-0   0/1     ContainerCreating   0          0s
web-0   1/1     Running             0          70s

7:OnDelete更新方式

  updateStrategy:
    type: OnDelete  #删除才会更新

修改镜像的版本再删除查看

[root@k8s-master mysql]# kubectl get pod web-1 -o yaml | grep image
  - image: nginx:1.15.3
    imagePullPolicy: Always
    image: nginx:1.15.3
    imageID: docker-pullable://nginx@sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3
[root@k8s-master mysql]# kubectl get pod web-0 -o yaml | grep image
  - image: nginx:1.15.2
    imagePullPolicy: Always
    image: nginx:1.15.2
    imageID: docker-pullable://nginx@sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424

8:灰度发布
如要更新镜像,可以设置小于2的不跟新。

 updateStrategy:
    rollingUpdate:
      partition: 2  #序号小于2不更新
    type: RollingUpdate   #滚动更新

9:级联删除和非级联删除

级联删除: 删除sts同时删除pod
非级联删除:删除sts不删除pod,pod成为了孤儿pod

kubectl delete sts web --cascade=false  #非级联删除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值