deployment

This commit is contained in:
huanqing.shao
2019-09-13 20:01:20 +08:00
parent 2a57ad8c04
commit 4de76eff89
17 changed files with 491 additions and 123 deletions

View File

@ -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',

View File

@ -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 {

View File

@ -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/) <Badge text="正在撰写" type="warn"/>
* [控制器 - StatefulSet](/learning/k8s-intermediate/workload/wl-statefulset/)
* [控制器 - DaemonSet](/learning/k8s-intermediate/workload/wl-daemonset/) <Badge text="正在撰写" type="warn"/>
* [控制器 - Job](/learning/k8s-intermediate/workload/wl-job/) <Badge text="正在撰写" type="warn"/>
* [控制器 - CronJob](/learning/k8s-intermediate/workload/wl-cronjob/) <Badge text="正在撰写" type="warn"/>

View File

@ -9,14 +9,16 @@ description: 本文描述了如何通过 Deployment 执行灰度发布(金丝
<el-tabs type="border-card">
<el-tab-pane label="使用 kubectl 更新 Deployment">
<el-tab-pane label="使用 kubectl 执行金丝雀发布">
正在撰写中
</el-tab-pane>
<el-tab-pane label="使用 Kuboard 更新 Deployment">
<el-tab-pane label="使用 Kuboard 执行金丝雀发布">
正在撰写中
</el-tab-pane>
</el-tabs>
[返回 Deployment](./#deployment-概述)

View File

@ -3,20 +3,28 @@ layout: LearningLayout
description: 本文描述了如何在 Kubernetes 中清理 Deployment 中旧的 ReplicaSet
---
# 清理旧的 ReplicaSet
# 清理策略
[返回 Deployment](./#deployment-概述)
<el-tabs type="border-card">
通过 Deployment 中 `.spec.revisionHistoryLimit` 字段,可指定为该 Deployment 保留多少个旧的 ReplicaSet。超出该数字的将被在后台进行垃圾回收。该字段的默认值是 10。
<el-tab-pane label="使用 kubectl 更新 Deployment">
::: tip
如果该字段被设为 0Kubernetes 将清理掉该 Deployment 的所有历史版本revision因此您将无法对该 Deployment 执行回滚操作 `kubectl rollout undo`
:::
<!-- <el-tabs type="border-card">
<el-tab-pane label="使用 kubectl 指定 revisionHistroyLimit">
正在撰写中
</el-tab-pane>
<el-tab-pane label="使用 Kuboard 更新 Deployment">
<el-tab-pane label="使用 Kuboard 指定 revisionHistroyLimit">
正在撰写中
</el-tab-pane>
</el-tabs>
</el-tabs> -->
[返回 Deployment](./#deployment-概述)

View File

@ -3,7 +3,7 @@ layout: LearningLayout
description: 本文描述了如何创建一个 Deployment如何理解 Deployment 各个字段,以及如何查看 Deployment 的创建结果
---
# 创建Deployment
# 创建 Deployment
[返回 Deployment](./#deployment-概述)
@ -11,7 +11,7 @@ description: 本文描述了如何创建一个 Deployment如何理解 Deploym
<el-tabs type="border-card">
<el-tab-pane label="使用kubectl创建Deployment">
<el-tab-pane label="使用 kubectl 创建 Deployment">
下面的 yaml 文件定义了一个 Deployment该 Deployment 将创建一个有 3 个 nginx Pod 副本的 ReplicaSet副本集
@ -127,7 +127,7 @@ pod-template-hash 标签时 Deployment 创建 ReplicaSet 时添加到 ReplicaSet
</el-tab-pane>
<el-tab-pane label="使用Kuboard创建Deployment">
<el-tab-pane label="使用 Kuboard 创建 Deployment">
正在撰写

View File

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

View File

@ -3,20 +3,107 @@ layout: LearningLayout
description: 本文描述了如何在 Kubernetes 中暂停 Deployment 的更新,和继续 Deployment 的更新
---
# 暂停和继续更新Deployment
# 暂停和继续 Deployment
[返回 Deployment](./#deployment-概述)
您可以先暂停 Deployment然后再触发一个或多个更新最后再继续resume该 Deployment。这种做法使得您可以在暂停和继续中间对 Deployment 做多次更新,而无需触发不必要的滚动更新。
以我们在 [创建Deployment](./create.html) 中创建的 Deployment 为例。
<el-tabs type="border-card">
<el-tab-pane label="使用 kubectl 更新 Deployment">
正在撰写中
<el-tab-pane label="使用 kubectl 暂停 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 <none>
```
* 执行命令 `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。
:::
</el-tab-pane>
<el-tab-pane label="使用 Kuboard 更新 Deployment">
<el-tab-pane label="使用 Kuboard 暂停 Deployment">
正在撰写中
</el-tab-pane>
</el-tabs>
[返回 Deployment](./#deployment-概述)

View File

@ -3,7 +3,7 @@ layout: LearningLayout
description: 本文描述了如何在 Kubernetes 中回滚 Deployment
---
# 回滚Deployment
# 回滚 Deployment
[返回 Deployment](./#deployment-概述)
@ -16,7 +16,7 @@ description: 本文描述了如何在 Kubernetes 中回滚 Deployment
<el-tabs type="border-card">
<el-tab-pane label="使用 kubectl 更新 Deployment">
<el-tab-pane label="使用 kubectl 回滚 Deployment">
<h2>模拟更新错误</h2>
@ -105,36 +105,38 @@ description: 本文描述了如何在 Kubernetes 中回滚 Deployment
<h2>检查 Deployment 的更新历史</h2>
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: <none>
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: <none>
No volumes.
```
<h2>回滚到前一个 revision版本</h2>
@ -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: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
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: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
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
```
</el-tab-pane>
<el-tab-pane label="使用 Kuboard 更新 Deployment">
<el-tab-pane label="使用 Kuboard 回滚 Deployment">
正在撰写中
</el-tab-pane>
</el-tabs>
[返回 Deployment](./#deployment-概述)

View File

@ -1,22 +1,88 @@
---
layout: LearningLayout
description: 本文描述了如何在 Kubernetes 中水平伸缩 Deployment
description: 本文描述了如何在 Kubernetes 中水平伸缩 Deployment scaling up / scaling down
---
# 伸缩Deployment
# 伸缩 Deployment
[返回 Deployment](./#deployment-概述)
伸缩Scaling Deployment是指改变 Deployment 中 Pod 的副本数量,以应对实际业务流量的变化。
<el-tabs type="border-card">
<el-tab-pane label="使用 kubectl 更新 Deployment">
正在撰写中
<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 label="使用 Kuboard 伸缩 Deployment">
正在撰写中
</el-tab-pane>
</el-tabs>
[返回 Deployment](./#deployment-概述)

View File

@ -3,20 +3,165 @@ layout: LearningLayout
description: 本文描述了如何在 Kubernetes 中查看 Deployment 的状态
---
# 查看Deployment的状态
# 查看 Deployment 的状态
[返回 Deployment](./#deployment-概述)
Deployment 的生命周期中,将会进入不同的状态,这些状态可能是:
* Progressing 正在执行滚动更新
* complete
* fail to progress
<el-tabs type="border-card">
<el-tab-pane label="使用 kubectl 更新 Deployment">
正在撰写中
<el-tab-pane label="使用 kubectl 查看 Deployment 状态">
<h2>Progressing 状态</h2>
当如下任何一个任务正在执行时Kubernete 将 Deployment 的状态标记为 ***progressing***
* Deployment 创建了一个新的 ReplicaSet
* Deployment 正在 scale up 其最新的 ReplicaSet
* Deployment 正在 scale down 其旧的 ReplicaSet
* 新的 Pod 变为 ***就绪ready*** 或 ***可用available***
您可以使用命令 `kubectl rollout status` 监控 Deployment 滚动更新的过程
<h2>Complete 状态</h2>
如果 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
```
<h2>Failed 状态</h2>
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 回滚到上一个版本
* 如果您暂停了 DeploymentKubernetes 将不会检查 `.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 中出现一个成功的 conditionstatus=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
```
<h2>操作处于 Failed 状态的 Deployment</h2>
您可以针对 ***Failed*** 状态下的 Deployment 执行任何适用于 Deployment 的指令,例如:
* scale up / scale down
* 回滚到前一个版本
* 暂停pauseDeployment以对 Deployment 的 Pod template 执行多处更新
</el-tab-pane>
<el-tab-pane label="使用 Kuboard 更新 Deployment">
<el-tab-pane label="使用 Kuboard 查看 Deployment 状态">
正在撰写中
</el-tab-pane>
</el-tabs>
[返回 Deployment](./#deployment-概述)

View File

@ -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-概述)

View File

@ -0,0 +1,13 @@
---
layout: LearningLayout
description: 本文描述了 Kubernetes StatefulSet 的基本信息Components、Pod Selector、Pod Identity
---
# StatefulSet 的基本信息
[返回 StatefulSet](./)
正在撰写...
[返回 StatefulSet](./)

View File

@ -3,6 +3,6 @@ layout: LearningLayout
description: 本文描述了 Kubernetes StatefulSet 的概念、行为及用法
---
# 控制器 - StatefulSet
# StatefulSet 的使用场景
正在撰写...

View File

@ -0,0 +1,13 @@
---
layout: LearningLayout
description: 本文描述了 Kubernetes StatefulSet 的部署和伸缩
---
# StatefulSet 的部署和伸缩
[返回 StatefulSet](./)
正在撰写...
[返回 StatefulSet](./)

View File

@ -0,0 +1,13 @@
---
layout: LearningLayout
description: 本文描述了 Kubernetes StatefulSet 的更新
---
# StatefulSet 的更新策略
[返回 StatefulSet](./)
正在撰写...
[返回 StatefulSet](./)

View File

@ -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/) <Badge text="正在撰写" type="warn"/>
* [控制器 - StatefulSet](/learning/k8s-intermediate/workload/wl-statefulset/)
* [控制器 - DaemonSet](/learning/k8s-intermediate/workload/wl-daemonset/) <Badge text="正在撰写" type="warn"/>
* [控制器 - Job](/learning/k8s-intermediate/workload/wl-job/) <Badge text="正在撰写" type="warn"/>
* [控制器 - CronJob](/learning/k8s-intermediate/workload/wl-cronjob/) <Badge text="正在撰写" type="warn"/>