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

(4)periodSeconds、failureThreshold和successThreshold


 

一.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

 f6fda7f00b874d1bbd66a62ff50676e2.png

二.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

(4)periodSeconds、failureThreshold和successThreshold

periodSeconds是指定执行探测频率(默认10s,最小1s)

failureThreshold是指定连续探测多少次失败才会被认为是失败(默认3,最小1)

successThreshold是指定连续探测多少次成功才会被认为是成功(默认1)

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: 5periodSeconds: 15failureThreshold: 2successThreshold: 1

 

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

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

相关文章

卷积神经网络(CNN)多种图片分类的实现

文章目录 前期工作1. 设置GPU(如果使用的是CPU可以忽略这步)我的环境: 2. 导入数据3.归一化4.可视化 二、构建CNN网络模型三、编译模型四、训练模型五、预测六、模型评估 前期工作 1. 设置GPU(如果使用的是CPU可以忽略这步&#…

从android.graphics.Path中取出Point点,Kotlin

从android.graphics.Path中取出Point点&#xff0c;Kotlin /*** 从一条Path中获取多少个Point点*/private fun getPoints(path: Path, pointCount: Int): Array<FloatPoint?> {val points arrayOfNulls<FloatPoint>(pointCount)val pm PathMeasure(path, false)…

学习UI第一天

在工作闲暇之余&#xff0c;自己画的原型图&#xff0c;再次做一次记录&#xff0c;哈哈哈 萌宠领养UI设计原型图 https://modao.cc/proto/lq2KqIVBs48xwylNZlA7OP/sharing?view_moderead_only #萌宠领养-分享 可以点击此链接&#xff0c;进行查看O(∩_∩)O哈哈~

转型做视频了,博客就是稿子,继续坚持写博客,同时发布视频,能写博客说明思路清晰了,能再讲明白,理解就更透彻了,紧跟上时代发展。

1&#xff0c;今天特别记录下&#xff0c;B站给开通了《合集》功能 最近使用视频制作了几个视频。播放量还不错&#xff0c;最好的已经到了 2.6K了。 然后粉丝也涨到了 200个。 添加链接描述 紧跟时代&#xff1a;从写博客到录视频&#xff0c;粉丝大涨&#xff0c;突破200个&…

Redis-核心数据结构

五种数据结构 String结构 String结构应用场景 Hash结构 Hash结构应用场景 List结构 List结构应用场景 Set结构 Set结构应用场景 ZSet有序结构 ZSet有序结构应用场景

人工智能时代:深入了解与学以致用的智能科技

目录 前言人工智能的领域1. 医疗健康2. 交通与智能驾驶3. 教育领域4. 金融与人工智能5. 制造业与自动化 人工智能的应用1. 智能手机与语音助手2. 智能家居系统3. 自动驾驶汽车4. 医疗诊断与治疗5. 金融风控与预测分析 对人工智能的看法1. 科技的利弊2. 伦理和隐私问题3. 人工智…

【每日一题】设计循环队列(C语言)

循环队列是我们可以对队列有更深一步的理解的题目&#xff0c;而且可以进一步加强其他方面的知识&#xff08;例如对循环数组的取模运算&#xff0c;指针的解引用&#xff09;&#xff0c;是个蛮不错的巩固习题&#xff0c;话不多说&#xff0c;进入正题。 链接在此&#xff1…

springboot+activiti5.22.0集成Activiti在线流程设计器

SpringBoot集成Activiti5.22在线流程设计器 文章目录 SpringBoot集成Activiti5.22在线流程设计器&#x1f4dd;1.增加配置pom依赖 增加数据库及redis配置文件&#x1f4dc; 2.启动类ActivitiDesignApplication排除安全校验注解启动项目后将会自动在数据库中生成表 &#x1f4d8…

提升--09-1--AQS底层逻辑实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、怎么解释AQS是什么&#xff1f;AQS的本质是JUC包下一个抽象类&#xff0c;AbstractQueuedSynchronizer &#xff08;抽象的队列式同步器&#xff09; 二、AQS核…

【Python】给出n个数,找出这n个数的最大值,最小值,和。

问题描述 给出n个数&#xff0c;找出这n个数的最大值&#xff0c;最小值&#xff0c;和。 样例输入 5 1 3 -2 4 5 Data 样例输出 5 -2 11 n int(input()) # 从用户输入中读取一个整数&#xff0c;将其赋给变量n# 从用户输入中读取一行字符串&#xff0c;使用空格分割字符串&a…

LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve

接着前面的Langchain&#xff0c;继续实现读取YouTube的视频脚本来问答Indexes for information retrieve LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗…

Python武器库开发-flask篇之error404(二十七)

flask篇之error404(二十七) 首先&#xff0c;我们先进入模板的界面创建一个404的html页面 cd templates vim 404.html404.html的内容如下&#xff1a; <h1>error!!!</h1>在 Flask 应用程序中&#xff0c;当用户访问一个不存在的页面的时候&#xff0c;会出现 4…

C进阶---动态内存管理

目录 一、为什么存在动态内存分配 1.1静动态内存分配区别&#xff1a; 1.2静态分配的优缺点 1.3动态分配优缺点 二、动态内存函数的介绍 2.1malloc和free 2.2calloc 2.3realloc 三、常见的动态内存错误 3.1对NULL指针的解引用操作 3.2 对动态开辟空间的越界…

Java实现拼图小游戏

1、了解拼图游戏基本功能&#xff1a; 拼图游戏内容由若干小图像块组成的&#xff0c;通过鼠标点击图像块上下左右移动&#xff0c;完成图像的拼凑。 2、拼图游戏交互界面设计与开发&#xff1a; 通过创建窗体类、菜单、中间面板和左右面板完成设计拼图的交互界面 &#xff…

14. UART串口通信

14. UART串口通信 1. UART1.1 UART 通信格式1.2 UART 电平标准1.3 I.MX6U UART 简介1.3.1 控制寄存器1 UARTx_UCR1(x1~8)1.3.2 控制寄存器2 UARTx_UCR21.3.3 控制寄存器3 UARTx_UCR31.3.4 状态寄存器2 UARTx_USR21.3.4 UARTx_UFCR 、 UARTx_UBIR 和 UARTx_UBMR1.3.5 UARTx_URXD…

P2 C++变量

前言 一 C变量的作用 本期我们来讨论一下c 中的变量。 在一个 C 程序中&#xff0c;大部分内容实际上都是在使用数据。我们操作任何类型的数据&#xff0c;如包括我们想要改变、想要修改&#xff0c; 想要读和写数据。我们都需要把数据存储进叫做变量的东西里面。变量允许我们…

Activiti,Apache camel,Netflex conductor对比,业务选型

Activiti,Apache camel,Netflex conductor对比&#xff0c;业务选型 1.activiti是审批流&#xff0c;主要应用于人->系统交互&#xff0c;典型应用场景&#xff1a;请假&#xff0c;离职等审批 详情可见【精选】activti实际使用_activiti通过事件监听器实现的优势_记录点滴…

【开发流程】持续集成、持续交付、持续部署

一、开发工作流程 假设把开发流程分为以下几个阶段&#xff1a; 编码 -> 构建 -> 集成 -> 测试 -> 交付 -> 部署 如上图所示&#xff0c;持续集成、持续交付、持续部署有着不同的软件自动交付周期。 二、持续集成、持续交付、持续部署 1、持续集成 持续集成…

mysql 查询

-- 多表查询select * from tb_dept,tb_emp; 内来链接 -- 内连接 -- A 查询员工的姓名 &#xff0c; 及所属的部门名称 &#xff08;隐式内连接实现&#xff09;select tb_emp.name,tb_dept.name from tb_emp,tb_dept where tb_emp.idtb_emp.id;-- 推荐使用select a.name,b.n…

SSL加密

小王学习录 今日摘录前言HTTP + SSL = HTTPSSSL加密1. 对称加密2. 非对称加密 + 对称加密3. 证书今日摘录 但愿四海无尘沙,有人卖酒仍卖花。 前言 SSL表示安全套接层,是一个用于保护计算机网络中数据传输安全的协议。SSL通过加密来防止第三方恶意截取并篡改数据。在实际应用…