k8s学习-Deployment(模板、更新、扩缩容、回滚等)

简介: k8s学习-Deployment(模板、更新、扩缩容、回滚等)

概念

Deployment用于部署无状态的服务,kubectl中简写为deploy,这个是最常用的控制器。一般用于管理维护企业内部无状态的微服务。它基于RS,可以管理多个副本的Pod,实现无缝迁移、自动扩容缩容、自动灾难恢复、一键回滚等功能。Deployment只负责管理不同版本的RS,由RS管理Pod副本数,每个RS对应了template的一个版本,一个RS下的Pod都是相同的版本。

Dployment能帮助我们做什么?

  1. 定义一组Pod的期望数量,控制器会维持Pod数量与期望数量一致。
  2. 配置Pod发布方式,控制器会按给定策略更新Pod,保证更新过程中不可用Pod的数量在一定范围内。
  3. 如果发布有问题,可以回滚。

模板

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment # deploy的名字
  labels:                # 标签
    app: nginx
spec:
  replicas: 3            # 期望的副本数
  selector:              # 选择器
    matchLabels:
      app: nginx
  template:              # 容器模板
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

“apiVersion:apps/v1”,也就是说 Deployment 当前所属的组是 apps,版本是 v1。

“metadata”是我们看到的 Deployment 元信息。

"spec"是期望的内容,包含容器副本数、模板等。

实战

创建

保存上面的模板为deploy-nginx.yaml

命令:

kubectl create -f deploy-nginx.yaml -n killer

结果:

稍等两分钟,可以看到容器都起来了

也可以看到rs

查看更多信息:

[root@k8s-master01 deploy]# kubectl get deploy -n killer -owide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
nginx-deployment   3/3     3            3           3m    nginx        nginx:latest   app=nginx
  • NAME: Deployment名称
  • READY:Pod的状态,已经Ready的个数
  • UP-TO-DATE:已经达到期望状态的被更新的副本数
  • AVAILABLE:已经可以用的副本数
  • AGE:显示应用程序运行的时间
  • CONTAINERS:容器名称
  • IMAGES:容器的镜像
  • SELECTOR:管理的Pod的标签

更新

没有记录的更新,使用edit即可

由于之后需要回滚,因此需要记录版本,可以使用set命令

kubectl set image deploy nginx-deployment nginx=nginx:latest --record

回滚(rollback)

查看历史版本

命令

kubectl rollout history deploy nginx-deployment -n killer

结果

再更新一次,然后查看历史记录

回滚到上一版本

发布应用时经常灰度发布,一旦发布出错,一般会回滚到上一版本

命令

kubectl rollout undo deploy nginx-deployment -n killer

结果

查看与回滚到指定版本

查看指定版本

命令

kubectl rollout history deploy nginx-deployment --revision=5

结果

回滚到指定版本

命令

kubectl rollout undo deploy nginx-deployment --to-revision=4 -n killer

结果

可以看到,回滚后yaml也跟着改了

扩缩容

命令

kubectl scale --replicas=2 deploy nginx-deployment -n killer

结果

暂停和恢复

暂停

命令

kubectl rollout pause deploy nginx-deployment -n killer

结果

恢复

命令

kubectl rollout resume deploy nginx-deployment -n killer

结果

删除

想要删除应用,就需要删除deploy,而不是pod,否则会一直创建新的Pod。

命令

kubectl delete deploy nginx-deployment -n killer

结果

注意项

yaml的一些字段

部分yaml如下:

spec:
  revisionHistoryLimit: 10
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
status:
  availableReplicas: 3
  conditions:
  - lastTransitionTime: "2022-06-12T17:06:16Z"
    lastUpdateTime: "2022-06-12T17:06:16Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2022-06-12T17:25:23Z"
    lastUpdateTime: "2022-06-12T17:25:30Z"
    message: ReplicaSet "nginx-deployment-786b576769" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 11
  readyReplicas: 3
  replicas: 3
  updatedReplicas: 3
  • .spec.revisionHistoryLimit:设置保留RS旧的revision的个数,设置为0的话,不保留历史数据
  • .spec.minReadySeconds:可选参数,指定新创建的Pod在没有任何容器崩溃的情况下视为Ready最小的秒数,默认为0,即一旦被创建就视为可用。
  • .spec.strategy.type:更新deployment的方式,默认是RollingUpdate
  • RollingUpdate:滚动更新,可以指定maxSurge和maxUnavailable
  • maxUnavailable:指定在回滚或更新时最大不可用的Pod的数量,可选字段,默认25%,可以设置成数字或百分比,如果该值为0,那么maxSurge就不能0
  • maxSurge:可以超过期望值的最大Pod数,可选字段,默认为25%,可以设置成数字或百分比,如果该值为0,那么maxUnavailable不能为0
  • Recreate:重建,先删除旧的Pod,在创建新的Pod

回滚过程

回滚的时候根据前面提到的最大不可用Pod百分比进行灰度回滚,以副本数为2举例:

  1. 现rs 设置为1,启动一个Pod。
  2. 原rs设置为1,删除一个Pod。
  3. 现rs设置为2,再启动一个Pod。
  4. 原rs设置为0,删除Pod。

这样,可以保证至少有两个Pod在运行。

参考

k8s-deploy

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
存储 Kubernetes 持续交付
k8s学习
【10月更文挑战第1天】
111 4
|
1月前
|
Kubernetes 应用服务中间件 nginx
【赵渝强老师】K8s中的Deployment控制器
Kubernetes中的Deployment用于部署无状态应用程序,管理Pod的数量、更新方式和资源限制。通过创建和管理ReplicaSet,Deployment可以实现Pod的自动扩缩容、滚动更新和回滚。本文介绍了Deployment的基本概念,并通过一个具体的示例演示了如何使用Deployment创建、更新和管理Pod。
|
1月前
|
存储 Kubernetes 调度
【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别
K8s中的Deployment控制器用于管理无状态应用程序,关注Pod数量、更新方式等;而StatefulSets控制器则管理有状态应用程序,提供持久存储和唯一标识符,适用于需要稳定网络标识符和持久化存储的场景。两者的主要区别在于是否维护状态和顺序。
|
2月前
|
存储 Kubernetes 调度
|
2月前
|
Kubernetes API 调度
k8s学习--pod的所有状态详解(图例展示)
k8s学习--pod的所有状态详解(图例展示)
250 1
|
2月前
|
Kubernetes 固态存储 调度
k8s学习--如何控制pod调度的位置
k8s学习--如何控制pod调度的位置
|
存储 Kubernetes NoSQL
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(六)
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(六)
194 0
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(六)
|
监控 应用服务中间件 nginx
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(五)
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(五)
195 0
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(五)
|
数据可视化 Perl 容器
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(四)
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(四)
301 0
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(四)
|
数据可视化 NoSQL 应用服务中间件
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(三)
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(三)
255 0
KUBERNETES03_命名空间、Pod是什么、Deployment多副本能力、扩缩容、自愈或故障转移、滚动更新、版本回退(三)

热门文章

最新文章