k8s控制器之Deployment第七弹之查看Deployment的状态

这篇具有很好参考价值的文章主要介绍了k8s控制器之Deployment第七弹之查看Deployment的状态。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Deployment 的生命周期中有不同状态,大致可分为三种

  • rogressing 正在执行滚动更新
  • complete
  • fail to progress

Progressing 状态

当如下任何一个任务正在执行时,kubernnete将Deployment 的状态标记为 progressing ;

  • Deployment 创建了一个新的 ReplicaSet
  • Deployment 正在 scale up 其最新的 ReplicaSet
  • Deployment 正在 scale down 其旧的 ReplicaSet
  • 新的 Pod 变为 就绪(ready)可用(available)

可以使用命令 kubectl rollout status 监控 Deployment 滚动更新的过程

Complete 状态

如果 Deployment 符合以下条件,Kubernetes 将其状态标记为 complete

  • 该 Deployment 中的所有 Pod 副本都已经被更新到指定的最新版本
  • 该 Deployment 中的所有 Pod 副本都处于 可用(available) 状态
  • 该 Deployment 中没有旧的 ReplicaSet 正在运行

以执行命令 kubectl rollout status 检查 Deployment 是否已经处于 complete 状态。如果是,则该命令的退出码为 0。

kubectl rollout status deployment.v1.apps/nginx-deployment1

输出结果:

Waiting for rollout to finish: 2 of 3 updated replicas are available...
deployment.apps/nginx-deployment successfully rolled out
$ echo $?
0

Failed 状态

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-deployment1 patched (no change)

等候时间达到后,Deployment Controller 将在 Deployment 的 .status.conditions 字段添加如下 DeploymentCondition

  • Type=Progressing
  • Status=False
  • Reason=ProgressDeadlineExceeded
  • 除了添加一个 Reason=ProgressDeadlineExceededDeploymentCondition.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
<...>

执行命令查看Deployment 的 Status 结果

kubectl get deployment nginx-deployment -o yaml

输出结果

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "3"
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"nginx-deployment1","namespace":"default"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"nginx"}},"template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx","ports":[{"containerPort":80}],"resources":{"limits":{"cpu":"100000m"}}}]}}}}
  creationTimestamp: "2023-05-29T07:12:58Z"
  generation: 6
  labels:
    app: nginx
  name: nginx-deployment1
  namespace: default
  resourceVersion: "19511985"
  uid: 78301c5d-9cf6-476b-9ee3-0d483f318df4
spec:
  progressDeadlineSeconds: 600
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.7.9
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP
        resources:
          limits:
            cpu: "100"
            memory: 512Mi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 3
  conditions:
  - lastTransitionTime: "2023-05-29T07:13:37Z"
    lastUpdateTime: "2023-05-29T07:13:37Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2023-05-29T07:59:16Z"
    lastUpdateTime: "2023-05-29T09:48:53Z"
    message: ReplicaSet "nginx-deployment1-76b7bc4447" is progressing.
    reason: ReplicaSetUpdated
    status: "True"
    type: Progressing
  observedGeneration: 6
  readyReplicas: 3
  replicas: 4
  unavailableReplicas: 1
  updatedReplicas: 1

最终,一旦 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=AvailableStatus=True 代表您的 Deployment 具备最小可用的 Pod 数(minimum availability)。Minimum availability 由 Deployment 中的 strategy 参数决定。
  • Type=ProgressingStatus=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

操作处于 Failed 状态的 Deployment

可以针对 Failed 状态下的 Deployment 执行任何适用于 Deployment 的指令。文章来源地址https://www.toymoban.com/news/detail-622295.html

  • scale up / scale down
  • 回滚到前一个版本
  • 暂停(pause)Deployment,以对 Deployment 的 Pod template 执行多处更新

