Deployment可以做到很便捷的管理Pod,只需要在Deployment中描述一下希望的Pod状态时什么,包括定义Pod副本数、滚动升级和回滚应用、扩容和缩容、暂停和继续Deployment等,然后Deployment Controller就可以帮我们实现我们想要达到的状态。

我们从一个例子入手:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80

这个例子中:

  • 我们定义了一个Deployment,名字叫nginx-deployment;

  • 通过spec.replicas字段定义了Pod的副本数是2;

  • 通过spec.selector字段定义了被打上app: nginx的标签的Pod才会被管理;

  • tmplate字段定义了这个Deployment管理的Pod应该是怎样的,具有怎样的属性;

总的来说一个Deploymet控制器可以由两部分组成:

ReplicaSet

ReplicaSet是一个副本控制器,ReplicaSet可以用selector来控制Pod的数量,而Deployments是一个更高层次的概念,它管理ReplicaSets,并提供对pod的声明性更新以及许多其他的功能。

Deployment通过控制ReplicaSet的个数来和属性,进而实现“水平扩展 / 收缩”和“滚动更新”这两个编排动作。

水平扩展与滚动更新

我们可以通过下面这个命令来创建Deployment:

kubectl create -f nginx-deployment.yaml --record

这里–record 参数作用是记录下你每次操作所执行的命令,以方便后面查看。

检查一下Deployment状态:

kubectl get deployments

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment 2/2 2 2 33m
  • NAME:列举出Deployments 的名字;
  • READY:显示了多少个应用的副本是可用的,目前副本数/期望副本数;
  • UP-TO-DATE:显示了副本更新的次数,这里显示为2,说明已经做过2此更新;
  • AVAILABLE:显示了多少个应用的副本是可用的;
  • AGE:显示了应用运行的时间。

现在我们使用kubectl scale来做一个水平扩展:

kubectl scale deployment nginx-deployment --replicas=4

deployment.apps/nginx-deployment scaled

然后我们可以使用rollout status来查看滚动更新的状态:

kubectl rollout status deployment/nginx-deployment

Waiting for deployment "nginx-deployment" rollout to finish: 2 of 4 updated replicas are available...
Waiting for deployment "nginx-deployment" rollout to finish: 3 of 4 updated replicas are available...
deployment "nginx-deployment" successfully rolled out

上面的3 of 4 updated replicas are available表示已经有3个Pod进入了UP-TO-DATE 状态。

然后我们还可以查看一下ReplicaSet状态:

kubectl get rs

NAME                         DESIRED   CURRENT   READY   AGE
nginx-deployment-9754ccbdf 4 4 4 44m

在运行了一个Deployment修改后,Deployment Controller会创建一个副本为ReplicaSet,并会生成一串随机字符,ReplicaSet 会把这个随机字符串加在它所控制的所有 Pod 的标签里,从而保证这些 Pod 不会与集群里的其他 Pod 混淆。

我们可以通过 kubectl get pods --show-labels来查看:

NAME                               READY   STATUS    RESTARTS   AGE    LABELS
nginx-deployment-9754ccbdf-5pl2j 1/1 Running 0 5m4s app=nginx,pod-template-hash=9754ccbdf
nginx-deployment-9754ccbdf-67d4g 1/1 Running 0 48m app=nginx,pod-template-hash=9754ccbdf
nginx-deployment-9754ccbdf-9drgb 1/1 Running 0 48m app=nginx,pod-template-hash=9754ccbdf
nginx-deployment-9754ccbdf-fdmrx 1/1 Running 0 5m4s app=nginx,pod-template-hash=9754ccbdf

下面我们看看Deployment的滚动更新是如何做的:

我们使用set image 来修改deployment中的镜像

kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record

deployment.apps/nginx-deployment image updated

然后我们可以通过kubectl describe查看滚动更新的过程:


