K8S Deployment 使用 & 更新 & 回滚 & 扩容

这篇具有很好参考价值的文章主要介绍了K8S Deployment 使用 & 更新 & 回滚 & 扩容。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

K8S Deployments 使用 & 更新 & 回滚 & 扩容

K8S Deployments 提供比 Replication Controller 、ReplicaSet 更高一级的抽象,也具备更丰富的功能。Deployment对象不仅创建pod,还确保集群中始终运行正确数量的pod,处理可伸缩性,并持续处理pod的更新。所有这些活动都可以通过部署YAML中的字段进行配置。下面接下来就开始K8S Deployment的学习之旅吧。

Deployment 应用场景

以下是K8S Deployment典型的应用场景

  • 创建Deployment展示ReplicaSet - ReplicaSet在后台自动创建Pod,所以Deployment也会自动创建Pod,并检查Pod是否创建成功
  • 使用Deployment配置文件申明Pods状态 - Deployment管理Pods并将其迁移到新的ReplicaSet, 每个新的ReplicaSet都会更新Deployment版本信息
  • 更新Deployment - 如新版本Deployment状态不稳定,支持回滚到之前的版本,每次回滚都会更新Deployment版本信息
  • Deployment支持扩容,以支持更多的负载
  • 暂停/恢复更新Deployment - 当更新需要修改多处配置信息时,暂停更新,等待修改完毕,再恢复更新Deployment

Deployment Example

演示环境

  • OS 信息

    K8S Deployment 使用 & 更新 & 回滚 & 扩容

  • minikube 版本信息

    K8S Deployment 使用 & 更新 & 回滚 & 扩容

  • Kubectl 版本

    K8S Deployment 使用 & 更新 & 回滚 & 扩容

  • Dokcer 版本

    K8S Deployment 使用 & 更新 & 回滚 & 扩容

  • 启动minikube

    minikube start --driver=docker
    

配置文件

# vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

配置说明:

  • 根据**.metadata.name**字段配置值 ,创建名为 nginx-deployment的Deployment对象,该名称将作为ReplicaSet、Pod的前缀自动闯将这两种类型的对象
  • Deployment根据**.spec.replicas**自动创建ReplicaSet对象,并创建3个副本Pod
  • .spec.selector字段定义ReplicaSet如何匹配Pod,需要跟template.labels.app一致
  • template模板字段包含以下信息
    • 使用 .metadata.labels.app - 字段标记Pod
    • spec字段指示Pod运行的容器(名称为nginx) ,以及容器镜像
    • port容器端口

创建Deployment

kubectl apply -f nginx-deployment.yaml

K8S Deployment 使用 & 更新 & 回滚 & 扩容

运行状态

  • 查看Deployment运行状态

    # 创建成功后 使用以下命令查看deployment运行状态
    kubectl get deployments | grep nginx-deployment
    

    K8S Deployment 使用 & 更新 & 回滚 & 扩容

    如图片所示,自动创建了名为nginx-deployment 的 Deployments集群,副本数为3,上述中每个字段的含义如下

    • NAME - 列出默认命名空间集群中Deployment的名称
    • READY - 显示应用程序副本的数量
    • UP-TO-DATE - 显示已经达到期望状态的副本数量
    • AVAILABLE - 显示集群中应用程序可用的副本数量,正常情况下应该跟期望值一致,Pod在创建过程中可能会少于期望值
    • AGE - 显示应用程序运行时长
  • 使用rollout命令 查看Deployment创建状态

    kubectl rollout status deployment/nginx-deployment
    

    K8S Deployment 使用 & 更新 & 回滚 & 扩容

  • 查看Deployment自动创建的ReplicSet 信息

    kubectl get rs | grep nginx
    

    K8S Deployment 使用 & 更新 & 回滚 & 扩容

    注意:ReplicSet对象的名称前缀跟Deployment定义中的一致

  • 查看Deployment底层的Pod信息

    kubectl get pods --show-labels | grep nginx-deployment
    

    K8S Deployment 使用 & 更新 & 回滚 & 扩容

    请注意,Pod后面携带的Hash值 - 7fb96c846b跟Deployment对应ReplicaSet对象的Hash值一致,他们之间由此产生关联。

更新 Deployment

仅当Deployment配置文件中的Pod模板(.spec.template)更改时,才会触发Deployment更新操作。例如Pod模板中的镜像文件更改,触发Deployment更新。

