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. 3dTiles 数据规范详解[3] 内嵌在瓦片文件中的两大数据表

    转载请声明出处:全网@秋意正寒 零.本篇前言 说实话,我很纠结是先介绍瓦片的二进制数据文件结构,还是先介绍这两个重要的表.思前想后,我决定还是先介绍这两个数据表. 因为这两个表不先给读者灌输,那么介绍 ...

  2. 关键字: this的使用

    1.可以调用的结构:属性.方法:构造器2.this调用属性.方法:this理解为:当前对象 或 当前正在创建的对象 2.1 在类的方法中,我们可以使用"this.属性"或" ...

  3. 树莓派4B踩坑指南 - (16)外接4k显示器的相关设置

    最近某宝新买了个4k显示器, 总价700多, 质量凑合, 就把树莓派接上来了, 这一下苦了眼睛了, 于是有了此番调整 1. 先解决4k下60帧的刷新率 在\boot\config.txt的末尾加入一条 ...

  4. 函数默认参数的TDZ

    我们知道块级作用域会有TDZ. 其实方法参数也存在TDZ function add(first = second, second) { return first + second; } console ...

  5. python进阶之内置方法

    python进阶之内置方法 字符串类型的内置方法 常用操作与方法: 按索引取值 str[index] 切片 ste[start:stop:step] 长度 len(str) 成员运算in和not in ...

  6. CVE-2020-0796 漏洞复现

    漏洞介绍 2020年3月10日,微软在其官方SRC发布了CVE-2020-0796的安全公告(ADV200005,MicrosoftGuidance for Disabling SMBv3 Compr ...

  7. WeChat小程序开发-初学者笔记(一)

    WeChat小程序开发学习第一天: 完成学习目标: 1.安装并了解Wechat小程序的基本环境, 2.可以利用已学知识的结合简单实现helloWorld界面. 学习过程: 1.首先在微信平台上进行相关 ...

  8. Python之协程、异步IO、redis缓存、rabbitMQ队列

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...

  9. 问题:IE11下window.history.go(-1)返回404

    解决方法: 在后面添加return false,如: onclick="javascript:window.history.go(-1);return false" 这个问题在IE ...

  10. Cyber Security - Palo Alto Firewall Objects Addresses, Services, and Groups(3)

    LDAP Authentication and Remote Users and Groups Create Remote User Objects and LDAP Integration: sam ...