$ kubectl describe deployment nginx-deployment
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
...
Normal ScalingReplicaSet 29s deployment-controller Scaled down replica set nginx-deployment-9754ccbdf to 3
Normal ScalingReplicaSet 29s deployment-controller Scaled up replica set nginx-deployment-dc46b5ffc to 2
Normal ScalingReplicaSet 12s (x2 over 11m) deployment-controller Scaled down replica set nginx-deployment-9754ccbdf to 2
Normal ScalingReplicaSet 12s deployment-controller Scaled up replica set nginx-deployment-dc46b5ffc to 3
Normal ScalingReplicaSet 11s deployment-controller Scaled down replica set nginx-deployment-9754ccbdf to 1
Normal ScalingReplicaSet 11s deployment-controller Scaled up replica set nginx-deployment-dc46b5ffc to 4
Normal ScalingReplicaSet 11s deployment-controller Scaled down replica set nginx-deployment-9754ccbdf to 0

可以看到Deployment Controller控制ReplicaSet将旧的Pod 副本数一个个减少,并创建一个新的ReplicaSet:nginx-deployment-dc46b5ffc,并将其控制的Pod副本数一个个增加。

在这个“滚动更新”过程完成之后,你可以查看一下新、旧两个 ReplicaSet 的最终状态:

kubectl get rs

NAME                         DESIRED   CURRENT   READY   AGE
nginx-deployment-9754ccbdf 0 0 0 57m
nginx-deployment-dc46b5ffc 4 4 4 5m9s

默认的情况下,Deployment 会保至少有75%的Pod还是可用的,所以我们的例子中,会保证至少有3个Pod是出于可用的状态。

这个策略,是 Deployment 对象的一个字段,名叫 RollingUpdateStrategy,如下所示:

 kubectl describe deployment

Name:                   nginx-deployment
...
Selector: app=nginx
Replicas: 4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
...

25% max unavailable表示最大25%不可用;25% max surge表示最多可以创建多少个新的Pod。

版本控制与回滚

在上面的操作中,我们将nginx的版本设置成了1.16.1,现在我们可以通过rollout undo来进行版本的回滚:

kubectl rollout undo deployment/nginx-deployment

deployment.apps/nginx-deployment rolled back

当然除了这个命令以外由于我们使用了--record,所以我们可以通过kubectl rollout history 来查看版本信息:

kubectl rollout history deployment/nginx-deployment

deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
2 kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record=true
3 kubectl apply --filename=nginx-deployment.yaml --record=true

我们可以通过kubectl rollout history来看到相应版本的具体信息:

kubectl rollout history deployment/nginx-deployment --revision=2

通过kubectl rollout undo命令来回滚到相应的版本:

kubectl rollout undo deployment/nginx-deployment --to-revision=2

Pausing 和Resuming 一个Deployment

我们在上面的操作中,每进行一步操作都会进行一次滚动更新,如果我们想一次性执行多条命令然后再一次性滚动更新,那么可以先pause Deployment然后操作完之后再resume 它。

如下:

kubectl rollout pause deployment/nginx-deployment

deployment.apps/nginx-deployment paused

然后就可以随意的修改这个 Deployment 的内容了。由于此时 Deployment 正处于“暂停”状态,所以我们对 Deployment 的所有修改,都不会触发新的“滚动更新”,也不会创建新的 ReplicaSet。

操作完之后再执行:

kubectl rollout resume deployment/nginx-deployment

deployment.apps/nginx-deployment resumed

在 kubectl rollout pause 指令之后的这段时间里,我们对 Deployment 进行的所有修改,最后只会触发一次“滚动更新”。

