k8s上Pod生命周期、重启策略、容器探测简介

目录

一.Pod的创建过程

二.Pod的终止过程

三.Pod的重启策略(restartPolicy)

1.Always

2.OnFailture

3.Never

4.示例

四.Pod生命周期内的5种状态(相位)

1.Pending

2.Running

3.Succeeded

4.Failed

5.Unknown

五.初始化容器(init container)

1.运行初始化容器

2.以一个案例进行验证初始化容器的重要性

(1)首先只为mysql提供一个IP地址,tomcat的还没有提供

(2)编写文件

(3)应用验证

(4)为redis提供可用IP地址,并应用验证

六.主容器(main container)

1.钩子函数简介

(1)exec,只在容器内执行一次

(2)tcpSocket,在当前的容器中尝试访问指定socket,成功后继续执行

(3)httpGet,在当前的容器中向某url发起http请求,成功后继续执行

2.容器探测

(1)liveness probes

(2)readiness probes

(3)initialDelaySeconds和timeoutSeconds


一.Pod的创建过程

1.用户通过kubectl提交pod信息传给apiserver,apiserver生成pod信息,将信息存入etcd,并像kubectl返回确认信息

2.apiserver开始记录etcd上apiserver传来的pod的变化,剩余其他组件使用watch机制跟踪apiserver信息变化

3.scheduler发现pod创建请求,为pod分配主机,向apiserver返回分配信息

4.node上kubectl接收到pod调度任务,使用现有容器引擎启动容器,向apiserver返回启动等结果

5.apiserver最后又将pod状态存入etcd

 

二.Pod的终止过程

1.kubectl客户端向apiserver发出删除pod命令

2.apiserver中的pod信息在默认的30s宽限期内被视为dead,被标记为terminating状态

3.

(1)kubelet察觉到pod为terminating状态后会开始关闭该pod的进程,node上的设备察觉到进程关闭后会把该pod在此node上匹配的service资源都移出列表

(2)若是pod定义了prestop钩子相关部分,在terminating后会同步开启执行prestop

4.容器进程收到停止信号后,判断宽限期结束后是否还有运行中的进程,若存在,该进程和pod会被要求立即终止

5.apiserver收到kubelet将pod宽限期设置为0的请求,随后完成删除

三.Pod的重启策略(restartPolicy)

主要是针对容器探测时出现问题后的重启具体策略,主要有Always、OnFailure、Never三种策略,除首次重启外,以后的每次重启间隔一般都为10s-20s-40s-80s这样的双倍递增规律

1.Always

容器生效后,自动重启,默认就是Always

2.OnFailture

容器停止运行而且退出码不为0时才重启

3.Never

不管是处于什么状态,都不重启

4.示例

apiVersion: v1
kind: Pod
metadata:name: mynginxnamespace: mynslabels:run: nginxuser: sulibao
spec:containers:- name: mynginximage: nginxports:- name: nginx-portcontainerPort: 80 lifecycle:postStart:tcpSocket:port: 8080restartPolicy: Always
​
[root@k8s-master pod]# kubectl get pods -n myns
NAME      READY   STATUS             RESTARTS      AGE
mynginx   0/1     CrashLoopBackOff   1 (43s ago)   2m
[root@k8s-master pod]# vim nginx.yaml 
[root@k8s-master pod]# kubectl get pods -n myns
NAME      READY   STATUS             RESTARTS      AGE
mynginx   0/1     CrashLoopBackOff   2 (11s ago)   2m16s    #该容器无法正常创建,需要重启
​
​
#将策略更改为Never,不会重启,直接显示error
[root@k8s-master pod]# kubectl get pods -n myns
NAME      READY   STATUS   RESTARTS   AGE
mynginx   0/1     Error    0          54s
[root@k8s-master pod]# cat nginx.yaml 
apiVersion: v1
kind: Pod
metadata:name: mynginxnamespace: mynslabels:run: nginxuser: sulibao
spec:containers:- name: mynginximage: nginxports:- name: nginx-portcontainerPort: 80 lifecycle:postStart:tcpSocket:port: 8080restartPolicy: Never

四.Pod生命周期内的5种状态(相位)

1.Pending

挂起状态,已经创建了pod,但没有被调度完成或者仍处于镜像拉取过程中

2.Running

运行中,pod已经被调度至受管节点,且pod要求的所有容器都已经创建完成

3.Succeeded

成功,pod中的所有容器都成功终止且不会被重启

4.Failed

失败,所有容器都停止,有一个或以上容器终止失败,容器返回非0值

5.Unknown

无法正常获取到pod状态信息,通常是网络通信问题

五.初始化容器(init container)

