90 lines
4.2 KiB
Markdown
90 lines
4.2 KiB
Markdown
---
|
||
vssueId: 37
|
||
layout: LearningLayout
|
||
description: 本文描述了如何在 Kubernetes 中水平伸缩 Deployment (scaling up / scaling down)
|
||
---
|
||
|
||
# 伸缩 Deployment
|
||
|
||
[返回 Deployment](./#deployment-概述)
|
||
|
||
伸缩(Scaling) Deployment,是指改变 Deployment 中 Pod 的副本数量,以应对实际业务流量的变化。
|
||
|
||
<el-tabs type="border-card">
|
||
|
||
<el-tab-pane label="使用 kubectl 伸缩 Deployment">
|
||
|
||
<h2>执行伸缩</h2>
|
||
|
||
* 执行命令 `kubectl scale deployment.v1.apps/nginx-deployment --replicas=10`,可以伸缩 Deployment,输出结果如下所示:
|
||
|
||
```
|
||
deployment.apps/nginx-deployment scaled
|
||
```
|
||
如果您的集群启用了自动伸缩([horizontal Pod autoscaling](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/)),执行以下命令,您就可以基于 CPU 的利用率在一个最大和最小的区间自动伸缩您的 Deployment:
|
||
``` sh
|
||
kubectl autoscale deployment.v1.apps/nginx-deployment --min=10 --max=15 --cpu-percent=80
|
||
```
|
||
输出结果如下所示:
|
||
```
|
||
deployment.apps/nginx-deployment scaled
|
||
```
|
||
|
||
<h2>按比例伸缩</h2>
|
||
|
||
滚动更新(RollingUpdate) Deployment 过程中同一时间点运行应用程序的多个版本。如果一个 Deployment 正在执行滚动更新(RollingUpdate)的过程中(也可能暂停了滚动更新),您或者自动伸缩器(autoscaler)对该 Deployment 执行伸缩操作,此时,Deployment Controller 会按比例将新建的 Pod 分配到当前活动的 ReplicaSet(有 Pod 的 ReplicaSet) 中,以避免可能的风险。这种情况叫做按比例伸缩(Proportional Scaling)
|
||
|
||
例如,假设您已经运行了一个 10 副本数的 Deployment,其 maxSurge=3, maxUnavailable=2。
|
||
|
||
* 执行命令 `kubectl get deployment`,确认 Deployment 中的 10 个副本都在运行。输出结果如下所示:
|
||
|
||
```
|
||
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
|
||
nginx-deployment 10 10 10 10 50s
|
||
```
|
||
|
||
* 执行命令 `kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:sometag`,将容器镜像更新到一个不存在的版本,输出结果如下所示:
|
||
|
||
```
|
||
deployment.apps/nginx-deployment image updated
|
||
```
|
||
|
||
* 执行命令 `kubectl get rs`,检查滚动更新的状态,输出结果如下:
|
||
```
|
||
NAME DESIRED CURRENT READY AGE
|
||
nginx-deployment-1989198191 5 5 0 9s
|
||
nginx-deployment-618515232 8 8 8 1m
|
||
```
|
||
更新容器镜像之后,Deployment Controller 将开始进行滚动更新(RollingUpdate),并创建一个新的 ReplicaSet `nginx-deployment-1989198191`,但是由于 maxUnavailable 的限定,该滚动更新将被阻止。
|
||
|
||
* 执行命令 `kubectl scale deployment.v1.apps/nginx-deployment --replicas=15`,将 Deployment 的 replicas 调整到 15。此时,Deployment Controller 需要决定如何分配新增的 5 个 Pod 副本。根据“按比例伸缩”的原则:
|
||
* 更大比例的新 Pod 数被分配到副本数最多的 ReplicaSet
|
||
* 更小比例的新 Pod 数被分配到副本数最少的 ReplicaSet
|
||
* 如果还有剩余的新 Pod 数未分配,则将被增加到副本数最多的 ReplicaSet
|
||
* 副本数为 0 的 ReplicaSet,scale up 之后,副本数仍然为 0
|
||
|
||
* 在本例中,3 个新副本被添加到旧的 ReplicaSet,2个新副本被添加到新的 ReplicaSet。如果新的副本都达到就绪状态,滚动更新过程最终会将所有的副本数添加放到新 ReplicaSet。执行命令 `kubectl get deployment` 查看 Deployment 的情况,输出结果如下所示:
|
||
|
||
```
|
||
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
|
||
nginx-deployment 15 18 7 8 7m
|
||
```
|
||
|
||
执行命令 `kubectl get rs` 查看 ReplicaSet 的情况,输出结果如下所示:
|
||
```
|
||
NAME DESIRED CURRENT READY AGE
|
||
nginx-deployment-1989198191 7 7 0 7m
|
||
nginx-deployment-618515232 11 11 11 7m
|
||
```
|
||
|
||
</el-tab-pane>
|
||
|
||
<el-tab-pane label="使用 Kuboard 伸缩 Deployment">
|
||
正在撰写中
|
||
|
||
</el-tab-pane>
|
||
|
||
</el-tabs>
|
||
|
||
[返回 Deployment](./#deployment-概述)
|