deployment
This commit is contained in:
@ -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',
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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"/>
|
||||
|
||||
@ -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-概述)
|
||||
|
||||
@ -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
|
||||
如果该字段被设为 0,Kubernetes 将清理掉该 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-概述)
|
||||
|
||||
@ -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">
|
||||
|
||||
正在撰写
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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-概述)
|
||||
|
||||
@ -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-概述)
|
||||
|
||||
@ -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 的 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
|
||||
```
|
||||
|
||||
</el-tab-pane>
|
||||
|
||||
<el-tab-pane label="使用 Kuboard 更新 Deployment">
|
||||
<el-tab-pane label="使用 Kuboard 伸缩 Deployment">
|
||||
正在撰写中
|
||||
|
||||
</el-tab-pane>
|
||||
|
||||
</el-tabs>
|
||||
|
||||
[返回 Deployment](./#deployment-概述)
|
||||
|
||||
@ -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 回滚到上一个版本
|
||||
* 如果您暂停了 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
|
||||
```
|
||||
|
||||
<h2>操作处于 Failed 状态的 Deployment</h2>
|
||||
|
||||
您可以针对 ***Failed*** 状态下的 Deployment 执行任何适用于 Deployment 的指令,例如:
|
||||
* scale up / scale down
|
||||
* 回滚到前一个版本
|
||||
* 暂停(pause)Deployment,以对 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-概述)
|
||||
|
||||
@ -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-概述)
|
||||
|
||||
13
learning/k8s-intermediate/workload/wl-statefulset/basics.md
Normal file
13
learning/k8s-intermediate/workload/wl-statefulset/basics.md
Normal file
@ -0,0 +1,13 @@
|
||||
---
|
||||
layout: LearningLayout
|
||||
description: 本文描述了 Kubernetes StatefulSet 的基本信息:Components、Pod Selector、Pod Identity
|
||||
---
|
||||
|
||||
# StatefulSet 的基本信息
|
||||
|
||||
[返回 StatefulSet](./)
|
||||
|
||||
正在撰写...
|
||||
|
||||
|
||||
[返回 StatefulSet](./)
|
||||
@ -3,6 +3,6 @@ layout: LearningLayout
|
||||
description: 本文描述了 Kubernetes StatefulSet 的概念、行为及用法
|
||||
---
|
||||
|
||||
# 控制器 - StatefulSet
|
||||
# StatefulSet 的使用场景
|
||||
|
||||
正在撰写...
|
||||
|
||||
13
learning/k8s-intermediate/workload/wl-statefulset/scaling.md
Normal file
13
learning/k8s-intermediate/workload/wl-statefulset/scaling.md
Normal file
@ -0,0 +1,13 @@
|
||||
---
|
||||
layout: LearningLayout
|
||||
description: 本文描述了 Kubernetes StatefulSet 的部署和伸缩
|
||||
---
|
||||
|
||||
# StatefulSet 的部署和伸缩
|
||||
|
||||
[返回 StatefulSet](./)
|
||||
|
||||
正在撰写...
|
||||
|
||||
|
||||
[返回 StatefulSet](./)
|
||||
13
learning/k8s-intermediate/workload/wl-statefulset/update.md
Normal file
13
learning/k8s-intermediate/workload/wl-statefulset/update.md
Normal file
@ -0,0 +1,13 @@
|
||||
---
|
||||
layout: LearningLayout
|
||||
description: 本文描述了 Kubernetes StatefulSet 的更新
|
||||
---
|
||||
|
||||
# StatefulSet 的更新策略
|
||||
|
||||
[返回 StatefulSet](./)
|
||||
|
||||
正在撰写...
|
||||
|
||||
|
||||
[返回 StatefulSet](./)
|
||||
@ -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"/>
|
||||
|
||||
Reference in New Issue
Block a user