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:
- name: nginximage: k8s.gcr.io/nginx-slim:0.8ports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ “ReadWriteOnce” ]
resources:
requests:storage: 1Gi
```
