在自动缩放条件下重新部署时,Kubernetes 滚动更新不遵守“maxUnavailable”副本

Posted

技术标签:

【中文标题】在自动缩放条件下重新部署时,Kubernetes 滚动更新不遵守“maxUnavailable”副本【英文标题】:Kubernetes Rolling Update not obeying 'maxUnavailable' replicas when redeployed in autoscaled conditions 【发布时间】:2019-05-19 23:42:23 【问题描述】:

简而言之,我们的大多数应用都在 Deployment 中配置了以下strategy -

  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate

Horizo​​ntal Pod Autoscaler 是这样配置的

spec:
  maxReplicas: 10
  minReplicas: 2

现在,当重新部署我们的应用程序时,它没有运行滚动更新,而是立即终止了 8 个 Pod,并将 Pod 的数量减少到 2,这是可用副本的最小数量。正如您在此处看到的,这发生在几分之一秒内。

这是kubectl get hpa的输出 -

由于maxUnavailable 是 25%,不应该只有大约 2-3 个 pod 最多下降吗?为什么这么多豆荚同时崩溃?如果这样操作,滚动更新似乎毫无用处。

我错过了什么?

【问题讨论】:

能否分享一下“kubectl describe hpa”的输出 @Nepomucen 已更新 在k8 github上添加了一个问题-github.com/kubernetes/kubernetes/issues/72231 【参考方案1】:

看了这个问题后,我决定在我想检查它是否不起作用的测试环境中尝试这个。

我已设置metrics-server 来获取指标服务器并设置 HPA。我已按照以下步骤设置 HPA 和部署:

How to Enable KubeAPI server for HPA Autoscaling Metrics

有一次,我在系统上运行了 HPA 和 max 10 pods,我使用以下方法更新了图像:

[root@ip-10-0-1-176 ~]# kubectl get hpa
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   49%/50%   1         10        10         87m

[root@ip-10-0-1-176 ~]# kubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
load-generator-557649ddcd-6jlnl   1/1     Running   0          61m
php-apache-75bf8f859d-22xvv       1/1     Running   0          91s
php-apache-75bf8f859d-dv5xg       1/1     Running   0          106s
php-apache-75bf8f859d-g4zgb       1/1     Running   0          106s
php-apache-75bf8f859d-hv2xk       1/1     Running   0          2m16s
php-apache-75bf8f859d-jkctt       1/1     Running   0          2m46s
php-apache-75bf8f859d-nlrzs       1/1     Running   0          2m46s
php-apache-75bf8f859d-ptg5k       1/1     Running   0          106s
php-apache-75bf8f859d-sbctw       1/1     Running   0          91s
php-apache-75bf8f859d-tkjhb       1/1     Running   0          55m
php-apache-75bf8f859d-wv5nc       1/1     Running   0          106s
[root@ip-10-0-1-176 ~]# kubectl set image deployment php-apache php-apache=hpa-example:v1 --record
deployment.extensions/php-apache image updated

[root@ip-10-0-1-176 ~]# kubectl get pods
NAME                              READY   STATUS              RESTARTS   AGE
load-generator-557649ddcd-6jlnl   1/1     Running             0          62m
php-apache-75bf8f859d-dv5xg       1/1     Terminating         0          2m40s
php-apache-75bf8f859d-g4zgb       1/1     Terminating         0          2m40s
php-apache-75bf8f859d-hv2xk       1/1     Terminating         0          3m10s
php-apache-75bf8f859d-jkctt       1/1     Running             0          3m40s
php-apache-75bf8f859d-nlrzs       1/1     Running             0          3m40s
php-apache-75bf8f859d-ptg5k       1/1     Terminating         0          2m40s
php-apache-75bf8f859d-sbctw       0/1     Terminating         0          2m25s
php-apache-75bf8f859d-tkjhb       1/1     Running             0          56m
php-apache-75bf8f859d-wv5nc       1/1     Terminating         0          2m40s
php-apache-847c8ff9f4-7cbds       1/1     Running             0          6s
php-apache-847c8ff9f4-7vh69       1/1     Running             0          6s
php-apache-847c8ff9f4-9hdz4       1/1     Running             0          6s
php-apache-847c8ff9f4-dlltb       0/1     ContainerCreating   0          3s
php-apache-847c8ff9f4-nwcn6       1/1     Running             0          6s
php-apache-847c8ff9f4-p8c54       1/1     Running             0          6s
php-apache-847c8ff9f4-pg8h8       0/1     Pending             0          3s
php-apache-847c8ff9f4-pqzjw       0/1     Pending             0          2s
php-apache-847c8ff9f4-q8j4d       0/1     ContainerCreating   0          4s
php-apache-847c8ff9f4-xpbzl       0/1     Pending             0          1s

另外,我在后台保留了工作,它每秒将kubectl get pods 输出推送到一个文件中。在升级所有镜像之前,Pod 的数量从未低于 8。

我认为您需要检查您是如何设置滚动升级的。您使用的是部署还是副本集?我将rolling update 策略与您的maxUnavailable: 25%maxSurge: 25% 部署保持一致,它对我来说效果很好。

【讨论】:

【参考方案2】:

我想指出minReadySeconds 属性。

minReadySeconds 属性指定新创建的 pod 在被视为可用之前应该准备好多长时间。实际上,没有minReadySeconds 的属性的重新部署已经在很短的时间内成功完成。但在短时间内 就绪探测 开始因任何原因失败,并且 pod 开始缩小。

maxUnavailable 属性仅在 RollingUpdate 时被关注。在 RollingUpdate 事件之后,此属性被忽略。

Kubernetes In Action 书中的注意事项:如果您只定义了就绪探针而没有正确设置 minReadySeconds,则当第一次调用就绪探针成功时,新的 pod 将被视为立即可用。如果就绪探测在不久之后开始失败,则会在所有 pod 中推出错误版本。因此,您应该适当地设置 minReadySeconds

【讨论】:

以上是关于在自动缩放条件下重新部署时,Kubernetes 滚动更新不遵守“maxUnavailable”副本的主要内容,如果未能解决你的问题,请参考以下文章

kubernetes pod重新调度,部署到不同的命名空间后会在不同的节点上运行。

是否可以自动缩放除 Kind 之外的其他种类:在 Kubernetes 中部署?

如何使用 kubectl 命令在 Kubernetes 中关闭自动缩放?

OpenStack 上 Kubernetes 中节点(minions)的水平自动缩放

同时自动缩放卷和 Pod (Kubernetes)

GKE 自动缩放无法缩放