在这里,我使用了 kubectl patch 命令。它的意思是,以“补丁”的方式(JSON 格式的)
修改一个 API 对象的指定字段,也就是我在后面指定
的“spec/template/spec/containers/0/image”。
这样,StatefulSet Controller 就会按照与 Pod 编号相反的顺序,从最后一个 Pod 开始,
逐一更新这个 StatefulSet 管理的每个 Pod。而如果更新发生了错误,这次“滚动更新”就
会停止。此外,StatefulSet 的“滚动更新”还允许我们进行更精细的控制,比如金丝雀发
布(Canary Deploy)或者灰度发布,这意味着应用的多个实例中被指定的一部分不会被更
新到最新的版本。
这个字段,正是 StatefulSet 的 spec.updateStrategy.rollingUpdate 的 partition 字段。
比如,现在我将前面这个 StatefulSet 的 partition 字段设置为 2:
其中,kubectl patch 命令后面的参数(JSON 格式的),就是 partition 字段在 API 对象
里的路径。所以,上述操作等同于直接使用 kubectl edit 命令,打开这个对象,把
partition 字段修改为 2。
这样,我就指定了当 Pod 模板发生变化的时候,比如 MySQL 镜像更新到 5.7.23,那么只
有序号大于或者等于 2 的 Pod 会被更新到这个版本。并且,如果你删除或者重启了序号小
于 2 的 Pod,等它再次启动后,也会保持原先的 5.7.2 版本,绝不会被升级到 5.7.23 版
本。
StatefulSet 可以说是 Kubernetes 项目中最为复杂的编排对象,希望你课后能认真消化,
动手实践一下这个例子。
1
2
$ kubectl patch statefulset mysql --type='json' -p='[{"op": "replace", "path": "/spec/te
statefulset.apps/mysql patched
1
2
$ kubectl patch statefulset mysql -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"
statefulset.apps/mysql patched
文档被以下合辑收录
评论