3.深入k8s:Deployment控制器的更多相关文章

  1. 3.k8s资源控制器rs Deployment Job

    k8s资源控制器 #控制器类型 ReplicaSet #rs,确保pod副本数,rs已替代rc Deployment #管理rs,升级.回滚.扩容pod DaemonSet #在每个节点运行一个Pod ...

  2. 使用Deployment控制器创建Pods并使Service发布到外网可访问

    由于NFS支持节点共同读取及写入,所以可使用Deployment控制器创建多个Pod,并且每一个Pod都共享同一个目录 k8s-master kubnet@hadoop2 volumes]$ vim ...

  3. 容器编排系统之ReplicaSet和Deployment控制器

    前文我们了解了k8s上的Pod资源的生命周期.健康状态和就绪状态探测以及资源限制相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14143610.htm ...

  4. K8S ingress控制器

    文章转载自: K8S ingress控制器 (一)https://blog.51cto.com/u_13760351/2728917 K8S ingress控制器 (二)https://blog.51 ...

  5. 【Kubernetes】Deployment控制器模型

    在Kubernetes中,Deployment是最基本的控制器对象 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deploym ...

  6. 【转帖】K8S Deployment 命令

    K8S Deployment 命令 https://www.cnblogs.com/Tempted/p/7831604.html 今天学习了一下 kubectl scale deployment xx ...

  7. k8s deployment

    案例01 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabe ...

  8. k8s deployment 金丝雀发布 更新的 暂停 恢复 回滚

    假设现在有业务需求,计划将所有的nginx 从镜像版本1.14更新到1.15,这一次发布不紧需要平滑发布,还需要 金丝雀发布,及确认其中一个Pod没有问题后在进行剩余的更新. 暂停与恢复也可以使用ym ...

  9. 回滚Deployment控制器下的应⽤发布

    若因各种原因导致滚动更新⽆法正常进⾏,如镜像⽂件获取失败."⾦丝雀"遇险等,则应该将应⽤回滚到之前的版本,或者回滚到由⽤户指定的历史记录中的版本. Deployment控制器的回滚 ...

  10. Deployment控制器(pod)更新策略

    最小就绪时间: 配置时,用户可以使用Deplpoyment控制器的spec.minReadySeconds属性来控制应用升级的速度.新旧更替过程中,新创建的Pod对象一旦成功响应就绪探测即被视作可用, ...

随机推荐

  1. JavaGUI练习 - 正交测试用例生成小工具

    正交表生成小工具 说明 小工具的适用对象主要是测试人员,他们日常工作中手动设计大量测试用例,工作繁杂甚至还存在覆盖不全面等问题. 为了提高他们的测试效率,该小工具可以通过输入一组多因素多水平的数据,然 ...

  2. Web移动端 自适应缩放界面

    在开发App端的网页时,要适配iphone.ipad.ipod.安卓等各种机型,一般是直接使用em.px转em.界面缩放. 本章是通过将界面缩放,等比例显示在各机型上.过程中遇到了些问题和大坑~ 然后 ...

  3. Python-日期格式化

    1.基本方法 获取当前日期:time.time() 获取元组形式的时间戳:time.local(time.time()) 格式化日期的函数(基于元组的形式进行格式化): (1)time.asctime ...

  4. Python-利用xlrd模块操作excel

    在工作中,无论是数据分析,还是批量导入数据,都会去操作excel,当然,数据分析有数据分析的方法,而我在开发中涉及到的是批量导入excel中的数据, 接下来介绍下如何利用python的xlrd模块来读 ...

  5. 小师妹学JVM之:Dirty cards和PLAB

    目录 简介 分代收集器中的空间划分 Write barrier和Dirty cards PLAB old space分配对象 总结 简介 分代垃圾回收器在进行minor GC的时候会发生什么操作呢?有 ...

  6. day40 线程

    目录 一.开启线程的两种方式 二.用进程和线程分别实现tcp 三.线程对象实现join方法 四.同一个进程下的多个线程数据是共享的 五.线程对象属性及其他方法 六.守护线程 七.线程互斥锁 八.GIL ...

  7. ES2020的这些新功能令人期待

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://blog.bitsrc.io/es2020-has-been-finalized- ...

  8. 04 Vue组件

    组件 每一个组件都是一个vue实例 每个组件均具有自身的模板template,根组件的模板就是挂载点 每个组件模板只能拥有一个根标签 子组件的数据具有作用域,以达到组件的复用 1.根组件 <di ...

  9. Django之自带分页模块Pagination

    Django提供了一些类来帮助您管理分页数据 - 即分布在多个页面上的数据,使用“上一页/下一页”链接.这些课程都在django/core/paginator.py. Example¶ 给Pagina ...

  10. 当我谈 HTTP 时,我谈些什么?

    当我们打开网站时也许不会去留意网站前面的HTTP是怎么来的.但是它毫无疑问在网络中有着举足轻重的地位.本文从起源到发展,详说HTTP从1到3的演变. 说在前面 本文不致力于讲完 HTTP 的全部内容, ...