Mr. Cappuccino的第40杯咖啡——Kubernetes之Pod生命周期

news2025/2/27 14:32:45

Kubernetes之Pod生命周期

      • Pod生命周期官方文档
      • Pod的状态
      • 初始化容器
        • 案例
      • 钩子函数
        • Exec命令
        • TCPSocket
        • HTTPGet
        • 案例
      • 容器探测
        • Exec命令
        • TCPSocket
        • HTTPGet
        • 探测时间
      • 重启策略

Pod生命周期官方文档

Pod生命周期官方文档

Pod的状态

  1. pending:挂起,apiserver创建了pod资源对象已存入etcd中,但它尚未被调度完成,或者仍处于从仓库下载镜像的过程中;
  2. running:运行中,pod已经被调度到某节点,并且所有容器都已经被kubelet创建完成;
  3. complet:成功,pod中所有容器都已经成功终止并且不会重启;
  4. failed:失败,pod中所有容器都已经终止了,并且至少有一个容器是因为失败终止的,即容器以非0状态退出或者被系统禁止;
  5. unknown:未知,apiserver无法正常获取到pod对象的状态信息,通常是由于无法与所在工作节点的kubelet通信所致;

初始化容器

  1. k8s的初始化容器(initContainer)优先级都是高于主容器(container)的。无论容器写在初始化容器前还是写在初始化容器后,会最先执行的都是初始化容器。只有初始化容器执行成功后才可以启动主容器。
  2. 初始化容器的应用场景应该是多pod。比如:mysql和业务分开两个pod。此时,业务pod添加初始化容器,初始化容器执行telnet,检查mysql是否启动了。若mysql启动,则业务pod启动;否则业务pod等待mysql启动。

初始化容器是在pod主容器启动之前要运行的容器,主要是做一些主容器的前置工作,它具有两大特征:

  1. 初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么kubernetes需要重启它直到成功完成;
  2. 初始化容器必须按照定义的顺序执行,当且仅当前一个成功之后,后面的一个才能运行;

案例

apiVersion: v1
kind: Pod
metadata:
  name: pod-initcontainer
  namespace: bubble-dev
spec:
  containers:
  - name: main-container
    image: nginx:1.17.9
    ports:
    - name: nginx-port
      containerPort: 80
  initContainers:
  - name: mysql
    image: busybox:1.30  
    command: [ "/bin/sh","-c","sleep 40;"]   
  - name: redis
    image: busybox:1.30

busybox:1.30启动成功之后,会立即停止,通过使用command命令,40S之后这个容器才会停止;
启动主容器(main-container)必须等待初始化容器(mysql和redis)启动并运行成功之后,才可以启动;

vi pod-initcontainer.yaml
cat pod-initcontainer.yaml
kubectl create ns bubble-dev
kubectl create -f pod-initcontainer.yaml

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

[root@master ~]# kubectl describe pods -n bubble-dev
Name:         pod-initcontainer
Namespace:    bubble-dev
Priority:     0
Node:         node1/192.168.102.160
Start Time:   Thu, 12 Jan 2023 10:44:14 -0500
Labels:       <none>
Annotations:  <none>
Status:       Running
IP:           172.17.0.2
IPs:
  IP:  172.17.0.2
