Files
kuboard-press/learning/k8s-intermediate/workload/wl-deployment/scale.md
huanqing.shao 1b69a42777 vssue
2019-09-22 21:56:32 +08:00

90 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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 的 ReplicaSetscale up 之后,副本数仍然为 0
* 在本例中3 个新副本被添加到旧的 ReplicaSet2个新副本被添加到新的 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-概述)