From 2a57ad8c046f110a7598ee8cea59b24c3ff452ea Mon Sep 17 00:00:00 2001 From: "huanqing.shao" Date: Thu, 12 Sep 2019 23:43:05 +0800 Subject: [PATCH] =?UTF-8?q?Deployment=20=E6=9B=B4=E6=96=B0/=E5=9B=9E?= =?UTF-8?q?=E6=BB=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 + .../workload/wl-deployment/rollback.md | 201 +++++++++++++++++- .../workload/wl-deployment/update.md | 137 +++++++++++- overview/change-log-on-the-way.md | 5 + 4 files changed, 343 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fd62de3..68af32b 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,8 @@ Kuboard 是一款基于 Kubernetes 的微服务管理界面。 提供最新版本的 [Kubernetes (K8S) 安装手册](https://www.kuboard.cn/install/install-k8s.html),协同创作,在线答疑,持续更新。 +点击此处,查看 [Kuboard 安装文档](https://kuboard.cn/install/install-dashboard.html) + [点击查看在线文档](https://www.kuboard.cn/#from_github) ![Demo](./overview/README.assets/1564841972085.gif) diff --git a/learning/k8s-intermediate/workload/wl-deployment/rollback.md b/learning/k8s-intermediate/workload/wl-deployment/rollback.md index 03ec13f..4309531 100644 --- a/learning/k8s-intermediate/workload/wl-deployment/rollback.md +++ b/learning/k8s-intermediate/workload/wl-deployment/rollback.md @@ -7,14 +7,213 @@ description: 本文描述了如何在 Kubernetes 中回滚 Deployment [返回 Deployment](./#deployment-概述) +某些情况下,您可能想要回滚(rollback)Deployment,例如:Deployment 不稳定(可能是不断地崩溃)。默认情况下,kubernetes 将保存 Deployment 的所有更新(rollout)历史。您可以设定 revision history limit 来确定保存的历史版本数量。 + +::: tip +当且仅当 Deployment 的 `.spec.template` 字段被修改时(例如,您修改了容器的镜像),kubernetes 将为其创建一个 Deployment revision(版本)。Deployment 的其他更新(例如:修改 `.spec.replicas` 字段)将不会创建新的 Deployment reviesion(版本)。 +::: + + -正在撰写中 + +

模拟更新错误

+ +* 假设您在更新 Deployment 的时候,犯了一个拼写错误,将 `nginx:1.9.1` 写成了 `nginx:1.91` + + ``` sh + kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91 --record=true + ``` + 输出结果如下所示: + + ``` + deployment.apps/nginx-deployment image updated + ``` + +* 该更新将卡住,您可以执行命令 `kubectl rollout status deployment.v1.apps/nginx-deployment` 检查其状态,输出结果如下所示: + + ``` + Waiting for rollout to finish: 1 out of 3 new replicas have been updated... + ``` +* 执行命令 `kubectl get rs` 您将看到两个旧的 ReplicaSet(nginx-deployment-1564180365 and nginx-deployment-2035384211)和一个新的 ReplicaSet (nginx-deployment-3066724191) 。如下所示: + + ``` + NAME DESIRED CURRENT READY AGE + nginx-deployment-1564180365 3 3 3 25s + nginx-deployment-2035384211 0 0 0 36s + nginx-deployment-3066724191 1 1 0 6s + ``` +* 执行命令 `kubectl get pods`,您将看到 1 个由新 ReplicaSet 创建的 Pod 卡在抓取 image 的死循环里: + + ``` + NAME READY STATUS RESTARTS AGE + nginx-deployment-1564180365-70iae 1/1 Running 0 25s + nginx-deployment-1564180365-jbqqo 1/1 Running 0 25s + nginx-deployment-1564180365-hysrc 1/1 Running 0 25s + nginx-deployment-3066724191-08mng 0/1 ImagePullBackOff 0 6s + ``` + + ::: tip + Deployment Controller 将自动停止有问题的更新(rollout),不会继续 scale up 新的 ReplicaSet。maxUnavailable 参数指定了最多会有几个 Pod 副本卡住,该参数的默认值是 25%。 + ::: + +* 执行命令 `kubectl describe deployment` 查看 Deployment 的详情,输出结果如下所示: + + ``` + Name: nginx-deployment + Namespace: default + CreationTimestamp: Tue, 15 Mar 2016 14:48:04 -0700 + Labels: app=nginx + Selector: app=nginx + Replicas: 3 desired | 1 updated | 4 total | 3 available | 1 unavailable + StrategyType: RollingUpdate + MinReadySeconds: 0 + RollingUpdateStrategy: 25% max unavailable, 25% max surge + Pod Template: + Labels: app=nginx + Containers: + nginx: + Image: nginx:1.91 + Port: 80/TCP + Host Port: 0/TCP + Environment: + Mounts: + Volumes: + Conditions: + Type Status Reason + ---- ------ ------ + Available True MinimumReplicasAvailable + Progressing True ReplicaSetUpdated + OldReplicaSets: nginx-deployment-1564180365 (3/3 replicas created) + NewReplicaSet: nginx-deployment-3066724191 (1/1 replicas created) + Events: + FirstSeen LastSeen Count From SubobjectPath Type Reason Message + --------- -------- ----- ---- ------------- -------- ------ ------- + 1m 1m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-2035384211 to 3 + 22s 22s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 1 + 22s 22s 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 2 + 22s 22s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 2 + 21s 21s 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 1 + 21s 21s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 3 + 13s 13s 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 0 + 13s 13s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-3066724191 to 1 + ``` + + 为了修复这个问题,您需要将其回滚到之前的一个稳定版本。 + +

检查 Deployment 的更新历史

+ +1. 执行命令 `kubectl rollout history deployment.v1.apps/nginx-deployment` 检查 Deployment 的历史版本,输出结果如下所示: + ``` + deployments "nginx-deployment" + REVISION CHANGE-CAUSE + 1 kubectl apply --filename=https://k8s.io/examples/controllers/nginx-deployment.yaml --record=true + 2 kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record=true + 3 kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91 --record=true + ``` + **CHANGE-CAUSE** 是该 revision(版本)创建时从 Deployment 的 annotation `kubernetes.io/change-cause` 拷贝而来。 + + 您可以通过如下方式制定 **CHANGE-CAUSE** 信息: + * 为 Deployment 增加注解,`kubectl annotate deployment.v1.apps/nginx-deployment kubernetes.io/change-cause="image updated to 1.9.1"` + * 执行 kubectl apply 命令时,增加 `--record` 选项 + * 手动编辑 Deployment 的 `.metadata.annotation` 信息 + +2. 执行命令 `kubectl rollout history deployment.v1.apps/nginx-deployment --revision=2`,查看 revision(版本)的详细信息,输出结果如下所示: + ``` + deployments "nginx-deployment" revision 2 + Labels: app=nginx + pod-template-hash=1159050644 + Annotations: kubernetes.io/change-cause=kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record=true + Containers: + nginx: + Image: nginx:1.9.1 + Port: 80/TCP + QoS Tier: + cpu: BestEffort + memory: BestEffort + Environment Variables: + No volumes. + ``` + +

回滚到前一个 revision(版本)

+ +下面的步骤可将 Deployment 从当前版本回滚到前一个版本(version 2) + +1. 执行命令 `kubectl rollout undo deployment.v1.apps/nginx-deployment` 将当前版本回滚到前一个版本,输出结果如下所示: + + ``` + deployment.apps/nginx-deployment + ``` + + 或者,您也可以使用 `--to-revision` 选项回滚到前面的某一个指定版本,执行如下命令: + + ```sh + kubectl rollout undo deployment.v1.apps/nginx-deployment --to-revision=2 + ``` + 输出结果如下: + ``` + deployment.apps/nginx-deployment + ``` + 更详细的信息,请参考 [kubectl rollout](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#rollout) + + 此时,Deployment 已经被回滚到前一个稳定版本。您可以看到 Deployment Controller 为该 Deployment 产生了 DeploymentRollback event。 + +2. 执行命令 `kubectl get deployment nginx-deployment`,检查该回滚是否成功,Deployment 是否按预期的运行,输出结果如下: + + ``` + NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE + nginx-deployment 3 3 3 3 30m + ``` +3. 执行命令 `kubectl describe deployment nginx-deployment` 查看 Deployment 的详情,输出结果如下: + ``` + Name: nginx-deployment + Namespace: default + CreationTimestamp: Sun, 02 Sep 2018 18:17:55 -0500 + Labels: app=nginx + Annotations: deployment.kubernetes.io/revision=4 + kubernetes.io/change-cause=kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record=true + 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 + Host Port: 0/TCP + Environment: + Mounts: + Volumes: + Conditions: + Type Status Reason + ---- ------ ------ + Available True MinimumReplicasAvailable + Progressing True NewReplicaSetAvailable + OldReplicaSets: + NewReplicaSet: nginx-deployment-c4747d96c (3/3 replicas created) + Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal ScalingReplicaSet 12m deployment-controller Scaled up replica set nginx-deployment-75675f5897 to 3 + Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deployment-c4747d96c to 1 + Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set nginx-deployment-75675f5897 to 2 + Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deployment-c4747d96c to 2 + Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set nginx-deployment-75675f5897 to 1 + Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deployment-c4747d96c to 3 + Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set nginx-deployment-75675f5897 to 0 + Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deployment-595696685f to 1 + Normal DeploymentRollback 15s deployment-controller Rolled back deployment "nginx-deployment" to revision 2 + Normal ScalingReplicaSet 15s deployment-controller Scaled down replica set nginx-deployment-595696685f to 0 + ```
+ 正在撰写中 diff --git a/learning/k8s-intermediate/workload/wl-deployment/update.md b/learning/k8s-intermediate/workload/wl-deployment/update.md index e252ff4..cffd76a 100644 --- a/learning/k8s-intermediate/workload/wl-deployment/update.md +++ b/learning/k8s-intermediate/workload/wl-deployment/update.md @@ -7,11 +7,135 @@ description: 本文描述了如何在 Kubernetes 中更新 Deployment [返回 Deployment](./#deployment-概述) +## 执行更新 + +::: tip +当且仅当 Deployment 的 Pod template(`.spec.template`)字段中的内容发生变更时(例如标签、容器的镜像被改变),Deployment 的发布更新(rollout)将被触发。Deployment 中其他字段的变化(例如修改 .spec.replicas 字段)将不会触发 Deployment 的发布更新(rollout) +::: + +本文提供了两种途径对 Deployment 执行发布更新(rollout): +* 使用 kubectl 更新 Deployment +* 使用 Kuboard 更新 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: + Mounts: + Volumes: + Conditions: + Type Status Reason + ---- ------ ------ + Available True MinimumReplicasAvailable + Progressing True NewReplicaSetAvailable + OldReplicaSets: + 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。 @@ -21,3 +145,14 @@ description: 本文描述了如何在 Kubernetes 中更新 Deployment + +## 覆盖更新 Rollover (更新过程中再更新) + +每创建一个 Deployment,Deployment 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 都创建完之后在开始新的更新 diff --git a/overview/change-log-on-the-way.md b/overview/change-log-on-the-way.md index d632c3e..a1bdb58 100644 --- a/overview/change-log-on-the-way.md +++ b/overview/change-log-on-the-way.md @@ -7,6 +7,9 @@ **BUG 修复** +* 导入应用程序时,NodePort 的值丢失 +* 导出应用程序时,环境变量-容器组信息丢失 + * 存储卷声明去掉分配模式的字段 * 存储卷声明增加 Volume Modes 字段 @@ -15,3 +18,5 @@ * Pod Conditions: lastProbeTime/reason/message * Pod restartPolicy * 初始化容器不支持就绪检查 +* Service 配置里,一部分 端口用 NodePort, 一部分端口用 ClusterIP +* 互联网访问入口,增加文档的链接