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

163 lines
7.7 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: 35
layout: LearningLayout
description: 本文描述了如何在 Kubernetes 中更新 Deployment
---
# 更新 Deployment
[返回 Deployment](./#deployment-概述)
## 执行更新
::: tip
当且仅当 Deployment 的 Pod template`.spec.template`字段中的内容发生变更时例如标签、容器的镜像被改变Deployment 的发布更新rollout将被触发。Deployment 中其他字段的变化(例如修改 .spec.replicas 字段)将不会触发 Deployment 的发布更新rollout
:::
本文提供了两种途径对 Deployment 执行发布更新rollout
* 使用 kubectl 更新 Deployment
* 使用 Kuboard 更新 Deployment
<el-tabs type="border-card">
<el-tab-pane label="使用 kubectl 更新 Deployment">
**使用下述步骤更新您的 Deployment**
1. 执行以下命令,将容器镜像从 nginx:1.7.9 更新到 nginx:1.9.1
```sh
kubectl --record deployment.apps/nginx-deployment set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1
```
输出结果如下所示:
```
deployment.apps/nginx-deployment image updated
```
或者,您可以 `edit` 该 Deployment并将 `.spec.template.spec.containers[0].image` 从 `nginx:1.7.9` 修改为 `nginx:1.9.1`
```sh
kubectl edit deployment.v1.apps/nginx-deployment
```
输出结果如下所示
```
deployment.apps/nginx-deployment edited
```
2. 查看发布更新rollout的状态执行命令
```sh
kubectl rollout status deployment.v1.apps/nginx-deployment
```
输出结果如下所示:
```
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
```
或者
```
deployment.apps/nginx-deployment successfully rolled out
```
**查看更新后的 Deployment 的详情:**
* 更新rollout成功后您可以执行命令 `kubectl get deployments` 以查看更新结果。输出信息如下所示:
```
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 3 3 3 36s
```
* 执行命令 `kubectl get rs` Deployment 的更新是通过创建一个新的 3 个副本数的 ReplicaSet 并同时将旧的 Replicaset 的副本数缩容到 0 个副本 来达成的。输出结果如下所示:
```
NAME DESIRED CURRENT READY AGE
nginx-deployment-1564180365 3 3 3 6s
nginx-deployment-2035384211 0 0 0 36s
```
* 执行命令 `kubectl get pods`,此时将只显示新的 Pod输出结果如下所示
```
NAME READY STATUS RESTARTS AGE
nginx-deployment-1564180365-khku8 1/1 Running 0 14s
nginx-deployment-1564180365-nacti 1/1 Running 0 14s
nginx-deployment-1564180365-z9gth 1/1 Running 0 14s
```
* 如果您想要修改这些新的 Pod您只需要再次修改 Deployment 的 Pod template。
* Deployment 将确保更新过程中,任意时刻只有一定数量的 Pod 被关闭。默认情况下Deployment 确保至少 `.spec.replicas` 的 75% 的 Pod 保持可用25% max unavailable
* Deployment 将确保更新过程中,任意时刻只有一定数量的 Pod 被创建。默认情况下Deployment 确保最多 `.spec.replicas` 的 25% 的 Pod 被创建25% max surge
例如,如果您仔细观察上述 Deployment 的更新过程,您将注意到 Deployment Controller 先创建一个新 Pod然后删除一个旧 Pod然后再创建新的如此循环直到全部更新。Deployment Controller 不会 kill 旧的 Pod除非足够数量的新 Pod 已经就绪Deployment Controller 也不会创新新 Pod 直到足够数量的旧 Pod 已经被 kill。这个过程将确保更新过程中任意时刻最少 2 个 / 最多 4 个 Pod 可用。
* 执行命令 `kubectl describe deployments` 查看 Deployment 详情,输出结果如下所示:
```
Name: nginx-deployment
Namespace: default
CreationTimestamp: Thu, 30 Nov 2017 10:56:25 +0000
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision=2
Selector: app=nginx
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:1.9.1
Port: 80/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-1564180365 (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 2m deployment-controller Scaled up replica set nginx-deployment-2035384211 to 3
Normal ScalingReplicaSet 24s deployment-controller Scaled up replica set nginx-deployment-1564180365 to 1
Normal ScalingReplicaSet 22s deployment-controller Scaled down replica set nginx-deployment-2035384211 to 2
Normal ScalingReplicaSet 22s deployment-controller Scaled up replica set nginx-deployment-1564180365 to 2
Normal ScalingReplicaSet 19s deployment-controller Scaled down replica set nginx-deployment-2035384211 to 1
Normal ScalingReplicaSet 19s deployment-controller Scaled up replica set nginx-deployment-1564180365 to 3
Normal ScalingReplicaSet 14s deployment-controller Scaled down replica set nginx-deployment-2035384211 to 0
```
此时,在 `Events` 中,您可以看到:
* 您创建 Deployment 时Deployment Controller 创建了一个 ReplicaSet (nginx-deployment-2035384211) 并直接将其 scale up 到 3 个副本。
* 当您更新 Deployment 时Deployment Controller 先创建一个新的 ReplicaSet (nginx-deployment-1564180365) 并将其 scale up 到 1 个副本,然后 scale down 旧的 ReplicaSet 到 2。
* Deployment Controller 继续 scale up 新的 ReplicaSet 并 scale down 旧的 ReplicaSet直到最后新旧两个 ReplicaSet一个副本数为 3另一个副本数为 0。
</el-tab-pane>
<el-tab-pane label="使用 Kuboard 更新 Deployment">
正在撰写中
</el-tab-pane>
</el-tabs>
## 覆盖更新 Rollover (更新过程中再更新)
每创建一个 DeploymentDeployment Controller 都为其创建一个 ReplicaSet并设定其副本数为期望的 Pod 数( `.spec.replicas` 字段)。如果 Deployment 被更新,旧的 ReplicaSet 将被 Scale down新建的 ReplicaSet 将被 Scale up直到最后新旧两个 ReplicaSet一个副本数为 `.spec.replias`,另一个副本数为 0。这个过程称为 rollout。
当 Deployment 的 rollout 正在进行中的时候,如果您再次更新 Deployment 的信息,此时 Deployment 将再创建一个新的 ReplicaSet 并开始将其 scale up将先前正在 scale up 的 ReplicaSet 也作为一个旧的 ReplicaSet并开始将其 scale down。
例如:
* 假设您创建了一个 Deployment 有 5 个 nginx:1.7.9 的副本;
* 您立刻更新该 Deployment 使得其 `.spec.replicas` 为 5容器镜像为 `nginx:1.9.1`,而此时只有 3 个 nginx:1.7.9 的副本已创建;
* 此时Deployment Controller 将立刻开始 kill 已经创建的 3 个 nginx:1.7.9 的 Pod并开始创建 nginx:1.9.1 的 Pod。Deployment Controller 不会等到 5 个 nginx:1.7.9 的 Pod 都创建完之后在开始新的更新
[返回 Deployment](./#deployment-概述)