更新镜像版本

  • 将之前nginx的镜像版本从 nginx:1.14.2 升级到 nginx:1.16.1

    kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1
    

    K8S Deployment 使用 & 更新 & 回滚 & 扩容

    此外还可以使用以下命令升级Deployment

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

    另外还可以使用以下命令,直接修改Deployment

    
    

    K8S Deployment 使用 & 更新 & 回滚 & 扩容

    找到镜像版本信息的位置,修改为更高级的版本进行更新Deployment,修改完毕之后,shell控制台输出如下

    deployment.apps/nginx-deployment edited
    

更新过程

kubectl describe deploy nginx-deployment

使用以上命令,查看Deployment对象的详细创建过程

K8S Deployment 使用 & 更新 & 回滚 & 扩容

仔细查看Events信息,可以分析出Deployment 创建过程

  1. 第一次直接创建了3个副本的ReplicaSet
  2. 更新Deployment时,启动一个新的ReplicaSet
  3. 将旧ReplicaSet的三个副本减掉一个 对应 to 2 from 3
  4. 更新操作启动第二个ReplicaSet副本,此时新版本ReplicaSet变成2 to 2 from 1
  5. 将旧ReplicaSet的存活的2个副本减掉一个 对应 to 1 from 2
  6. 更新操作启动第三个ReplicaSet副本,此时新版本ReplicaSet变成2 to 3 from 2
  7. 将旧ReplicaSet的存活的1个副本减掉一个 对应 to 0 from 1

由此可知,更新Deployment对象会启动新的ReplicaSet,等待启动完成后,会自动停用旧版本的ReplicaSet。在升级过程中采用先启动后停用的方式,能够始终保持ReplicaSet期望的副本数。

更新策略

默认情况下,K8S会保留10个旧ReplicaSet版本,以方便回滚。超过10个以上的ReplicaSet将会被系统回收。可以使用spec.revisionHistoryLimit设置保留ReplicaSet的个数,设置为0时,不保留历史记录。

.spec.strategy.type参数设置会影响Deployment的更新机制

  • Recreate - 先删除旧的Pod,再创建新的Pod
  • RollingUpdate - 滚动更新,默认值,可以通过指定 maxUnavailable 、maxSurge来控制更新过程
    • .spec.strategy.rollingUpdate.maxUnavailable 指定回滚更新时,最大不可用的Pod数量,默认25%,简单理解为一部分更新
    • .spec.strategy.rollingUpdate.maxSurge 可以超过期望值的最大Pod数,可选字段,默认为25%

.spec.minReadySeconds 可选参数,指定新建的Pod在没有任何容器崩溃情况下视为就绪- Ready状态的最小时间,单位为秒,默认为0,即一旦创建Pod,则被视为可用

回滚Deployment

当部署不稳定、新版本发布失败时,用户可能需要回滚Deployment,继续使用旧版本Deployment提供服务。默认情况下所有回滚信息都会保存在系统中,目的是方便随时回滚.

当且仅当Deployment关联的Pod对象 (.spec.template) 发生变化时,Deployment才会创建新的版本信息。其他操作,如扩容伸缩操作并不会更新版本信息。因此也就意味着,回滚操作只需要回滚Deployment对象关联的Pod即可。

更新失败

  • 假设您需要将nginx的版本从nginx:1.16.1回滚到nginx:1.161,可以使用如下命令进行回滚
kubectl set image deployment/nginx-deployment nginx=nginx:1.161 

K8S Deployment 使用 & 更新 & 回滚 & 扩容

  • 验证更新状态
kubectl rollout status deployment/nginx-deployment

K8S Deployment 使用 & 更新 & 回滚 & 扩容

如图片所示,此次更新失败。

  • 检查ReplicaSet更新状态
kubectl get rs

K8S Deployment 使用 & 更新 & 回滚 & 扩容

新版本的ReplicaSet对象创建失败。

  • 检查Pod状态
kubectl get pods

K8S Deployment 使用 & 更新 & 回滚 & 扩容

如图片所示,Pod启动失败的原因是镜像拉取失败(由于不存在对应版本镜像)。

系统回滚

  • 首先检查回滚版本信息
kubectl rollout history deployment/nginx-deployment

K8S Deployment 使用 & 更新 & 回滚 & 扩容

我们更新了三次,最后一个是失败的。

  • 查看回滚版本详细信息
kubectl rollout history deployment/nginx-deployment --revision=2

K8S Deployment 使用 & 更新 & 回滚 & 扩容

  • 回滚到上一个版本
 kubectl rollout undo deployment/nginx-deployment

K8S Deployment 使用 & 更新 & 回滚 & 扩容

  • 回滚到指定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=1
  • 检查Deployment信息
kubectl describe deployment nginx-deployment

K8S Deployment 使用 & 更新 & 回滚 & 扩容