Init Containers:
  mysql:
    Container ID:  docker://6c41381ade3cb74d93b4b449920a89ce1b534860da4a3803d886389b7873f5c4
    Image:         busybox:1.30
    Image ID:      docker-pullable://busybox@sha256:4b6ad3a68d34da29bf7c8ccb5d355ba8b4babcad1f99798204e7abb43e54ee3d
    Port:          <none>
    Host Port:     <none>
    Command:
      /bin/sh
      -c
      sleep 40;
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Thu, 12 Jan 2023 10:44:16 -0500
      Finished:     Thu, 12 Jan 2023 10:44:56 -0500
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-9bq4c (ro)
  redis:
    Container ID:   docker://8a504efac19030ab4a266599795e7ad1368f351f48eae8eb45101100aec0dec1
    Image:          busybox:1.30
    Image ID:       docker-pullable://busybox@sha256:4b6ad3a68d34da29bf7c8ccb5d355ba8b4babcad1f99798204e7abb43e54ee3d
    Port:           <none>
    Host Port:      <none>
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Thu, 12 Jan 2023 10:44:57 -0500
      Finished:     Thu, 12 Jan 2023 10:44:57 -0500
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-9bq4c (ro)
Containers:
  main-container:
    Container ID:   docker://920298ed4e9f76c825249290078a9a408476df66175e6fc8b9dcdaf25346f324
    Image:          nginx:1.17.9
    Image ID:       docker-pullable://nginx@sha256:88ea86df324b03b3205cbf4ca0d999143656d0a3394675630e55e49044d38b50
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Thu, 12 Jan 2023 10:44:58 -0500
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-9bq4c (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-9bq4c:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-9bq4c
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  4m47s  default-scheduler  Successfully assigned bubble-dev/pod-initcontainer to node1
  Normal  Pulled     4m46s  kubelet, node1     Container image "busybox:1.30" already present on machine
  Normal  Created    4m46s  kubelet, node1     Created container mysql
  Normal  Started    4m45s  kubelet, node1     Started container mysql
  Normal  Pulled     4m4s   kubelet, node1     Container image "busybox:1.30" already present on machine
  Normal  Created    4m4s   kubelet, node1     Created container redis
  Normal  Started    4m4s   kubelet, node1     Started container redis
  Normal  Pulled     4m3s   kubelet, node1     Container image "nginx:1.17.9" already present on machine
  Normal  Created    4m3s   kubelet, node1     Created container main-container
  Normal  Started    4m3s   kubelet, node1     Started container main-container

在这里插入图片描述
我们可以分析出Pod中首先启动并运行的是mysql容器,mysql容器运行成功后,redis容器开始启动并运行,完成运行后主容器才开始启动。

钩子函数

k8s在主容器启动之后和停止之前提供了两个钩子函数

  1. post-start:容器创建之后执行(相关命令),如果失败了则会自动重启容器,容器创建后立即执行,注意由于是异步执行,它无法保证一定在ENTRYPOINT之前运行。如果失败,容器会被杀死,并根据RestartPolicy决定是否重启;
  2. pre-stop:容器终止之前执行(相关命令) ,例如杀死进程等,容器终止前执行,常用于资源清理。执行完成之后容器将成功终止,如果失败,容器同样也会被杀死。在其完成之前,会阻塞删除容器的操作;

钩子的回调函数支持三种方式:Exec命令、TCPSocket、HTTPGet

Exec命令

spec:
  containers:
  - name: main-container
    image: nginx:1.17.1
    lifecycle:
      postStart:
        exec: # 容器创建之后执行(相关命令)修改nginx页面
          command: ["/bin/sh","-c","echo honey > /usr/share/nginx/html/index.html"]
      preStop:
        exec: # 容器停止之后执行停止nginx服务
          command: ["/usr/sbin/nginx","-s","quit" ]

TCPSocket

spec:
  containers:
  - name: main-container
    image: nginx:1.17.1
    lifecycle:
      postStart:
      	tcpSocket:
        	port: 8080

HTTPGet

spec:
  containers:
  - name: main-container
    image: nginx:1.17.1
    lifecycle:
      postStart:
	    httpGet:
	      path: /init  # URI地址
	      port: 80     # 端口号
	      host: 192.168.110.1 # 主机地址
	      scheme: HTTP # 支持的协议,http或https

案例

apiVersion: v1
kind: Pod
metadata:
  name: pod-hook
  namespace: bubble-dev
spec:
  containers:
  - name: main-container
    image: nginx:1.17.9
    lifecycle:
      postStart:
        exec: # 容器创建之后执行(相关命令)修改nginx页面
          command: ["/bin/sh","-c","echo honey > /usr/share/nginx/html/index.html"]
      preStop:
        exec: # 容器停止之后执行停止nginx服务
          command: ["/usr/sbin/nginx","-s","quit" ]

在这里插入图片描述
在这里插入图片描述

容器探测

k8s提供了livenessProbe(可用性探针)和readinessProbe(就绪性探针)对容器的健康性进行检测,类似心跳机制。
判断我们的应用实例是否存活,如果为宕机状态,则自动重启,同时如果发现该pod无法接受请求,则service不会转发到该pod上执行。

  1. 存活探针(可用性探针):用于检测容器实例当前是否处于正常运行的状态,如果不是正常运行的状态,k8s则会重启容器;
  2. 就绪探针(就绪性探针):用于检测应用实例当前是否可以接收请求,如果不能接收请求,k8s不会将请求转发到该实例;

其实非常好理解,livenessProbe 判断容器是否重启、readinessProbe 判断是否路由转发

支持三种探测方式:

  1. Exec命令:在容器内执行一次命令,如果命令执行的退出码为0,则认为程序正常,否则不正常;
  2. TCPSocket:会尝试访问一个用户指定的容器端口,如果能够成功建立连接则认为正常,否则认为不正常;
  3. HTTPGet:调用容器内Web系统的url,如果http状态码是在200和399之间,则认为程序正常,否则不正常;

Exec命令

apiVersion: v1
kind: Pod
metadata:
  name: pod-exec
  namespace: bubble-dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9
    ports:
    - name: nginx-port
      containerPort: 80
    livenessProbe: # 存活探针(可用性探针)
      exec:        # 执行一个查看文件的命令
        command: ["/bin/cat" ,"/tmp/honey.txt"] 

在这里插入图片描述
在这里插入图片描述
我们可以看到,由于没有/tmp/honey.txt这个文件,执行的查看命令是失败的,所以容器一直在进行重新启动操作

如果将命令修改成pwd则不会有问题

apiVersion: v1
kind: Pod
metadata:
  name: pod-exec
  namespace: bubble-dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9
    ports:
    - name: nginx-port
      containerPort: 80
    livenessProbe: # 存活探针(可用性探针)
      exec:        # 执行一个pwd的命令
        command: ["/bin/pwd" ,"/"] 

TCPSocket

apiVersion: v1
kind: Pod
metadata:
  name: pod-tcp
  namespace: bubble-dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9
    ports:
    - name: nginx-port
      containerPort: 80
    livenessProbe: # 存活探针(可用性探针)
      tcpSocket:   # 底层会尝试访问容器ip:8080
        port: 8080

在这里插入图片描述
在这里插入图片描述
将端口号修改成80则不会有问题

apiVersion: v1
kind: Pod
metadata:
  name: pod-tcp
  namespace: bubble-dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9
    ports:
    - name: nginx-port
      containerPort: 80
    livenessProbe: # 存活探针(可用性探针)
      tcpSocket:   # 底层会尝试访问容器ip:80
        port: 80

HTTPGet

apiVersion: v1
kind: Pod
metadata:
  name: pod-http
  namespace: bubble-dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP
    livenessProbe:
      httpGet:   # 访问指定的scheme://host:port/path
        scheme: HTTP # 支持的协议,http或者https
        port: 80 # 端口号
        path: /honey # URI地址 该地址不存在会报错404

在这里插入图片描述
在这里插入图片描述
将URI地址修改成 / 则不会有问题

apiVersion: v1
kind: Pod
metadata:
  name: pod-http
  namespace: bubble-dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP
    livenessProbe:
      httpGet:   # 访问指定的scheme://host:port/path
        scheme: HTTP # 支持的协议,http或者https
        port: 80 # 端口号
        path: /  # URI地址

探测时间

容器探测的原理本身就是心跳策略

initialDelaySeconds <integer>    # 容器启动后 等待多少秒 开始执行第一次探测
timeoutSeconds <integer>         # 探测超时时间 默认1秒,最小1秒
periodSeconds <integer>          # 执行探测的频率,默认是10秒,最小1秒
failureThreshold <integer>       # 连续探测失败多少次才被认定为失败,默认是3,最小值是1
successThreshold <integer>       # 连续探测成功多少次才被认定为成功,默认是1
apiVersion: v1
kind: Pod
metadata:
  name: pod-seconds
  namespace: bubble-dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP
    livenessProbe:
      httpGet:   # 访问指定的scheme://host:port/path
        scheme: HTTP # 支持的协议,http或者https
        port: 80 # 端口号
        path: /honey # URI地址 该地址不存在会报错404
      initialDelaySeconds: 10 # 容器启动后10s开始探测   
      failureThreshold: 2     # 探测2次认为是失败
  restartPolicy: Never        # 设置重启策略为Never 无论状态如何都不会重启

在这里插入图片描述
在这里插入图片描述

重启策略

重启策略有三种:

  1. Always:出现问题时自动重启该容器,默认方式
  2. OnFailure:容器终止运行且退出码不为0时重启
  3. Never:不论状态为何,都不重启该容器
apiVersion: v1
kind: Pod
metadata:
  name: pod-restart
  namespace: bubble-dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP
    livenessProbe:
      httpGet:   # 访问指定的scheme://host:port/path
        scheme: HTTP # 支持的协议,http或者https
        port: 80 # 端口号
        path: /honey # URI地址 该地址不存在会报错404
  restartPolicy: Never # 设置重启策略为Never 无论状态如何都不会重启

在这里插入图片描述

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

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

相关文章

2月第2周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年2月6日-2月12日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B站…

python基于django+vue微信小程序的校园跑腿平台

随着计算机技术的高速发展,现代计算机系统已经从以计算为中心向以信息化处理为中心的方向发展。而校园跑腿服务系统,不仅需要在硬件上为现代社会的学生们提供一个学习知识,获取知识的环境,更要在软件上为愿意上课的人提供必要的便利。于是校园跑腿服务系统系统便应运而生。 目前…

企业与第三方供应商合作时,会存在哪些安全风险?

随着现代社会的发展&#xff0c;企业供应链、产业供应链已日渐成熟。其中&#xff0c;供应商与企业的关系也由最初的纯粹买卖关系发展成了合作伙伴关系。在整个供应链体系中&#xff0c;供应商与其受众承担着供应链中环环相扣的责任&#xff0c;可以说&#xff0c;企业安全的薄…

站在行业C位,谷医堂打开健康管理服务新思路

对于农村及贫困地区老百姓来说&#xff0c;由于交通因素和家庭经济条件制约&#xff0c;看病难致身体调理情况一直不太乐观&#xff0c;这也导致心理压力很大。然而&#xff0c;随着近年中医药产业崛起与快速发展&#xff0c;这种局面很快就会得到改观&#xff0c;以湖南谷医堂…

MySQL InnoDB表的碎片量化和整理(data free能否用来衡量碎片?)

网络上有很多MySQL表碎片整理的问题&#xff0c;大多数是通过demo一个表然后参考data free来进行碎片整理&#xff0c;这种方式对myisam引擎或者其他引擎可能有效&#xff08;本人没有做详细的测试&#xff09;.对Innodb引擎是不是准确的&#xff0c;或者data free是不是可以参…

让逆向工程师们头疼的代码混淆,就像永远也走不出的“浪浪山”

目录 代码混淆究竟是什么&#xff1f; 如何做代码混淆&#xff1f; 代码混淆不等于加密 App 加固非一时之功 “我想离开浪浪山。” 在数次尝试破解某个App 时&#xff0c;某个逆向工程师无奈感慨道。 逆向工程师顾名思义就是把一个个完整的软件逆推&#xff0c;还原成一段段…

【MySQL】数据库操作

文章目录1、创建和管理数据库1.1 创建数据库1.2 查看数据库1.3 修改数据库1.4 删除数据库2、 创建表2.1 创建表CREATE2.2 创建表AS3、修改表3.1 添加列 ALTERT TABLE ADD3.2 修改列 ALTER TABLE MODIFY3.3 重命名列 ALTER TABLE CHANGE3.4 删除列 ALTER TABLE DROP4、重命名表 …

一文讲透丨如何破解安全应用容器架构的17大挑战!

众所皆知&#xff0c;云计算/云原生技术因能极大地提高云上资源利用率以及应用交付效率而被广泛采用。然而&#xff0c;云计算/云原生技术的发展也让用户遭受了更多高级威胁与攻击。如何构建有效的云原生安全管理体系应对层出不穷的安全威胁这一问题也一直受到千行百业用户的关…

Keras深度学习实战——使用深度Q学习进行SpaceInvaders游戏

Keras深度学习实战——使用深度Q学习进行SpaceInvaders游戏 0. 前言1. 问题与模型分析2. 使用深度 Q 学习进行 SpaceInvaders 游戏相关链接0. 前言 在《深度Q学习算法详解》一节中,我们使用了深度 Q 学习来进行 Cart-Pole 游戏。在本节中,我们将利用深度Q学习来玩“太空侵略…

CHAPTER 2 Zabbix界面操作

Zabbix界面操作2.1 Zabbix界面操作1.zabbix的web界面安装2.添加监控信息3.查看监控内容4.查看图像2.2 自定义监控与监控报警1.自定义监控1.1 说明1.2 预备知识2.实现自定义监控2.1 自定义语法2.2 agent注册2.3 在server端注册(web操作)2.4 查看监控图形2.3 监控报警1.第三方报警…

hive实现oracle merge into matched and not matched

create database cc_test; use cc_test; table1 可以理解为记录学生最好成绩的表。 table2可以理解为每次学生的考试成绩。 我们要始终更新table1的数据 create table table1 (id string ,maxScore string );create table table2 (id string ,score string );insert into table…

用于汽车传感器的混合点云语义压缩:性能评估

Hybrid Point Cloud Semantic Compression for Automotive Sensors: A Performance Evaluation https://arxiv.org/pdf/2103.03819.pdf 在自动驾驶中&#xff0c;车辆与车辆之间的信息共享起着重要作用。在所有传感器中&#xff0c;激光雷达产生的3D点云的数据量通常较高。因…

设计模式实践示例

以下是我针对自己所掌握的知识出的设计模式题目&#xff0c;有不足的地方欢迎指摘。 一、设计模式原则 设计模式原则有哪些&#xff1f; 1.开闭原则&#xff1a;对扩展开放&#xff0c;对修改关闭 2.接口隔离原则&#xff1a;每个接口只完成单独业务的部分&#xff0c;不要将…

设计模式之工厂模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、工厂模式是什么&#xff1f; 工厂模式是一种创建型的软件设计模式。定义一个用于创建对象的工厂接口&#xff0c;并让工厂子类…

MybatisPlus------application文件配置新增SQL打印以及测试类编写(二)

MybatisPlus------application文件配置新增SQL语句打印以及测试类编写 增加日志打印&#xff0c;具体打印执行的SQL语句。 操作&#xff1a; 只需在application配置文件中增加如下配置&#xff1a; mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout…

快递员配送手机卡,要求当面激活有“猫腻”吗?

咨询&#xff1a;快递员配送手机卡&#xff0c;要求当面激活有“猫腻”吗&#xff1f;有些朋友可能在网上看到了一些关于快递小哥激活会采集信息的文章&#xff0c;所以觉得让快递小哥激活流量卡并不安全&#xff0c;其实&#xff0c;哪有这么多的套路&#xff0c;只要你自己在…

一文看懂Java语言与Java生态圈

Java语言与Java生态圈 1、Oracle JDK与Open JDK之间的关系 Oracle JDK Java最早是由SUN公司发明&#xff0c;Oracle JDK之前叫SUN JDK&#xff0c;显而易见&#xff0c;这是在2009年Oracle收购SUN公司之前&#xff0c;收购之后被名为Oracle JDK&#xff0c;实际上&#xff0…

【图文教程】笔记本总是自动关机怎么办?win11自动关机问题解决方案

使用场景及环境&#xff1a; 日常使用&#xff0c;代码、文档使用。 系统&#xff1a;win11、win10、win8、win7笔记本都可通用 笔记本&#xff1a;联想ThinkPad E450 笔记本相关性能参数 设备名称 XXX 处理器 Intel Core™ i3-8145U CPU 2.10GHz 2.30 GHz 机带 RAM 8.00 GB (…

JavaEE——MyBatis的简单介绍和使用

MyBatis是什么 MyBatis是一个支持普通SQL查询&#xff0c;存储过程以及高级映射的持久层框架&#xff0c;他消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索&#xff0c;使用简单的XML或注解进行配置和原始映射&#xff0c;将接口和Java的POJO映射成数据库中的记…

StarUML画流程图

1. 前言 工作中&#xff0c;在写文档总结时&#xff0c;对于需求的理解总有一个重要的环节&#xff0c;那就是画流程图&#xff0c;Ubuntu下我推荐使用StartUML 来画&#xff0c;嘎嘎好用&#xff0c;如果不知道这个工具&#xff0c;请参考笔者这篇文章下载安装&#xff1a; U…