statefulset为通用的有状态应用控制器。

每个pod都有自己的唯一标识,故障时,它只能被拥有同一个标识的新实例所取代。

如果有必要,可以为每个pod配置专用的存储卷,且只能是PVC格式。通过pvc模板来为每个pod创建专用PV

statefulset配置规范

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: apps/v1  # API群组及版本;
kind: StatefulSet # 资源类型的特有标识
metadata:
name <string> # 资源名称,在作用域中要唯一
namespace <string> # 名称空间;StatefulSet隶属名称空间级别
spec:
replicas <integer> # 期望的Pod副本数,默认为1
selector <object> # 标签选择器,须匹配Pod模板中的标签,必选字段
template <object> # Pod模板对象,必选字段
revisionHistoryLimit <integer> # 滚动更新历史记录数量,默认为10
updateStrategy <Object> # 滚动更新策略
type <string> # 滚动更新类型,可用值有OnDelete和Rollingupdate
rollingUpdate <Object> # 滚动更新参数,专用于RollingUpdate类型
partition <integer> # 分区指示索引值,默认为0
serviceName <string> # 相关的Headless Service的名称,必选字段
volumeClaimTemplates <[]Object> # 存储卷申请模板
apiVersion <string> # PVC资源所属的API群组及版本,可省略
kind <string> # PVC资源类型标识,可省略
metadata <Object> # 卷申请模板元数据
spec <Object> # 期望的状态,可用字段同PVC
podManagementPolicy <string> # Pod管理策略,默认的“OrderedReady”表示顺序创
#建并逆序删除,另一可用值“Parallel”表示并行模式

statefulset资源清单示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
apiVersion: v1
kind: Service
metadata:
name: demoapp-sts
namespace: default
spec:
clusterIP: None
ports:
- port: 80
name: http
selector:
app: demoapp
controller: sts-demo
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sts-demo
spec:
serviceName: demoapp-sts
replicas: 2
selector:
matchLabels:
app: demoapp
controller: sts-demo
template:
metadata:
labels:
app: demoapp
controller: sts-demo
spec:
containers:
- name: demoapp
images: ikubernetes/demoapp:v1.0
ports:
- name: web
containerPort: 80
volumeMounts:
- name: appdata
mountPath: /app/data
volumeClaimTemplates:
- metadata:
name: appdata
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: longhorn
resources:
requests:
storage: 2Gi
limits:
storage: 5Gi

StatefulSet示例

1.编写资源清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
root@k8s-master01:~/yaml/chapter08# vim demodb.yaml
apiVersion: v1
kind: Service
metadata:
name: demodb
namespace: default
labels:
app: demodb
spec:
clusterIP: None
ports:
- port: 9907
selector:
app: demodb
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: demodb
namespace: default
spec:
serviceName: demodb
selector:
matchLabels:
app: demodb
replicas: 2
template:
metadata:
labels:
app: demodb
spec:
containers:
- name: demodb-shard
image: ikubernetes/demodb:v0.1
ports:
- containerPort: 9907
name: db
env:
- name: DEMODB_DATADIR
value: "/demodb/data"
livenessProbe:
initialDelaySeconds: 2
periodSeconds: 10
httpGet:
path: /status
port: db
readinessProbe:
initialDelaySeconds: 15
periodSeconds: 30
httpGet:
path: /status?level=full
port: db
volumeMounts:
- name: data
mountPath: /demodb/data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: longhorn
resources:
requests:
storage: 2Gi
limits:
storage: 5Gi

2.应用配置清单

1
2
3
root@k8s-master01:~/yaml/chapter08# kubectl apply -f demodb.yaml
service/demodb created
statefulset.apps/demodb created

3.查看pod信息

1
2
3
4
5
6
7
8
9
root@k8s-master01:~/yaml/chapter08# kubectl get pods
NAME READY STATUS RESTARTS AGE
demodb-0 1/1 Running 0 3m
demodb-1 1/1 Running 0 2m
demodb-2 1/1 Running 0 1m

root@k8s-master01:~/yaml/chapter08# kubectl get sts
NAME READY AGE
demodb 3/3 4m

StatefulSet扩容

对镜像更新有3种方法:

  1. 修改资源配置清单后apply
  2. 使用kubectl set 命令
  3. 使用kubectl patch命令打补丁

此处示范打补丁

1
2
3
4
5
6
7
8
9
10
11
12
# 对sts扩容
root@k8s-master01:~# kubectl patch statefulsets.apps demodb -p '{"spec":{"replicas":5}}'
statefulset.apps/demodb patched

# 查看扩容后的pod
root@k8s-master01:~# kubectl get pods -l 'app=demodb'
NAME READY STATUS RESTARTS AGE
demodb-0 1/1 Running 0 118m
demodb-1 1/1 Running 0 117m
demodb-2 1/1 Running 0 116m
demodb-3 1/1 Running 0 106s
demodb-4 0/1 Running 0 43s

StatefulSet缩容

1.使用patch进行缩容

1
2
3
root@k8s-master01:~# kubectl patch statefulsets.apps demodb -p '{"spec":{"replicas":2}}'
statefulset.apps/demodb patched
# 此时多余的pod已经被删减

2.查看其所关联的pvc

1
2
3
4
5
6
7
8
9
root@k8s-master01:~# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-demodb-0 Bound pvc-04997889-b711-4168-bb4c-54189c8f481f 2Gi RWO longhorn 3h30m
data-demodb-1 Bound pvc-2d3e2083-659f-42ae-a289-99b2aa4199ea 2Gi RWO longhorn 3h29m
data-demodb-2 Bound pvc-7017741e-4eef-42a2-8aba-409e6c680c3f 2Gi RWO longhorn 3h28m
data-demodb-3 Bound pvc-2c82047a-8959-4f79-9cca-bcc0517d77da 2Gi RWO longhorn 93m
data-demodb-4 Bound pvc-f5dc549c-1198-43aa-a39e-7dd36edea642 2Gi RWO longhorn 92m

# PVC依旧存在