如上图所示,Deployment中的镜像版本变成了最初的1.14.2,至此回滚成功。

扩容Deployment

手动扩容

当公司业务流程变大,需要更多的节点来处理新增的流量,此时需要将系统进行扩容。K8S Deployment扩容的方式非常简单,只需要使用以下命令即可进行扩容

kubectl scale deployment/nginx-deployment --replicas=10

K8S Deployment 使用 & 更新 & 回滚 & 扩容

扩容成功后,检查下Deployment的副本数量

kubectl get deploy

K8S Deployment 使用 & 更新 & 回滚 & 扩容

自动扩容

Deployment 还支持根据服务器运行情况进行扩容文章来源地址https://www.toymoban.com/news/detail-445143.html

# 当cpu超过80%的时候,进行扩容,副本数量最低10个,最高不超过15个
kubectl autoscale deployment/nginx-deployment --min=10 --max=15 --cpu-percent=80

到了这里,关于K8S Deployment 使用 & 更新 & 回滚 & 扩容的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k8s学习-Deployment

    Kubernetes通过各种Controller来管理Pod的生命周期 。 为了满足不同业 务 景 , Kubernetes 开发了Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等多种Controller。我们⾸先学习最常用Deployment。 第一种是通过kubectl命令直接创建: 在最新的 Kubernetes 版本中,kubectl create deployment 命令不再直接

    2024年01月19日
    浏览(47)
  • k8s概念-deployment

    deployment用于部署无状态应用 Deployment集成了上线部署、滚动升级、创建副本、回滚等功能 Deployment里包含并使用了ReplicaSet Replicaset 通过改变Pod副本数量实现Pod的扩容和缩容 参考文档  https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/ 1 yaml文件 2 pod版本升级 查看帮助

    2024年02月14日
    浏览(42)
  • k8s中的deployment

            Deployment是k8s中用来管理发布的控制器,在开发的过程中使用非常频繁,本篇文章主要介绍deployment相关的使用和原理。 声明式API 最终一致性 水平触发 资源对象 。。。 定义一组pod的期望数量,controller会维持Pod的数量和期望的一致(其实deployment是通过管理rs的状态来

    2024年02月16日
    浏览(35)
  • K8S deployment挂载

     Deployment部署文件 nginx容器页面目录挂载到emptyDir emptyDir目录是pod所在的node节点主机的目录,此目录下的data即对应容器里的/usr/share/nginx/html,实现目录挂载;图1红框里的号对应docker 的name中的编号,如下俩个图

    2024年02月12日
    浏览(39)
  • k8s之Deployment篇

    Deployment官方文档: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/ Deployment是kubernetes中最常用的资源对象,为ReplicaSet和Pod的创建提供了一种声明式的定义方法,在Deployment对象中描述一个期望的状态,Deployment控制器就会按照一定的控制速率把实际状态改成期望状态,通

    2024年02月05日
    浏览(39)
  • k8s删除pod或deployment

    deployment: pod: 删除pod: 可是,此时你会发现刚刚删除的pod开始重构。那是因为pod的上级deployment仍然存在,k8s会启动容灾机智,再拉一个新pod。 想要彻底删除pod,直接干掉它上层的deployment就可以 删除deployment: 干掉deployment,里面的pod自然就被一起删除了

    2024年02月11日
    浏览(51)
  • k8s 的 Deployment控制器

    RC(Replication Controller)主要作用就是用来确保容器应用的副本数始终保持在用户定义的副本数。即如果有容器异常退出,会自动创建新的pod来替代;而如果异常多出来的容器也会自动回收。 K8S官方建议使用RS(ReplicaSet)替代RC(Replication Controller)进行部署,RS跟RC没有本质的

    2024年02月09日
    浏览(62)
  • K8S之Deployment控制pod

    2024年02月09日
    浏览(57)
  • K8s Deployment挂载ConfigMap权限设置

    目录 样例 其中“defaultMode: 420”是设置权限的 在K8s(Kubernetes)中, defaultMode 是用来设置Configmap挂载后的文件权限,它采用Unix文件权限标准。 420 是8进制数字,转换成二进制是 100100000 ,转换成文件权限码就是 0644 。 文件权限码 0644 代表所有者(owner)有读/写权限(6=4+2),

    2024年02月20日
    浏览(48)
  • K8S deployment 重启的三种方法

    一般重启deployment,常规操作是删掉对应的pod, 但如果有多个副本集的话,一个个删很麻烦。 除了删除pod,还可以: PS: rollout restart需要集群版本大于1.15才能支持 以上重启方法均会生成Replicasets(副本集), 可通进行回滚:

    2024年02月14日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包