有什么方法只能增加有状态集的副本而没有减少副本吗?

时间:2019-10-23 11:30:16

标签: kubernetes statefulset

我不想减少StatefulSet所控制的Pod的数量,我认为减少Pod在生产环境中是一项危险的操作。

那么...,有什么办法吗?谢谢〜

2 个答案:

答案 0 :(得分:1)

我不确定这是否是您要找的东西,但是您可以scale a StatefulSet

  

使用kubectl缩放StatefulSets

     

首先,找到要缩放的StatefulSet。

     
kubectl get statefulsets <stateful-set-name>
     

更改StatefulSet的副本数量:

     
kubectl scale statefulsets <stateful-set-name> --replicas=<new-replicas>

为您展示一个示例,我已经部署了一个名为web的2盒StatefulSet:

$ 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

您已经在工作的吊舱中没有任何停机时间。

答案 1 :(得分:0)

  

我认为减少豆荚是生产环境中的一项危险操作。

我同意你的看法。

正如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)首先将其部署到测试环境并查看其是否有效,然后再将更改应用于生产环境

我建议在第18章(新章)中介绍此过程的书(新版)Kubernetes Up&Running 2nd ed