一、StatefulSet扩缩容

和 Deployment 类似,可以通过更新 replicas 字段扩容/缩容 StatefulSet,也可以使用 kubectl scalekubectl editkubectl patch 来扩容/缩容一个 StatefulSet。一般不会扩缩容StatefulSet 。

1.1 扩容StatefulSet

当公司访问量变大,或者有预期内的活动时,三个 Pod 可能已无法支撑业务时,可以提前对其进行扩展。

1.动态调整Pod的副本数,比如增加Pod到5个

(1)使用kubectl edit动态调整Pod的副本数,找到replicas所在行将冒号后面数字修改为5

$ k edit sts web

使用edit动态调整Pod的副本数为5

(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

使用edit动态调整Pod的副本数为3

(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