缩写: sts
通过 kubectl api-resources 可以查到:
NAME | SHORTNAMES | APIVERSION | NAMESPACED | KIND |
---|---|---|---|---|
statefulsets | sts | apps/v1 | true | StatefulSet |
web-sts.yaml |
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web-sts-svc
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 2
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
name: web
创建sts
kubectl create -f web-sts.yaml
扩缩容
扩容:kubectl scale sts web --replicas=5
缩容:kubectl scale sts web --replicas=3
金丝雀发布
更新逻辑:
金丝雀发布会将大于等于partition的pod更新为最新设置的镜像。小于partition的pod则保留不动。
这样的更新方式就可以让新旧并存,防止新镜像有问题而导致整个服务不可用。
- 首先创建一个带有5个pod的sts
kb describe sts web 查看sts的状态信息, 成功创建了5个pod
每个pod的镜像信息如下:
- 修改sts的更新策略
kb edit sts web, 找到partition,把它从0改为2。
- 修改镜像,开始更新。
kb edit sts web,修改image。保存退出。
- 查看更新结果。
kb describe sts web,删除了pod2,3,4。并创建了新的pod。
再次查看更新后的镜像
OnDelete 删除时更新
设置更新策略为OnDelete之后,pod被删除后重建时就会更新为最新的的镜像。
这样可以精确指定要更新的pod
-
创建带有两个pod的sts
-
kubectl edit sts web 修改更新策略为OnDelete;edit命令是运行时修改,也可以在yaml提前改好。
-
kubectl edit sts web 修改镜像为1.9.1,保存退出。
-
再次检查pod的镜像信息,这个时候镜像还是老的,没有变化。
-
kb delete po web-0 删除pod web-0,并再检查新创建的pod-0的镜像信息。可以看到新创建的pod镜像是1.9.1