到了这里,关于k8s控制器之Deployment第七弹之查看Deployment的状态的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • k8s基础4——deployment控制器、应用部署、升级、回滚、水平扩容缩容

    基本了解: Deployment是最常用的K8s工作负载控制器(Workload Controllers),实际项目部署调试中必用资源之一,所以必须要熟练掌握deploy资源的使用。 它是K8s的一个抽象概念,用于更高级层次对象,部署和管理Pod。 其他控制器还有DaemonSet、StatefulSet等,不同控制器针对不同的需

    2024年02月03日
    浏览(56)
  • K8s(Kubernetes)学习(四):Controller 控制器:Deployment、StatefulSet、Daemonset、Job

    什么是 Controller 以及作用 常见的 Controller 控制器 Controller 如何管理 Pod Deployment 基本操作与应用 通过控制器实现 Pod 升级回滚和弹性伸缩 StatefulSet 基本操作与应用 Daemonset 基本操作与应用 Job 基本操作与应用 Controller 无法解决问题 1 Controller 控制器 官网: http://kubernetes.p2hp.com/

    2024年02月09日
    浏览(56)
  • 18-k8s控制器资源-cronjob控制器

            job控制器是执行完一次任务,就结束;         cronjob控制器,是基于job控制器,定期频率性执行任务;等同于linux系统中的crontab一样; [root@k8s231 pi]# vim cronjob.yaml apiVersion: batch/v1 kind: CronJob metadata:   name: xinjizhiwa spec:   schedule: \\\"* * * * *\\\"   #定义job的模板   jobTemplate

    2024年02月22日
    浏览(72)
  • k8s 控制器

    Kubernetes(K8S)是一种开源的容器编排平台,它可以自动化地管理容器化应用程序的部署、扩展和运行。K8S中的控制器是一种重要的组件,它可以确保应用程序的状态与期望的状态一致。在K8S中,有五种常见的控制器,它们分别是: 1. ReplicaSet控制器 ReplicaSet控制器用于确保P

    2024年02月13日
    浏览(56)
  • K8s控制器

    kubectl create tabtab 下面的所有都可以创建模板文件 --dry-run=client -o yaml 查询资源对象的帮助信息         kubectl explain pod.spec.restartPolicy            #这里对上下层级关系需要清楚 获取Pod模板         kubectl run mypod --image=xxxx --dry-run=client -o yaml 获取Deployment         ku

    2024年02月03日
    浏览(69)
  • 14-k8s控制器资源-rs控制器replicasets

            replicaset副本控制器,简称:rs控制器;         用法:与rc控制器“几乎”相同;         能力:可以指定pod的副本始终存活,相比于rc控制器;支持标签匹配,也支持标签表达式         注意:不论是rc还是rs资源,都是通过“标签”惊醒匹配pod的,如果有同样

    2024年02月21日
    浏览(61)
  • k8s---pod控制器

    工作负载,workload用于管理pod的中间层,确保pod资源符合预期的状态。 预期状态: 1、副本数 2、容器重启策略 3、镜像拉取策略 pod出故障的出去等等 1、replicaset:指定pod副本的数量 三个组件:                 1、pod的副本                 2、标签选择器,判断

    2024年01月18日
    浏览(53)
  • 13-k8s的控制器资源-rc控制器replicationcontrollers

            replicationcontrollers控制器资源,简称:rc控制器;         简单理解,rc控制器就是控制相同的pod副本数量;         使用rc控制器资源创建pod,就可以设定创建pod的数量; [root@k8s231 rc]# vim rc.yaml apiVersion: v1 kind: ReplicationController metadata:   name: rc01 spec:   #控制pod的副本

    2024年02月20日
    浏览(64)
  • 17-k8s控制器资源-job控制

    job控制器:就是一次性任务的pod控制器,pod完成作业后不会重启,其重启策略是:Never         启动一个pod,执行完成一个事件,然后pod关闭;         事件:计算π的值,取前5000位; [root@k8s231 pi]# vim job.yaml apiVersion: batch/v1 kind: Job metadata:   name: job-pi spec:   #定义pod模板  

    2024年02月20日
    浏览(50)
  • 带你深入学习k8s--(四) 控制器(k8s核心)

    目录 一、概念 1、什么是控制器 2、控制器执行流程 3、控制器类型 二、控制器的使用 1、ReplicaSet 2、Deployment 1、版本迭代 2、回滚  3、修改滚动更新策略 4、暂停与恢复 3、daemonset 4、job 5、cronjob 前言: 上一章我们说到,pod有两种,分别为自主式 Pod,Pod 退出后不会被创建;

    2024年02月06日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包