Pod生命周期

news2024/10/1 14:00:00

Pod生命周期

  • Pod创建过程
  • 运行初始化容器过程
  • 运行主容器过程
    • 容器启动后钩子,容器终止前钩子
    • 容器存活性,就绪性探测
  • Pod终止过程

在这里插入图片描述

在整个Pod生命周期,会出现5中状态:

取值描述
Pending(悬决)Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间。
Running(运行中)Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。
Succeeded(成功)Pod 中的所有容器都已成功终止,并且不会再重启。
Failed(失败)Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。
Unknown(未知)因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。

创建和终止

创建

  1. 用户通过kubectl或其他api客户端提交创建pod信息给apiserver
  2. apiserver生产pod对象信息,并存入etcd,然后返回确认信息至客户端
  3. apiserver反应ectd中pod对象变化,其他组件使用watch机制跟踪apiserver
  4. scheduler发现有新的pod对象要创建,开始为pod分配主机并将结果信息更新至apiserver
  5. node节点上kebelet发现有pod调度过来,尝试使用docker启动容器,并将结果送到apiserver
  6. apiserver将接收到的pod信息存入etcd中

终止

  1. 用户向apiserver发出删除pod命令
  2. apiserver中的pod信息会变化,在宽限期(30s),pod被视为dead
  3. pod标记为terminating标记
  4. kubelet监控到pod对象转为terminating状态同时启动pod关闭过程
  5. 端点控制器监控到pod对象的关闭行为时将其从所以匹配到此端点的service资源的端点列表一处
  6. 如果当前pod对象定义了preStop钩子处理器,则在其标记terminating后会以同步的方式启动
  7. pod中容器进程收到停止信号
  8. 宽限期结束,若pod还存在仍在运行的进程,pod对象会受到立即终止信号
  9. kubelet将pod资源宽限期设置为0从而完成操作,此时pod对于用户已经可不见

初始化容器

初始化容器在Pod的主容器启动之前要运行的容器。(完成主容器前置工作)

  • 初始化容器必须运行完成至结束,否则k8s需要重启它直至成功
  • 必须按照定义的顺序执行

初始化容器场景:

  • 提供主容器镜像中不具备的工具程序或自定义代码
  • 初始化容器要咸鱼应用容器串行启动并运行完成,可用于容器启动直至其依赖的条件得到满足(感觉有点类似于docker拉取镜像,如果镜像依赖于其他服务,就先拉取其他镜像资源,一层一层叠加)

案例

  • 需要主容器运行nginx

  • 运行nginx前需要nginx先连接上mysql和redis所在服务器

  • 提前规定服务器地址

    • mysql:192.168.126.129

    • redis: 192.168.126.130

创建pod-initcontainer.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: pod-initcontainer
  namespace: dev
spec:
  containers:
  - name: main-container
    image: nginx:1.17.1
    ports: 
    - name: nginx-port
      containerPort: 80
  initContainers:
  - name: test-mysql
    image: busybox:1.30
    command: ['sh', '-c', 'until ping 192.168.126.129 -c 1 ; do echo waiting for mysql...; sleep 2; done;']  #直到ping通才停止
  - name: test-redis
    image: busybox:1.30
    command: ['sh', '-c', 'until ping 192.168.126.130 -c 1 ; do echo waiting for reids...; sleep 2; done;']

我这两个服务器IP地址有效,可以ping通:

[root@master ~]# cd  mine/
[root@master mine]# vim pod-initcontainer.yaml
[root@master mine]# kubectl create -f pod-initcontainer.yaml
pod/pod-initcontainer created
[root@master mine]# kubectl get pod -n dev
NAME                READY   STATUS    RESTARTS   AGE
pod-initcontainer   1/1     Running   0          16s

可以尝试切换无法到达的IP进行尝试,主容器应该无法创建

钩子函数

允许用户自己定义行为代码,完成一些指定的功能

钩子函数支持三种方式定义动作:

  • Exec:在容器内执行一次命令

    ……
      lifecycle:
        postStart: 
          exec:
            command:
            - cat
            - /tmp/healthy  #查看/tmp/healthy
    ……
    
  • TCPSocket:在当前容器尝试访问指定的socket

    ……      
      lifecycle:
        postStart:
          tcpSocket:
            port: 8080
    ……
    
  • HTTPGet:在当前容器中向某个url发起http请求

    ……
      lifecycle:
        postStart:
          httpGet:
            path: / #URI地址
            port: 80 #端口号
            host: 192.168.109.100 #主机地址
            scheme: HTTP #支持的协议,http或者https
    ……
    

