一、StatefulSet扩缩容¶
和 Deployment 类似,可以通过更新 replicas 字段扩容/缩容 StatefulSet,也可以使用 kubectl scale、kubectl edit 和 kubectl patch 来扩容/缩容一个 StatefulSet。一般不会扩缩容StatefulSet 。
1.1 扩容StatefulSet¶
当公司访问量变大,或者有预期内的活动时,三个 Pod 可能已无法支撑业务时,可以提前对其进行扩展。
1.动态调整Pod的副本数,比如增加Pod到5个
(1)使用kubectl edit动态调整Pod的副本数,找到replicas所在行将冒号后面数字修改为5
$ k edit sts web

(2)使用kubectl scale动态调整Pod的副本数
$ k scale sts web --replicas=5
statefulset.apps/web scaled
2.查看扩容后 Pod 的状态
$ k get po
NAME READY STATUS RESTARTS AGE
cluster-test-79b978867f-4x2lw 1/1 Running 73 (41m ago) 7d19h
etcd 1/1 Running 2 (10h ago) 3d21h
web-0 1/1 Running 0 37m
web-1 1/1 Running 0 37m
web-2 1/1 Running 0 5s
web-3 1/1 Running 0 4s
web-4 1/1 Running 0 2s
1.2 缩容StatefulSet¶
当公司访问量变小时,五个 Pod 过于支撑业务时,可以提前对其进行缩容。一般不建议进行缩容。
1.调整Pod的副本数,比如减少Pod到3个
(1)使用kubectl edit动态调整Pod的副本数,找到replicas所在行将冒号后面数字修改为3
$ k edit sts web

(2)使用kubectl scale动态调整Pod的副本数
$ k scale sts web --replicas=3
(3)使用kubectl edit动态调整Pod的副本数
$ k patch sts web -p '{"spec":{"replicas":3}}'
2.查看 Pod,此时 Pod 已经变成了 3 个
$ k get po
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 42m
web-1 1/1 Running 0 42m
web-2 1/1 Running 0 4m57s
二、StatefulSet更新策略¶
2.1 OnDelete 策略¶
OnDelete 更新策略实现了传统(1.7 版本之前)的行为,它也是默认的更新策略。当我们选 择这个更新策略并修改 StatefulSet 的.spec.template 字段时,StatefulSet 控制器不会自动更新 Pod, 必须手动删除 Pod 才能使控制器创建新的 Pod。
下面进行举例说明:
1.修改yaml文件,修改image为1.9.1以及OnDelete策略
$ vim stateful.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:
updateStrategy:
type: OnDelete
serviceName: "nginx"
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.9.1
ports:
- containerPort: 80
name: web
2.更新yaml文件
$ k replace -f stateful.yaml
service/nginx replaced
statefulset.apps/web replaced
3.查看pod镜像,观察无更新
$ k get po -l app=nginx -oyaml | grep image:
- image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
- image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
4.删除web-1
$ k delete po web-1
pod "web-1" deleted
5.再次查看pod镜像,观察web-1已更新
$ k get po -l app=nginx -oyaml | grep image:
- image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
- image: nginx:1.9.1
image: docker.io/library/nginx:1.9.1
2.2 RollingUpdate 策略¶
RollingUpdate(滚动更新)更新策略会自动更新一个 StatefulSet 中所有的 Pod,采用与序号索引相反的顺序进行滚动更新。
1.修改yaml文件,修改image为1.9.1
$ vim stateful.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: nginx
image: nginx:1.9.1
ports:
- containerPort: 80
name: web
2.查看pod镜像
$ k get po -l app=nginx -oyaml | grep image:
- image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
- image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
3.更新yaml文件
$ k replace -f stateful.yaml
service/nginx replaced
statefulset.apps/web replaced
4.查看pod镜像,观察已更新到1.9.1。虽然我们没有配置RollingUpdate策略,但是系统会给我们加上默认更新策略。
$ k get po -l app=nginx -oyaml | grep image:
- image: nginx:1.9.1
- image: nginx:1.9.1
- image: nginx:1.9.1
image: docker.io/library/nginx:1.9.1