当需要用到主容器镜像中没有的代码或文件时、需要利用初始化容器去延缓主容器创建时间、或需要利用初始化容器去满足主容器依赖条件的情况下多用到初始化容器

1.运行初始化容器

(1)简单来说初始化容器就是在主容器执行之前要执行的工作,所以初始化容器必须完整运行完成不能失败才能执行到主容器,若运行失败,会一直被重启直到成功(理解为卡在初始化执行阶段)

(2)初始化容器严格按照定义的顺序执行,理解为第一个执行成功第二个才能开始执行

2.以一个案例进行验证初始化容器的重要性

准备创建三个容器,主容器为nginx,两个初始化容器为busybox、分别用于测试mysql和tomcat(这两个服务需要具有IP地址,仅供简单测试,两个服务并非真正启动)

(1)首先只为mysql提供一个IP地址,tomcat的还没有提供

[root@k8s-master pod]# ifconfig ens33:1 192.168.2.140 netmask 255.255.255.0 up

(2)编写文件

初始化容器中直到ping通两次指定的IP才算真正完成

[root@k8s-master pod]# cat test-nginx.yaml 
apiVersion: v1
kind: Pod
metadata:name: test-nginxlabels:name: mytestnamespace: myns
spec:containers:- name: nginximage: nginxports:- name: nginx-portcontainerPort: 80initContainers:- name: test-mysqlimage: busyboxcommand: ["/bin/sh","-c","until ping 192.168.2.140 -c 2; do echo preparing mysql; sleep 2; done;"]- name: test-tomcatimage: busyboxcommand: ["/bin/sh","-c","until ping 192.168.2.141 -c 2; do echo preparing tomcat; sleep 2; done;"]

(3)应用验证

[root@k8s-master pod]# kubectl apply -f test-nginx.yaml
[root@k8s-master pod]# kubectl get pods test-nginx -n myns   #始终位于初始化未完成状态,说明初始化容器中有未完成任务
NAME         READY   STATUS     RESTARTS   AGE
test-nginx   0/1     Init:1/2   0          2m24s
​
[root@k8s-master pod]# kubectl describe pod test-nginx -n myns  #describe查看详情
Events:Type    Reason     Age   From               Message----    ------     ----  ----               -------Normal  Scheduled  100s  default-scheduler  Successfully assigned myns/test-nginx to k8s-node1Normal  Pulling    99s   kubelet            Pulling image "busybox"Normal  Pulled     95s   kubelet            Successfully pulled image "busybox" in 4.515s (4.515s including waiting)Normal  Created    95s   kubelet            Created container test-mysqlNormal  Started    95s   kubelet            Started container test-mysqlNormal  Pulling    92s   kubelet            Pulling image "busybox"Normal  Pulled     89s   kubelet            Successfully pulled image "busybox" in 3.365s (3.365s including waiting)Normal  Created    89s   kubelet            Created container test-tomcatNormal  Started    89s   kubelet            Started container test-tomcat   #可以看到卡在test-tomcat初始化容器的执行上,因为我们没有为其提供可用IP地址,它无法完成文件中的command(ping不通两次)部分,也就无法进入主容器nginx的创建启动

(4)为redis提供可用IP地址,并应用验证

[root@k8s-master pod]# ifconfig ens33:2 192.168.2.141 netmask 255.255.255.0 up
[root@k8s-master pod]# kubectl get pods -n myns
NAME         READY   STATUS    RESTARTS   AGE
test-nginx   1/1     Running   0          14m
​
Events:Type    Reason     Age    From               Message----    ------     ----   ----               -------Normal  Scheduled  3m40s  default-scheduler  Successfully assigned myns/test-nginx to k8s-node1Normal  Pulling    3m39s  kubelet            Pulling image "busybox"Normal  Pulled     3m35s  kubelet            Successfully pulled image "busybox" in 4.515s (4.515s including waiting)Normal  Created    3m35s  kubelet            Created container test-mysqlNormal  Started    3m35s  kubelet            Started container test-mysqlNormal  Pulling    3m32s  kubelet            Pulling image "busybox"Normal  Pulled     3m29s  kubelet            Successfully pulled image "busybox" in 3.365s (3.365s including waiting)Normal  Created    3m29s  kubelet            Created container test-tomcatNormal  Started    3m29s  kubelet            Started container test-tomcat  #已有可用IP地址,执行完成Normal  Pulling    38s    kubelet            Pulling image "nginx"   #进一步执行主容器nginx的任务Normal  Pulled     12s    kubelet            Successfully pulled image "nginx" in 26.146s (26.146s including waiting)Normal  Created    12s    kubelet            Created container nginx   #主容器执行成功Normal  Started    12s    kubelet            Started container nginx