新建一个pod-hook-exec.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: pod-hook-exec
  namespace: dev
spec:
  containers:
  - name: main-container
    image: nginx:1.17.1
    ports:
    - name: nginx-port
      containerPort: 80
    lifecycle:
      postStart: 
        exec: # 在容器启动的时候执行一个命令,修改掉nginx的默认首页内容
          command: ["/bin/sh", "-c", "echo postStart... > /usr/share/nginx/html/index.html"]
      preStop:
        exec: # 在容器停止之前停止nginx服务
          command: ["/usr/sbin/nginx","-s","quit"]
[root@master mine]# kubectl create -f pod-hook-exec.yaml
pod/pod-hook-exec created
[root@master mine]# kubectl get pod -n dev -o wide
NAME            READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
pod-hook-exec   1/1     Running   0          39s   10.244.2.8   node2   <none>           <none>
[root@master mine]# curl 10.244.2.8:80
postStart...

容器探测

用于检测容器中应用实例能否正常运行,如果实例状态不符合预期,那么k8s就会把问题实例摘除,不承担业务流量,k8s提供两种探针实现:

  • liveness probes:存活性探针,检测应用实例是否处于正常状态,若不是k8s会重启实例

  • readlness probes:就绪性探针,用于检测应用实例是否可以接受请求,如果不能,k8s不会转发流量

    三种探测方式:

    • Exec:在容器内执行一次命令,如果命令执行退出码为0,认为程序正常,否则不正常

      ……
        livenessProbe:
          exec:
            command:
            - cat
            - /tmp/healthy
      ……
      
    • TCPSocket:将会尝试访问一个用户容器的端口,如果能够建立这条连接,则认为程序正常,否则不正常

      ……      
        livenessProbe:
          tcpSocket:
            port: 8080
      ……
      
    • HTTPGet:调用容器内Web应用的URL,如果返回的状态码在200和399之间,则认为程序正常,否则不正常

      ……
        livenessProbe:
          httpGet:
            path: / #URI地址
            port: 80 #端口号
            host: 127.0.0.1 #主机地址
            scheme: HTTP #支持的协议,http或者https
      ……
      

以livenessProbe为例,新建

新建test1.yaml文件:

apiVersion: v1
kind: Pod
metadata:
  name: pod-liveness-exec
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    ports: 
    - name: nginx-port
      containerPort: 80
    livenessProbe:
      exec:
        command: ["/bin/cat","/tmp/hello.txt"] # 执行一个查看文件的命令

默认情况下没有这个文件,所以它会重启容器

#创建Pod
[root@master mine]# vim test1.yaml
[root@master mine]# kubectl create -f test1.yaml
pod/pod-liveness-exec created
[root@master mine]# kubectl get pod -n dev
NAME                READY   STATUS    RESTARTS   AGE
pod-liveness-exec   1/1     Running   0          19s
#查看详情
[root@master mine]# kubectl describe pods pod-liveness-exec -n dev
.......
  Warning  Unhealthy  9s (x6 over 59s)  kubelet, node2     Liveness probe failed: /bin/cat: /tmp/hello.txt: No such file or directory
  Normal   Killing    9s (x2 over 39s)  kubelet, node2     Container nginx failed liveness probe, will be  restarted 
  #没有这个文件niginx容器重启 
[root@master mine]# kubectl get pod -n dev
NAME                READY   STATUS             RESTARTS   AGE
pod-liveness-exec   0/1     CrashLoopBackOff   6          4m43s
#RESTARTS重启次数已经变成三次


#删除这个Pod
[root@master mine]# kubectl delete -f test1.yaml
pod "pod-liveness-exec" deleted
#修改yaml文件
[root@master mine]# kubectl create -f test1.yaml
pod/pod-liveness-exec created
[root@master mine]# cat test1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-liveness-exec
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    ports:
    - name: nginx-port
      containerPort: 80
    livenessProbe:
      exec:
        command: ["/bin/ls","/tmp/"] # 执行一个查看文件的命令
#这条命令是可以执行的
[root@master mine]# kubectl describe pods pod-liveness-exec -n dev
....
  Normal  Created    65s   kubelet, node2     Created container nginx
  Normal  Started    65s   kubelet, node2     Started container nginx
  #发现没有重启
[root@master mine]# kubectl get pod -n dev
NAME                READY   STATUS    RESTARTS   AGE
pod-liveness-exec   1/1     Running   0          2m36s

重启策略

Pod 的 spec 中包含一个 restartPolicy 字段,其可能取值包括 Always、OnFailure 和 Never。默认值是 Always。

