diff --git a/.vuepress/config.js b/.vuepress/config.js index 0120c56..a4ec4f8 100644 --- a/.vuepress/config.js +++ b/.vuepress/config.js @@ -1,10 +1,10 @@ let dateFns = require('date-fns') module.exports = { - title: 'Kuboard - Kubernetes k8s 安装/部署/免费教程/实践/微服务管理界面', + title: 'Kuboard - Kubernetes k8s 安装/部署/入门/免费教程/实践/微服务管理界面', description: '一个非常 cool 的 Kubernetes Dashboard,简化 Kubernetes 的学习和使用,帮助您快速落地 Kubernetes;同时提供 Spring Cloud 微服务部署教程,DevOps教程', head: [ - ['meta', {name: 'keywords', content: 'Kubernetes, Docker, Dashboard, Kuboard, Spring Cloud, micro service, DevOps, 微服务, 持续构建集成, 容器, Kubernetes 教程, K8S 教程, 微服务实践, Kubernetes 安装, K8S 安装, Kubernetes 安装, Kubernetes 部署'}], + ['meta', {name: 'keywords', content: 'Kubernetes, Docker, Dashboard, Kuboard, Spring Cloud, micro service, DevOps, 微服务, 持续构建集成, 容器, Kubernetes 教程, Kubernetes 入门, K8S 教程, K8S 入门, 微服务实践, Kubernetes 安装, K8S 安装, Kubernetes 安装, Kubernetes 部署'}], ['script', {}, ` var _hmt = _hmt || []; (function() { @@ -202,8 +202,17 @@ module.exports = { 'k8s-intermediate/workload/wl-deployment/cleanup', 'k8s-intermediate/workload/wl-deployment/canary', ] + }, + { + title: '控制器 - StatefulSet', + collapsable: true, + children: [ + 'k8s-intermediate/workload/wl-statefulset/', + 'k8s-intermediate/workload/wl-statefulset/basics.html', + 'k8s-intermediate/workload/wl-statefulset/scaling.html', + 'k8s-intermediate/workload/wl-statefulset/update.html', + ] } - // 'k8s-intermediate/workload/wl-statefulset', // 'k8s-intermediate/workload/wl-daemonset', // 'k8s-intermediate/workload/wl-job', // 'k8s-intermediate/workload/wl-cronjob', diff --git a/.vuepress/styles/index.styl b/.vuepress/styles/index.styl index afac114..1956573 100644 --- a/.vuepress/styles/index.styl +++ b/.vuepress/styles/index.styl @@ -9,6 +9,11 @@ p img { .sidebar-group.is-sub-group > .sidebar-heading:not(.clickable) { font-size: 1em !important; opacity: 1 !important; + cursor: pointer !important; +} + +p code { + border: 1px solid #007af5; } .noselect { diff --git a/learning/README.md b/learning/README.md index 342d696..6c8de8c 100644 --- a/learning/README.md +++ b/learning/README.md @@ -36,7 +36,7 @@ description: Kubernetes 免费教程 * [容器组 - 初始化容器](/learning/k8s-intermediate/workload/init-container.html) * [控制器 - 概述](/learning/k8s-intermediate/workload/workload.html) * [控制器 - Deployment](/learning/k8s-intermediate/workload/wl-deployment/) - * [控制器 - StatefulSet](/learning/k8s-intermediate/workload/wl-statefulset/) + * [控制器 - StatefulSet](/learning/k8s-intermediate/workload/wl-statefulset/) * [控制器 - DaemonSet](/learning/k8s-intermediate/workload/wl-daemonset/) * [控制器 - Job](/learning/k8s-intermediate/workload/wl-job/) * [控制器 - CronJob](/learning/k8s-intermediate/workload/wl-cronjob/) diff --git a/learning/k8s-intermediate/workload/wl-deployment/canary.md b/learning/k8s-intermediate/workload/wl-deployment/canary.md index f604f2d..958f7f8 100644 --- a/learning/k8s-intermediate/workload/wl-deployment/canary.md +++ b/learning/k8s-intermediate/workload/wl-deployment/canary.md @@ -9,14 +9,16 @@ description: 本文描述了如何通过 Deployment 执行灰度发布(金丝 - + 正在撰写中 - + 正在撰写中 + +[返回 Deployment](./#deployment-概述) diff --git a/learning/k8s-intermediate/workload/wl-deployment/cleanup.md b/learning/k8s-intermediate/workload/wl-deployment/cleanup.md index f8f65b7..7cb0b73 100644 --- a/learning/k8s-intermediate/workload/wl-deployment/cleanup.md +++ b/learning/k8s-intermediate/workload/wl-deployment/cleanup.md @@ -3,20 +3,28 @@ layout: LearningLayout description: 本文描述了如何在 Kubernetes 中清理 Deployment 中旧的 ReplicaSet --- -# 清理旧的 ReplicaSet +# 清理策略 [返回 Deployment](./#deployment-概述) - +通过 Deployment 中 `.spec.revisionHistoryLimit` 字段,可指定为该 Deployment 保留多少个旧的 ReplicaSet。超出该数字的将被在后台进行垃圾回收。该字段的默认值是 10。 - +::: tip +如果该字段被设为 0,Kubernetes 将清理掉该 Deployment 的所有历史版本(revision),因此,您将无法对该 Deployment 执行回滚操作 `kubectl rollout undo`。 +::: + + + +[返回 Deployment](./#deployment-概述) diff --git a/learning/k8s-intermediate/workload/wl-deployment/create.md b/learning/k8s-intermediate/workload/wl-deployment/create.md index cec0d7a..804061b 100644 --- a/learning/k8s-intermediate/workload/wl-deployment/create.md +++ b/learning/k8s-intermediate/workload/wl-deployment/create.md @@ -3,7 +3,7 @@ layout: LearningLayout description: 本文描述了如何创建一个 Deployment,如何理解 Deployment 各个字段,以及如何查看 Deployment 的创建结果 --- -# 创建Deployment +# 创建 Deployment [返回 Deployment](./#deployment-概述) @@ -11,7 +11,7 @@ description: 本文描述了如何创建一个 Deployment,如何理解 Deploym - + 下面的 yaml 文件定义了一个 Deployment,该 Deployment 将创建一个有 3 个 nginx Pod 副本的 ReplicaSet(副本集): @@ -127,7 +127,7 @@ pod-template-hash 标签时 Deployment 创建 ReplicaSet 时添加到 ReplicaSet - + 正在撰写 diff --git a/learning/k8s-intermediate/workload/wl-deployment/index.md b/learning/k8s-intermediate/workload/wl-deployment/index.md index 0286cf0..78d1294 100644 --- a/learning/k8s-intermediate/workload/wl-deployment/index.md +++ b/learning/k8s-intermediate/workload/wl-deployment/index.md @@ -3,7 +3,7 @@ layout: LearningLayout description: 本文介绍了 Kubernetes Deployment 的概念、行为及使用方法 --- -# 控制器 - Deployment +# 介绍 Deployment 参考文档: Kubernetes 官网 [Deployments](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/)、 [ReplicaSet](https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/) @@ -81,7 +81,7 @@ Deployment 是最常用的用于部署无状态服务的方式。Deployment 控 * [更新Deployment](./update.html) 更新 Deployment 中 Pod 的定义(例如,发布新版本的容器镜像)。此时 Deployment 控制器将为该 Deployment 创建一个新的 ReplicaSet 副本集,并且逐步在新的副本集中创建 Pod,在旧的副本集中删除 Pod,以达到滚动更新的效果。 * [回滚Deployment](./rollback.html) 回滚到一个早期 Deployment 版本。 * [伸缩Deployment](./scale.html) 水平扩展 Deployment,以便支持更大的负载,或者水平收缩 Deployment,以便节省服务器资源。 -* [暂停和继续Deployment](./pause.html) 暂停正在进行的滚动更新,继续正在进行的滚动更新。 +* [暂停和继续Deployment](./pause.html) * [查看Deployment状态](./status.html) -* [清理旧的ReplicaSet](./cleanup.html) +* [清理策略](./cleanup.html) * [金丝雀发布](./canary.html) diff --git a/learning/k8s-intermediate/workload/wl-deployment/pause.md b/learning/k8s-intermediate/workload/wl-deployment/pause.md index 145158f..b3cc328 100644 --- a/learning/k8s-intermediate/workload/wl-deployment/pause.md +++ b/learning/k8s-intermediate/workload/wl-deployment/pause.md @@ -3,20 +3,107 @@ layout: LearningLayout description: 本文描述了如何在 Kubernetes 中暂停 Deployment 的更新,和继续 Deployment 的更新 --- -# 暂停和继续更新Deployment +# 暂停和继续 Deployment [返回 Deployment](./#deployment-概述) +您可以先暂停 Deployment,然后再触发一个或多个更新,最后再继续(resume)该 Deployment。这种做法使得您可以在暂停和继续中间对 Deployment 做多次更新,而无需触发不必要的滚动更新。 + +以我们在 [创建Deployment](./create.html) 中创建的 Deployment 为例。 + - -正在撰写中 + + +* 执行命令 `kubectl get deployment`,查看 Deployment 信息,输出结果如下所示: + + ``` + NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE + nginx 3 3 3 3 1m + ``` + + 执行命令 `kubectl get rs`,查看 ReplicaSet 信息,输出结果如下所示: + ``` + NAME DESIRED CURRENT READY AGE + nginx-2142116321 3 3 3 1m + ``` + +* 执行命令 `kubectl rollout pause deployment.v1.apps/nginx-deployment` 暂停 Deployment,输出结果如下所示: + + ``` + deployment.apps/nginx-deployment paused + ``` + +* 执行命令 `kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1`,更新 Deployment 的容器镜像,输出结果如下所示: + ``` + deployment.apps/nginx-deployment image updated + ``` +* 执行命令 `kubectl rollout history deployment.v1.apps/nginx-deployment`,可查看到尚未生成新的 Deployment 版本(revision),输出结果如下所示: + ``` + deployments "nginx" + REVISION CHANGE-CAUSE + 1 + ``` +* 执行命令 `kubectl get rs` 可查看到没有新的滚动更新开始执行,输出结果如下所示: + + ``` + NAME DESIRED CURRENT READY AGE + nginx-2142116321 3 3 3 2m + ``` + +* 如果需要的话,您可以针对 Deployment 执行更多的修改,例如,执行命令 `kubectl set resources deployment.v1.apps/nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi` 更新其 resource 限制,输出结果如下所示: + + ``` + deployment.apps/nginx-deployment resource requirements updated + ``` + +* 执行命令 `kubectl describe deployment nginx-deployment`,确保 Deployment 的信息已被正确修改。 + ::: tip + 暂停 Deployment 之前的信息当前仍然在起作用,而暂停 Deployment 之后,修改的 Deployment 信息尚未生效,因为该 Deployment 被暂停了。 + ::: + +* 最后,执行命令 `kubectl rollout resume deployment.v1.apps/nginx-deployment`,继续(resume)该 Deployment,可使前面所有的变更一次性生效,输出结果如下所示: + ``` + deployment.apps/nginx-deployment resumed + ``` +* 执行命令 `kubectl get rs -w` 观察滚动更新的进展,输出结果如下所示: + ``` + NAME DESIRED CURRENT READY AGE + nginx-2142116321 2 2 2 2m + nginx-3926361531 2 2 0 6s + nginx-3926361531 2 2 1 18s + nginx-2142116321 1 2 2 2m + nginx-2142116321 1 2 2 2m + nginx-3926361531 3 2 1 18s + nginx-3926361531 3 2 1 18s + nginx-2142116321 1 1 1 2m + nginx-3926361531 3 3 1 18s + nginx-3926361531 3 3 2 19s + nginx-2142116321 0 1 1 2m + nginx-2142116321 0 1 1 2m + nginx-2142116321 0 0 0 2m + nginx-3926361531 3 3 3 20s + ``` + +* 执行命令 `kubectl get rs` 查看 ResultSet 的最终状态,输出结果如下所示: + ``` + NAME DESIRED CURRENT READY AGE + nginx-2142116321 0 0 0 2m + nginx-3926361531 3 3 3 28s + ``` + + ::: tip + 您不能回滚(rollback)一个已暂停的 Deployment,除非您继续(resume)该 Deployment。 + ::: - + 正在撰写中 + + +[返回 Deployment](./#deployment-概述) diff --git a/learning/k8s-intermediate/workload/wl-deployment/rollback.md b/learning/k8s-intermediate/workload/wl-deployment/rollback.md index 4309531..5a3c143 100644 --- a/learning/k8s-intermediate/workload/wl-deployment/rollback.md +++ b/learning/k8s-intermediate/workload/wl-deployment/rollback.md @@ -3,7 +3,7 @@ layout: LearningLayout description: 本文描述了如何在 Kubernetes 中回滚 Deployment --- -# 回滚Deployment +# 回滚 Deployment [返回 Deployment](./#deployment-概述) @@ -16,7 +16,7 @@ description: 本文描述了如何在 Kubernetes 中回滚 Deployment - +

模拟更新错误

@@ -105,36 +105,38 @@ description: 本文描述了如何在 Kubernetes 中回滚 Deployment

检查 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` 拷贝而来。 + + ``` + 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` 信息 + 您可以通过如下方式制定 **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. - ``` + ``` + 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(版本)

@@ -142,80 +144,82 @@ description: 本文描述了如何在 Kubernetes 中回滚 Deployment 1. 执行命令 `kubectl rollout undo deployment.v1.apps/nginx-deployment` 将当前版本回滚到前一个版本,输出结果如下所示: - ``` - deployment.apps/nginx-deployment - ``` + ``` + deployment.apps/nginx-deployment + ``` - 或者,您也可以使用 `--to-revision` 选项回滚到前面的某一个指定版本,执行如下命令: + 或者,您也可以使用 `--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) + ```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。 + 此时,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 - ``` + ``` + 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 - ``` + ``` + 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 + ```
- + 正在撰写中
+ +[返回 Deployment](./#deployment-概述) diff --git a/learning/k8s-intermediate/workload/wl-deployment/scale.md b/learning/k8s-intermediate/workload/wl-deployment/scale.md index bd8169d..d10dfeb 100644 --- a/learning/k8s-intermediate/workload/wl-deployment/scale.md +++ b/learning/k8s-intermediate/workload/wl-deployment/scale.md @@ -1,22 +1,88 @@ --- layout: LearningLayout -description: 本文描述了如何在 Kubernetes 中水平伸缩 Deployment +description: 本文描述了如何在 Kubernetes 中水平伸缩 Deployment (scaling up / scaling down) --- -# 伸缩Deployment +# 伸缩 Deployment [返回 Deployment](./#deployment-概述) +伸缩(Scaling) Deployment,是指改变 Deployment 中 Pod 的副本数量,以应对实际业务流量的变化。 + - -正在撰写中 + + +

执行伸缩

+ +* 执行命令 `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 + ``` + +

按比例伸缩

+ +滚动更新(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 + ```
- + 正在撰写中
+ +[返回 Deployment](./#deployment-概述) diff --git a/learning/k8s-intermediate/workload/wl-deployment/status.md b/learning/k8s-intermediate/workload/wl-deployment/status.md index c384b5b..d96cb8d 100644 --- a/learning/k8s-intermediate/workload/wl-deployment/status.md +++ b/learning/k8s-intermediate/workload/wl-deployment/status.md @@ -3,20 +3,165 @@ layout: LearningLayout description: 本文描述了如何在 Kubernetes 中查看 Deployment 的状态 --- -# 查看Deployment的状态 +# 查看 Deployment 的状态 [返回 Deployment](./#deployment-概述) +Deployment 的生命周期中,将会进入不同的状态,这些状态可能是: +* Progressing 正在执行滚动更新 +* complete +* fail to progress + - -正在撰写中 + + +

Progressing 状态

+ +当如下任何一个任务正在执行时,Kubernete 将 Deployment 的状态标记为 ***progressing***: +* Deployment 创建了一个新的 ReplicaSet +* Deployment 正在 scale up 其最新的 ReplicaSet +* Deployment 正在 scale down 其旧的 ReplicaSet +* 新的 Pod 变为 ***就绪(ready)*** 或 ***可用(available)*** + +您可以使用命令 `kubectl rollout status` 监控 Deployment 滚动更新的过程 + +

Complete 状态

+ +如果 Deployment 符合以下条件,Kubernetes 将其状态标记为 ***complete***: +* 该 Deployment 中的所有 Pod 副本都已经被更新到指定的最新版本 +* 该 Deployment 中的所有 Pod 副本都处于 ***可用(available)*** 状态 +* 该 Deployment 中没有旧的 ReplicaSet 正在运行 + +您可以执行命令 `kubectl rollout status` 检查 Deployment 是否已经处于 ***complete*** 状态。如果是,则该命令的退出码为 0。 +例如,执行命令 `kubectl rollout status deployment.v1.apps/nginx-deployment`,输出结果如下所示: + +``` sh +Waiting for rollout to finish: 2 of 3 updated replicas are available... +deployment.apps/nginx-deployment successfully rolled out +$ echo $? +0 +``` + +

Failed 状态

+ +Deployment 在更新其最新的 ReplicaSet 时,可能卡住而不能达到 ***complete*** 状态。如下原因都可能导致此现象发生: +* 集群资源不够 +* 就绪检查(readiness probe)失败 +* 镜像抓取失败 +* 权限不够 +* 资源限制 +* 应用程序的配置错误导致启动失败 + +指定 Deployment 定义中的 `.spec.progressDeadlineSeconds` 字段,Deployment Controller 在等待指定的时长后,将 Deployment 的标记为处理失败。例如,执行命令 `kubectl patch deployment.v1.apps/nginx-deployment -p '{"spec":{"progressDeadlineSeconds":600}}'` 使得 Deployment Controller 为 Deployment 的处理过程等候 10 分钟,输出结果如下所示: + +``` +deployment.apps/nginx-deployment patched +``` + +等候时间达到后,Deployment Controller 将在 Deployment 的 `.status.conditions` 字段添加如下 `DeploymentCondition`: +* Type=Progressing +* Status=False +* Reason=ProgressDeadlineExceeded + +::: tip +* 除了添加一个 `Reason=ProgressDeadlineExceeded` 的 `DeploymentCondition` 到 `.status.conditions` 字段以外,Kubernetes 不会对被卡住的 Deployment 做任何操作。您可以执行 `kubectl rollout undo` 命令,将 Deployment 回滚到上一个版本 +* 如果您暂停了 Deployment,Kubernetes 将不会检查 `.spec.progressDeadlineSeconds`。 +::: + +如果您设定的 `.spec.progressDeadlinSeconds` 太短了,或者其他原因,您可能发现 Deployment 的状态改变出错。例如,假设您的集群缺乏足够的资源,执行命令 `kubectl describe deployment nginx-deployment`,输出结果如下所示: + +``` +<...> +Conditions: + Type Status Reason + ---- ------ ------ + Available True MinimumReplicasAvailable + Progressing True ReplicaSetUpdated + ReplicaFailure True FailedCreate +<...> +``` + +执行命令 `kubectl get deployment nginx-deployment -o yaml`,Deployment 的 Status 结果如下所示: +``` +status: + availableReplicas: 2 + conditions: + - lastTransitionTime: 2016-10-04T12:25:39Z + lastUpdateTime: 2016-10-04T12:25:39Z + message: Replica set "nginx-deployment-4262182780" is progressing. + reason: ReplicaSetUpdated + status: "True" + type: Progressing + - lastTransitionTime: 2016-10-04T12:25:42Z + lastUpdateTime: 2016-10-04T12:25:42Z + message: Deployment has minimum availability. + reason: MinimumReplicasAvailable + status: "True" + type: Available + - lastTransitionTime: 2016-10-04T12:25:39Z + lastUpdateTime: 2016-10-04T12:25:39Z + message: 'Error creating: pods "nginx-deployment-4262182780-" is forbidden: exceeded quota: + object-counts, requested: pods=1, used: pods=3, limited: pods=2' + reason: FailedCreate + status: "True" + type: ReplicaFailure + observedGeneration: 3 + replicas: 2 + unavailableReplicas: 2 +``` + +最终,一旦 Deployment 的 `.spec.progressDeadlinSeconds` 超时,Kubernetes 将更新 Deployment 的 Processing condition 如下: + +``` +Conditions: + Type Status Reason + ---- ------ ------ + Available True MinimumReplicasAvailable + Progressing False ProgressDeadlineExceeded + ReplicaFailure True FailedCreate +``` + +为了解决资源不足的问题,您可以尝试: +* scale down 您的 Deployment +* scale down 其他的 Deployment +* 向集群中添加计算节点 + +如果资源足够,并且 Deployment 完成了其滚动更新,您将看到 Deployment 中出现一个成功的 condition(status=True 且 Reason=NewReplicaSetAvailable)。 +``` +Conditions: + Type Status Reason + ---- ------ ------ + Available True MinimumReplicasAvailable + Progressing True NewReplicaSetAvailable +``` + +* `Type=Available` 及 `Status=True` 代表您的 Deployment 具备最小可用的 Pod 数(minimum availability)。Minimum availability 由 Deployment 中的 strategy 参数决定。 +* `Type=Progressing` 及 `Status=True` 代表您的 Deployment 要么处于滚动更新的过程中,要么已经成功完成更新并且 Pod 数达到了最小可用的数量。 + +命令 `kubectl rollout status` 可用于检查 Deployment 是否失败,如果该命令的退出码不是 0,则该 Deployment 已经超出了 `.spec.progressDeadlinSeconds` 指定的等候时长。例如,执行命令 `kubectl rollout status deployment.v1.apps/nginx-deployment`,输出结果如下所示: + +``` +Waiting for rollout to finish: 2 out of 3 new replicas have been updated... +error: deployment "nginx" exceeded its progress deadline +$ echo $? +1 +``` + +

操作处于 Failed 状态的 Deployment

+ +您可以针对 ***Failed*** 状态下的 Deployment 执行任何适用于 Deployment 的指令,例如: +* scale up / scale down +* 回滚到前一个版本 +* 暂停(pause)Deployment,以对 Deployment 的 Pod template 执行多处更新
- + 正在撰写中
+ +[返回 Deployment](./#deployment-概述) diff --git a/learning/k8s-intermediate/workload/wl-deployment/update.md b/learning/k8s-intermediate/workload/wl-deployment/update.md index cffd76a..22a166f 100644 --- a/learning/k8s-intermediate/workload/wl-deployment/update.md +++ b/learning/k8s-intermediate/workload/wl-deployment/update.md @@ -3,7 +3,7 @@ layout: LearningLayout description: 本文描述了如何在 Kubernetes 中更新 Deployment --- -# 更新Deployment +# 更新 Deployment [返回 Deployment](./#deployment-概述) @@ -156,3 +156,6 @@ description: 本文描述了如何在 Kubernetes 中更新 Deployment * 假设您创建了一个 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-概述) diff --git a/learning/k8s-intermediate/workload/wl-statefulset/basics.md b/learning/k8s-intermediate/workload/wl-statefulset/basics.md new file mode 100644 index 0000000..4f44e4b --- /dev/null +++ b/learning/k8s-intermediate/workload/wl-statefulset/basics.md @@ -0,0 +1,13 @@ +--- +layout: LearningLayout +description: 本文描述了 Kubernetes StatefulSet 的基本信息:Components、Pod Selector、Pod Identity +--- + +# StatefulSet 的基本信息 + +[返回 StatefulSet](./) + +正在撰写... + + +[返回 StatefulSet](./) diff --git a/learning/k8s-intermediate/workload/wl-statefulset/index.md b/learning/k8s-intermediate/workload/wl-statefulset/index.md index 473c630..1b05875 100644 --- a/learning/k8s-intermediate/workload/wl-statefulset/index.md +++ b/learning/k8s-intermediate/workload/wl-statefulset/index.md @@ -3,6 +3,6 @@ layout: LearningLayout description: 本文描述了 Kubernetes StatefulSet 的概念、行为及用法 --- -# 控制器 - StatefulSet +# StatefulSet 的使用场景 正在撰写... diff --git a/learning/k8s-intermediate/workload/wl-statefulset/scaling.md b/learning/k8s-intermediate/workload/wl-statefulset/scaling.md new file mode 100644 index 0000000..60e3473 --- /dev/null +++ b/learning/k8s-intermediate/workload/wl-statefulset/scaling.md @@ -0,0 +1,13 @@ +--- +layout: LearningLayout +description: 本文描述了 Kubernetes StatefulSet 的部署和伸缩 +--- + +# StatefulSet 的部署和伸缩 + +[返回 StatefulSet](./) + +正在撰写... + + +[返回 StatefulSet](./) diff --git a/learning/k8s-intermediate/workload/wl-statefulset/update.md b/learning/k8s-intermediate/workload/wl-statefulset/update.md new file mode 100644 index 0000000..d81513f --- /dev/null +++ b/learning/k8s-intermediate/workload/wl-statefulset/update.md @@ -0,0 +1,13 @@ +--- +layout: LearningLayout +description: 本文描述了 Kubernetes StatefulSet 的更新 +--- + +# StatefulSet 的更新策略 + +[返回 StatefulSet](./) + +正在撰写... + + +[返回 StatefulSet](./) diff --git a/overview/README.md b/overview/README.md index f202aaa..8f31a35 100644 --- a/overview/README.md +++ b/overview/README.md @@ -128,7 +128,7 @@ Kuboard 为 Kubernetes 初学者设计了如下学习路径: * [容器组 - 初始化容器](/learning/k8s-intermediate/workload/init-container.html) * [控制器 - 概述](/learning/k8s-intermediate/workload/workload.html) * [控制器 - Deployment](/learning/k8s-intermediate/workload/wl-deployment/) - * [控制器 - StatefulSet](/learning/k8s-intermediate/workload/wl-statefulset/) + * [控制器 - StatefulSet](/learning/k8s-intermediate/workload/wl-statefulset/) * [控制器 - DaemonSet](/learning/k8s-intermediate/workload/wl-daemonset/) * [控制器 - Job](/learning/k8s-intermediate/workload/wl-job/) * [控制器 - CronJob](/learning/k8s-intermediate/workload/wl-cronjob/)