六.主容器(main container)

1.钩子函数简介

主要是设置来感知生命周期事件,在特定的周期阶段执行用户特定的操作,又分为启动后(post start,指容器创建之后就执行的部分,此处执行失败会重启容器)和结束前(pre stop,指容器终止运行之前执行的部分,此处执行失败会导致删除容器失败)两种。

钩子函数定义方式

(1)exec,只在容器内执行一次

apiVersion: v1
kind: Pod
metadata:name: mynginxnamespace: mynslabels:run: nginxuser: sulibao
spec:containers:- name: mynginximage: nginxports:- name: nginx-portcontainerPort: 80 lifecycle:postStart:exec:command: ["/bin/bash","-c","cat /sdf.txt"]  #此时这个文件不存在,钩子函数执行失败#换一个存在的文件就能够成功
[root@k8s-master pod]# kubectl get pods -n myns
NAME      READY   STATUS    RESTARTS   AGE
mynginx   1/1     Running   0          96s
[root@k8s-master pod]# cat nginx.yaml 
apiVersion: v1
kind: Pod
metadata:name: mynginxnamespace: mynslabels:run: nginxuser: sulibao
spec:containers:- name: mynginximage: nginxports:- name: nginx-portcontainerPort: 80 lifecycle:postStart:exec:command: ["/bin/bash","-c","ls /root"]

(2)tcpSocket,在当前的容器中尝试访问指定socket,成功后继续执行

apiVersion: v1
kind: Pod
metadata:name: mynginxnamespace: mynslabels:run: nginxuser: sulibao
spec:containers:- name: mynginximage: nginxports:- name: nginx-portcontainerPort: 80 lifecycle:preStop:tcpSocket:port: 80

(3)httpGet,在当前的容器中向某url发起http请求,成功后继续执行

apiVersion: v1
kind: Pod
metadata:name: mynginxnamespace: mynslabels:run: nginxuser: sulibao
spec:containers:- name: mynginximage: nginxports:- name: nginx-portcontainerPort: 80 lifecycle:preStop:httpGet:path: http://192.168.2.150port: 80[root@k8s-master pod]# kubectl get pods -n myns
NAME      READY   STATUS    RESTARTS   AGE
mynginx   1/1     Running   0          56s

2.容器探测

主要是用于检测容器中的应用实例工作状态是否正常,不符合预期的实例就会被剔除,不分配任务。两种容器探测探针也支持exec、tcpSocket、httpGet三种检测方式,用法和钩子函数中用法基本一致。

(1)liveness probes

存活性探针,用于检测应用实例是否处于正常状态,不正常则会重启容器

(2)readiness probes

就绪性探针,用于检测应用实例是否可以进行接受请求的工作,不能则不会为其分配工作

(3)initialDelaySeconds和timeoutSeconds

initialDelaySeconds是容器启动后多少秒开始探测,timeoutSeconds是探测超时时间为多少,默认单位是秒

[root@k8s-master pod]# cat nginx.yaml 
apiVersion: v1
kind: Pod
metadata:name: mynginxnamespace: mynslabels:run: nginxuser: sulibao
spec:containers:- name: mynginximage: nginxports:- name: nginx-portcontainerPort: 80 livenessProbe:exec:command: ["/bin/bash","-c","ls /root"]initialDelaySeconds: 30timeoutSeconds: 5

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

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

相关文章

SpringCache

1、基本信息 Spring缓存方案:JDK内置的缓存(ConcurrentHashMap)、第三方缓存组件(Caffeine)、分布式的缓存实现(Memcahed、Redis)。 ConcurrentHashMap是JUC之中提供最为重要的技术实现。SpringCache之中为了便于缓存结构的管理,在“org.s…

flutter TabBar指示器

第一层tabView import package:jade/configs/PathConfig.dart; import package:jade/customWidget/MyCustomIndicator.dart; importpackage:jade/homePage/promotion/promotionPost/MyPromotionListMainDesc.dart; import package:jade/homePage/promotion/promotionPost/MyPr…

C++入门(1)—命名空间、缺省参数

目录 一、什么是C 1、C关键字(C98) 2、C兼容C 二、C程序预处理指令 三、命名空间 1、命名冲突 第一种: 第二种: 2、域作用限定符 3、实现命名空间 4、命名空间冲突 5、访问命名空间 6、命名空间“std” 四、输入输出 1、定义 2、自动识…

生活总是自己的,请尽情打扮,尽情可爱,,

同色系拼接羽绒服了解一下 穿上时尚感一下子就突显出来了 90白鸭绒填充,不仅时尚还保暖 设计感满满的羽绒服不考虑一下吗?