restartPolicy 适用于 Pod 中的所有容器。restartPolicy 仅针对同一节点上 kubelet 的容器重启动作。当 Pod 中的容器退出时,kubelet 会按指数回退方式计算重启的延迟(10s、20s、40s、…),其最长延迟为 5 分钟。 一旦某容器执行了 10 分钟并且没有出现问题,kubelet 对该容器的重启回退计时器执行重置操作。

  • Always:容器失效,自动重启容器
  • OnFailure:容器终止运行且退出码不为0时重启
  • Never:无论状态如何从不重启

创建pod-restartpolicy.yaml文件:

apiVersion: v1
kind: Pod
metadata:
  name: pod-restartpolicy
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    ports:
    - name: nginx-port
      containerPort: 80
    livenessProbe:
      httpGet:
        scheme: HTTP
        port: 80
        path: /hello  #没有这个路径所以无法访问
  restartPolicy: Never # 设置重启策略为Never
#创建Pod
[root@master mine]# vim pod-restartpolicy.yaml
[root@master mine]# kubectl create -f pod-restartpolicy.yaml
pod/pod-restartpolicy created
#查看是否重启
[root@master mine]# kubectl get pod -n dev
NAME                READY   STATUS      RESTARTS   AGE
pod-restartpolicy   0/1     Completed   0          111s
#发现并没有重启
#查看详细信息
[root@master mine]# kubectl describe pod pod-restartpolicy -n dev
....
  Warning  Unhealthy  3m11s (x3 over 3m31s)  kubelet, node2     Liveness probe failed: HTTP probe failed with statuscode: 404
  Normal   Killing    3m11s                  kubelet, node2     Stopping container nginx
#返回404未找到但是由于设置了重启策略为Never所以不重启

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/584903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聚数成峰,共赢未来,openGauss Developer Day 2023在京举行

[2023年5月26日 中国 北京]5月25日-26日&#xff0c;以“聚数成峰&#xff0c;共赢未来”为主题的 openGauss Developer Day 2023&#xff08;openGauss开发者大会2023&#xff09;在北京举办。本届大会在中国计算机学会、国家工业信息安全发展研究中心指导下&#xff0c;由ope…

Springboot +spring security,认证方式---Form表单认证的实现(一)

一.简介 这篇文章来学习下security的认证方式其中的Form表单认证 二.Spring Security的认证方式 2.1什么是认证 认证: 就是用来判断系统中是否存在某用户&#xff0c;并判断该用户的身份是否合法的过程&#xff0c;解决的其实是用户登录的问题。认证的存在&#xff0c;是为…

数据挖掘实战(以kaggle为例)

第一课 主要分为以下内容进行讲述 机器学习工业应用领域 机器学习常用算法 机器学习常用工具 解决问题流程 数据的处理比模型更为重要 老师的博客&#xff0c;内容很详细 数据预处理 有时候可以一个feature一个feature去做 特征工程 模型选择 模型状态评估 模型融合 B…

消息通知配置-shorp

消息通知配置 注意事项&#xff1a; 消息均采用异步发送&#xff0c;请提前配置好队列&#xff0c;点这里配置队列配置完之后请别忘记在列表切换消息为启用状态 模板消息配置方式 (以订单发货通知为例) 准备工作 查看后台 消息通知 -》 消息配置 -》 订单发货通知编辑 微信公…

牛客网基础语法1~10题

牛客网基础语法1~10题 前言&#xff1a;今天是咱们第一期刷牛客网上的题目。 目标&#xff1a;掌握基础编程&#xff0c;打牢基础知识&#xff0c;有一定的编程思想 鸡汤&#xff1a;读不在三更五鼓&#xff0c;功只怕一曝十寒。先干为敬&#xff0c;大家随意。 第一题 #includ…

内网环境制作nacos镜像

1. 拉取用于构建的镜像 git clone https://github.com/nacos-group/nacos-docker.git 拉去下来是这样的 下载nacos压缩包 https://github.com/alibaba/nacos/tags 以2.2.2版本为例 将下载的压缩包&#xff0c;放到build文件夹 3. 修改Dockerfile文件 4.将build下的文件上…

复杂的网络

文章目录 1 查看windows的网络信息2 桥接模式和NAT模式3 连接开发板和虚拟机4. 网络分层、TCP、IO多路复用5. 家里的网络是怎么连接的 1 查看windows的网络信息 打开设置-网络查看 也可以直接cmd ipconfig 这次的网络连接&#xff08;我连接的手机热点&#xff09;是通过Inte…

由于找不到msvcr110.dll 无法继续执行怎么解决(最新解决方法分享)

