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/)