StatefulSet

本文介绍了Kubernetes中StatefulSet的概念及用途,详细解释了有状态应用的特点,并通过实例展示了如何创建、查看和删除StatefulSet。同时对比了StatefulSet与Deployment的不同之处,并介绍了StatefulSet的更新策略。

StatefulSet(有状态的)

一、概述

  • 无状态应用:
    • 认为Pod都是一样的
    • 没有顺序要求
    • 不用考虑在哪个Node节点上运行。
    • 随意进行伸缩和扩展。
  • 有状态应用:
    • 有顺序的要求。
    • 认为每个Pod都是不一样的。
    • 需要考虑在哪个Node节点上运行。
    • 需要按照顺序进行伸缩和扩展。
    • 让每个Pod都是独立的,保持Pod启动顺序和唯一性。
  • StatefulSet是Kubernetes提供的管理有状态应用的负载管理控制器。
  • StatefulSet部署需要HeadLinessService(无头服务)。

为什么需要HeadLinessService(无头服务)?

在用Deployment时,每一个Pod名称是没有顺序的,是随机字符串,因此是Pod名称是无序的,但是在StatefulSet中要求必须是有序 ,每一个Pod不能被随意取代,Pod重建后pod名称还是一样的。

而Pod IP是变化的,所以是以Pod名称来识别。Pod名称是Pod唯一性的标识符,必须持久稳定有效。这时候要用到无头服务,它可以给每个Pod一个唯一的名称 。

  • StatefulSet常用来部署RabbitMQ集群、Zookeeper集群、MySQL集群、Eureka集群等。

二、创建StatefulSet

  • 创建pc-stateful.yaml文件,内容如下:
apiVersion: v1
kind: Service
metadata:
  name: service-headliness
  namespace: dev
spec:
  selector:
    app: nginx-pod
  clusterIP: None # 将clusterIP设置为None,即可创建headliness Service
  type: ClusterIP
  ports:
    - port: 80 # Service的端口
      targetPort: 80 # Pod的端口
---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: pc-statefulset
  namespace: dev
spec:
  replicas: 3
  serviceName: service-headliness
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx
          image: nginx:1.17.1
          ports:
            - containerPort: 80
  • 创建StatefulSet:

kubectl create -f pc-stateful.yaml

三、查看StatefulSet

  • 查看StatefulSet:

kubectl get sts pc-statefulset -n dev -o wide

  • 查看Pod:

kubectl get pod -n dev -o wide

四、删除StatefulSet

  • 删除StatefulSet:

kubectl delete -f pc-stateful.yaml

五、Deployment和StatefulSet的区别

  • Deployment和StatefulSet的区别:Deployment没有唯一标识而StatefulSet有唯一标识。
  • StatefulSet的唯一标识是根据主机名+一定规则生成的。
  • StatefulSet的唯一标识是主机名.无头Service名称.命名空间.svc.cluster.local。

六、StatefulSet的金丝雀发布

StatefulSet支持两种更新策略:OnDelete和RollingUpdate(默认),其中OnDelete表示删除之后才更新,RollingUpdate表示滚动更新。

updateStrategy:
  rollingUpdate: # 如果更新的策略是OnDelete,那么rollingUpdate就失效
    partition: 2 # 表示从第2个分区开始更新,默认是0
  type: RollingUpdate /OnDelete # 滚动更新
  • 示例:pc-statefulset.yaml
apiVersion: v1
kind: Service
metadata:
  name: service-headliness
  namespace: dev
spec:
  selector:
    app: nginx-pod
  clusterIP: None # 将clusterIP设置为None,即可创建headliness Service
  type: ClusterIP
  ports:
    - port: 80 # Service的端口
      targetPort: 80 # Pod的端口
---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: pc-statefulset
  namespace: dev
spec:
  replicas: 3
  serviceName: service-headliness
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx
          image: nginx:1.17.1
          ports:
            - containerPort: 80

  updateStrategy:
    rollingUpdate:
      partition: 0
    type: RollingUpdate  

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FanMY_71

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值