MSVCR110.dll是Windows操作系统中的一个重要文件&#xff0c;一旦它出现丢失问题&#xff0c;会导致影响计算机整体的问题。这个跟MSVCP110.dll类似的误报&#xff0c;通常是由于安装编程工具或 部分无法正确安装所导致的问题。在这篇文章中&#xff0c;我们将一些解决此问题的…

Vulkan Tutorial 6 统一缓冲区

目录 20 layout and buffer 顶点着色器 描述符集布局 21 统一缓冲区 更新统一数据 22 Descriptor pool and sets 描述符池 描述符集 使用描述符集 对齐要求 20 layout and buffer 我们现在可以将任意属性传递给每个顶点的顶点着色器&#xff0c;模型-视图-投影矩阵将…

【干货分享】一篇文章帮你搞定前端高频面试题

前言 如今前端技术日新月异。对于前端开发人员来说&#xff0c;不仅需要掌握最新的前沿技术&#xff0c;还需要保持对基础知识的熟练掌握。而面试则是进入优秀企业的必经之路。在面试中&#xff0c;高频面试题的掌握是获得成功的关键。本文将为大家总结前端高频面试题及其答案&…

网络爬虫是什么

网络爬虫又称网络蜘蛛、网络机器人&#xff0c;它是一种按照一定的规则自动浏览、检索网页信息的程序或者脚本。网络爬虫能够自动请求网页&#xff0c;并将所需要的数据抓取下来。通过对抓取的数据进行处理&#xff0c;从而提取出有价值的信息。 认识爬虫 我们所熟悉的一系列…

23种设计模式之备忘录模式(Memento Pattern)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将23种设计模式中的备忘录模式&#xff0c;此篇文章为一天学习一个设计模式系列文章&#xff0c;后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬…

高精度电压源如何设计出来的

高精度电压源是一种用于提供高精度电压的电子设备&#xff0c;通常用于测量和控制系统。高精度电压源的设计是一个复杂的过程&#xff0c;需要考虑多个因素&#xff0c;包括电路设计、元件选型、测量误差、稳定性等。下面将从电路设计和元件选型两个方面&#xff0c;详细介绍高…

如果通过Map转换成指定的class类

文章目录 前言如果通过Map转换成指定的class类1. 依赖2. 前期准备3. 测试 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话…

自然语言处理实战项目8- BERT模型的搭建,训练BERT实现实体抽取识别的任务

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目8- BERT模型的搭建&#xff0c;训练BERT实现实体抽取识别的任务。BERT模型是一种用于自然语言处理的深度学习模型&#xff0c;它可以通过训练来理解单词之间的上下文关系&#xff0c;从而为下游…

spring boot--web响应

2. 响应 前面我们学习过HTTL协议的交互方式&#xff1a;请求响应模式&#xff08;有请求就有响应&#xff09; 那么Controller程序呢&#xff0c;除了接收请求外&#xff0c;还可以进行响应。 2.1 ResponseBody 在我们前面所编写的controller方法中&#xff0c;都已经设置了…

spring集成mybatis

目录 (1)新建javaEE web项目 ​(2)加入相关依赖的坐标 (3) 创建相应的包和类 (4) 配置spring和mybatis的配置文件 在resources中建mybatis-config.xml 在 resources中建spring.xml 在 resources中建db.xml 在 resources中建config.propertis 集成mybatis配置 ,导入myb…

MyBatis参数传递(提供ParamNameResolver类来进行参数封装)源码分析

MyBatis接口方法中可以接收各种各样的参数&#xff0c;MyBatis底层对于这些参数进行不同的封装处理方式。 单个参数&#xff1a;实体类、Map集合、Collection、List、Array以及其他类型。 多个参数&#xff1a;Param注解定义的名称要与sql语句中参数占位符中的名称相同。 这里…

RDD缓存有哪些特点?

RDD之间进行相互迭代计算(Transformation的转换)&#xff0c;当执行开启后&#xff0c;新RDD的生成&#xff0c;代表老RDD的消失。RDD的数据是过程数据&#xff0c;只在处理的过程中存在&#xff0c;一旦处理完成&#xff0c;就不见了。这个特性可以最大化的利用资源&#xff0…

【CSAPP】Binarybomb 实验(phase_1-6+secret_phase)

Binarybomb 实验&#xff08;phase_1-6secret_phase&#xff09; 实验内容 一个“binary bombs”&#xff08;二进制炸弹&#xff0c;下文将简称为炸弹&#xff09;是一个Linux可执行C程序&#xff0c;包含了7个阶段&#xff08;phase1~phase6和一个隐藏阶段&#xff09;。炸…