【问题标题】:Is there some way only increase statefulset's replicas and NO decrease the replicas?有没有办法只增加 statefulset 副本而不减少副本?
【发布时间】:2019-10-23 23:25:07
【问题描述】:

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

所以...,有什么办法吗?谢谢~

【问题讨论】:

    标签: kubernetes statefulset


    【解决方案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 pod 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
    

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

    【讨论】:

      【解决方案2】:

      我认为减少 pod 在生产环境中是一种危险的操作。

      我同意你的看法。

      正如 Crou 所写,可以使用 kubectl scale statefulsets &lt;stateful-set-name&gt; 执行此操作,但这是一个命令式操作,不建议在生产中执行命令式操作环境。

      在生产环境中最好使用声明式操作,例如在文本文件中拥有副本数量(例如 stateful-set-name.yaml)并使用 kubectl apply -f &lt;stateful-set-name&gt;.yaml 部署它们,通过这种工作方式,很容易将 yaml 文件存储在 Git因此您可以完全控制所有更改,并且可以恢复/回滚到以前的配置。当您将声明性文件存储在 Git 存储库中时,您可以使用 CICD 解决方案,例如Jenkins 或ArgoCD 1) 验证操作(例如不允许减少)和 2) 在将更改应用到生产环境之前先部署到测试环境并查看它是否有效。

      我推荐这本书(新版)Kubernetes Up&Running 2nd ed,它在第 18 章(新章)中描述了这个过程。

      【讨论】:

      • 是的,我同意声明式操作,我的意思是 autoscale(HPA)控制 statefulset 怎么样?不手动扩展
      • @adrianding HPA 是为无状态工作负载设计的,请参阅文档,它写的是“复制控制器、部署或副本集”,kubernetes.io/docs/tasks/run-application/… 为了处理 statefulSet 的自动缩放,我会使用或编写一个取决于应用程序的自定义控制器。
      • 我阅读了链接,它写道 hpa 可用于 rc,rs,deployment,而不是在 daemonset 中使用,只是没有提到 statefulset。你知道我不能使用 kubectl autoscale sts xxx 但我可以使用声明式操作(HPA.yaml),而且它有效!!!
      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 2020-03-14
      • 2022-01-28
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 2013-11-17
      相关资源
      最近更新 更多