RC、Deployment、DaemonSetStatefulSet都是面向无状态的服务,它们所管理的Pod的IP、名字,启停顺序等都是随机的,而StatefulSet是什么?顾名思义,有状态应用的集合,管理所有有状态的服务,比如MySQL、MongoDB集群等。
    StatefulSet本质上是Deployment的一种变体,它是为了解决有状态服务的问题,它所管理的Pod拥有固定的Pod名称,启停顺序,在StatefulSet中,Pod名字称为网络标识,还必须要用到共享存储

    StatefulSet管理有以下几个特点的Pod:
    1、稳定且惟一的网络标识符;
    2、稳定且持久的存储;
    3、有序、平滑地部署和扩展;
    有序、平滑地终止和删除;
    比如现在要缩减redis集群的规模,现在的架构是一主八从的,在关闭的时候应该把这个8个从节点先关掉,而且关的时候,如果启动的时候是串行启动的,关的时候也得串行关。比如8个从节点,名字分别是r1-r8,应该先关r8,在关r7,逆序来进行。
    有序的滚动更新;
    假如仍然是主从服务器,应该先滚动更新从节点,而且是逆序的。先更新r8,在更新r7。。。把所有的从都更新完了,在去更新主节点。因为从节点的版本高的特性能兼容版本低的,反过来不行。当然更新完后要确保它们的特性能互相兼容,如果不兼容,更新谁都不行。
    一般来讲,一个典型的StatefulSet由3个组件组成:
    headless service:之前使用Deployment的时候,Pod是没有顺序的,随机字符串。我们无法识别这些Pod的顺序。因此是无序的。但是在StatefulSet中要求这些Pod必须是有序的

    • StatefulSet控制器:
    • volumeClaimTemplate:存储卷申请模板。大多数有状态副本集都会用到一个功能,都会用到持久存储。 ```yaml apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports:
      • port: 80 name: web clusterIP: None selector: app: nginx

    apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: serviceName: “nginx” replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers:

    1. - name: nginx
    2. image: k8s.gcr.io/nginx-slim:0.8
    3. ports:
    4. - containerPort: 80
    5. name: web
    6. volumeMounts:
    7. - name: www
    8. mountPath: /usr/share/nginx/html

    volumeClaimTemplates:

    • metadata: name: www spec: accessModes: [ “ReadWriteOnce” ] resources:
      1. requests:
      2. storage: 1Gi

    ```