我不想减少 StatefulSet 控制的 pod 数量,并且我认为减少 pod 是生产环境中的危险操作。
所以...,有什么办法吗?谢谢~
我不确定这是否是您正在寻找的,但您可以扩展 StatefulSet
使用 kubectl 扩展 StatefulSet
首先,找到要扩展的 StatefulSet。
kubectl get statefulsets <stateful-set-name>
更改 StatefulSet 的副本数:
kubectl scale statefulsets <stateful-set-name> --replicas=<new-replicas>
为了向您展示一个示例,我部署了一个 2 pod StatefulSet,名为web
:
$ kubectl get statefulsets.apps web
NAME READY AGE
web 2/2 60s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 63s
web-1 1/1 Running 0 44s
$ kubectl describe statefulsets.apps web
Name: web
Namespace: default
CreationTimestamp: Wed, 23 Oct 2019 13:46:33 +0200
Selector: app=nginx
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"apps/v1","kind":"StatefulSet","metadata":{"annotations":{},"name":"web","namespace":"default"},"spec":{"replicas":2,"select...
Replicas: 824643442664 desired | 2 total
Update Strategy: RollingUpdate
Partition: 824643442984
Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed
...
现在,如果我们将此 StatefulSet 扩展到 5 个副本:
$ kubectl scale statefulset web --replicas=5
statefulset.apps/web scaled
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 3m41s
web-1 1/1 Running 0 3m22s
web-2 1/1 Running 0 59s
web-3 1/1 Running 0 40s
web-4 1/1 Running 0 27s
$ kubectl get statefulsets.apps web
NAME READY AGE
web 5/5 3m56s
您在已经工作的 pod 中没有任何停机时间。
我认为减少吊舱是生产环境中的危险操作。
我同意你的看法。
正如 Crou 所写,可以执行此操作,kubectl scale statefulsets <stateful-set-name>
但这是一个命令式操作,不建议在生产环境中执行命令式操作。
在生产环境中最好使用声明式操作,例如在文本文件中保存副本的数量(例如 stateful-set-name.yaml)并kubectl apply -f <stateful-set-name>.yaml
使用这种工作方式部署它们,很容易存储 yaml -Git 中的文件,因此您可以完全控制所有更改并可以恢复/回滚到以前的配置。当您将声明性文件存储在 Git 存储库中时,您可以使用 CICD 解决方案(例如 Jenkins 或ArgoCD)来 1)验证操作(例如不允许减少)和 2)首先部署到测试环境并查看它是否有效,然后再应用生产环境的变化。
我推荐这本书(新版)Kubernetes Up&Running 2nd ed,它在第 18 章(新章)中描述了这个过程。