腾讯云服务器租用价格,腾讯云服务器价格流量怎么算?

首先,让我们来看看腾讯云服务器租用价格。根据您的需求不同,腾讯云提供了多种不同的配置选项,从轻量级应用服务器到高性能的GPU服务器,都可以满足您的需求。以下是一些常见的腾讯云服务器租用价格: 一、腾讯云服务器租…

Mysql-复合查询

实际开发中往往数据来自不同的表,所以需要多表查询。 1.笛卡尔积 通俗来讲就是两个表的每一列都组合一遍,也就是穷举法。 穷举出来的数据表会有大量重复数据,而我们只需要加上一些限定条件就可以完成有效数据的筛选。 select EMP.ename, EM…

解决:虚拟机远程连接失败

问题 使用FinalShell远程连接虚拟机的时候连接不上 发现 虚拟机用的VMware,Linux发行版是CentOs 7,发现在虚拟机中使用ping www.baidu.com是成功的,但是使用FinalShell远程连接不上虚拟机,本地网络也ping不通虚拟机&#xff0c…

STM32 I2C详解

STM32 I2C详解 I2C简介 I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线 两根通信线: SCL(Serial Clock)串行时钟线,使用同步的时序,降低对硬件的依赖,同时同步的时序稳定…

【UE5】显示或隐藏物体轮廓线

效果 步骤 1. 先下载所需的材质文件“M_Highlight.uasset” 材质下载链接: 链接:https://pan.baidu.com/s/1rxmRhkUoXVq6-DkIKyBhAQ 提取码:55bv 2. 在视口中拖入后期处理体积 根据需求设置后期处理体积的大小或者直接设置无限范围&…

python爬取网站数据,作为后端数据

一. 内容简介 python爬取网站数据,作为后端数据 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接: 三.主要流程 3.1 通过urllib请求网站 里面用的所有的包 ! pip install lxml ! pip install selenium ! pip install…

【Linux】U盘安装的cfg引导文件配置

isolinux.cfg文件 default vesamenu.c32 timeout 600display boot.msg# Clear the screen when exiting the menu, instead of leaving the menu displayed. # For vesamenu, this means the graphical background is still displayed without # the menu itself for as long …

计算两个图形遮盖率

读取图像 首先,加载待处理的图像,可以使用图像处理库(例如OpenCV)来实现这一步。确保已加载正确的图像。 定义特定颜色范围 确定所需的特定颜色范围。这将是要检测的马赛克填充的颜色。需要指定颜色的下限值和上限值,通…

深度学习中文汉字识别 计算机竞赛

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习中文汉字识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐&#xf…

快速搭建本地的chatgpt

快速搭建本地的chatgpt 参考:一篇文章教你使用Docker本地化部署Chatgpt(非api,速度非常快!!!)及裸连GPT的方式(告别镜像GPT)-CSDN博客 前提是linux下 已安装docker 命…

Leetcode—142.环形链表II【中等】

2023每日刷题(三十三) Leetcode—142.环形链表II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* …

2023.11.18 - hadoop之zookeeper分布式协调服务

1.zookeeper简介 ZooKeeper概念: Zookeeper是一个分布式协调服务的开源框架。本质上是一个分布式的小文件存储系统 ZooKeeper作用: 主要用来解决分布式集群中应用系统的一致性问题。 ZooKeeper结构: 采用树形层次结构,没有目录与文件之分,ZooKeeper树中的每个节点被…

阿里巴巴java开发手册-编程规约

编程规约 命名风格常量定义代码格式OOP 规约日期时间集合处理并发处理控制语句注释规约前后端规约其他 命名风格 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。 反例:_name / name / n a m e / n a m e / n a m e…

Linux下安装部署redis(离线模式)

一、准备工作 1.下载redis的安装包 下载地址:Index of /releases/ 大家可以自行选择redis的版本,笔者选择的是最新的 2.上传到服务器 前提是我先在服务器上创建了一个目录redis7.2.3,我直接上传到这个目录下 二、安装redis 1.解压redis t…

RIP路由信息协议

RIP路由信息协议(Routing Information Protocol) 最先得到广泛应用的协议,最大优点是简单要求网络中的每个路由器都要维护一张表,表中记录了从它自己到其他每一个目的网络的距离RIP是应用层协议,它在传输层使用UDP,RIP报文作为UD…

[Linux版本Debian系统]安装cuda 和对应的cudnn以cuda 12.0为例

写在前面 先检查自己有没有安装使用wget的命令,没有的话输入下面命令安装: apt-get install wget -y查看gcc的安装 sudo apt install gcc #安装gcc gcc --version #查看gcc是否安装成功 #若上述命令不成功使用下面的命令尝试之后再执行上面…