Kubernetes-容器的生命周期(init容器、健康检查探针、钩子)

目录

一、概述

二、init容器

1.概述

2.init容器作用

3.InitC容器示例

三、容器探针

1.概述

2.探针类型

3.readinessProbe-就绪检测示例

4.livenessProbe-存活检测示例

5.livenessProbe-tcp--检测端口模板

四、钩子

1.概述

2.yaml模板

3.示例


一、概述

1.当一个pod被创建的时候,会启动第一个容器pause。

         作用:挂载可能存在的存储卷,初始化网络栈,后来僵尸进程的杀死。维护。

2.pause容器启动后,就会启动另一个部分, 不是mainC,而是initC(初始化容器,initC>=0)

  initC初始化容器的特性:

  1. 线性启动:

    • 阻塞特性,前一个initC-1必须退出,后面的initC-2才会运行。执行退出命令的返回码为0,代表成功退出。如果initC启动过程中失败,出现错误,那么pause会重新开始创建initC-1,initC-2,initC-3等等。只有所有initC全部成功启动退出,才会继续往下运行。
  2. 独立于应用容器:

    • Init 容器可以有自己的独立镜像,这与应用容器使用的镜像可以完全不同。因此,它们具有其特殊的依赖和工具,不会影响应用容器的镜像构成。
  3. 运行到完成:

    • Init 容器必须在终止前运行到完成。它们不是用来启动长期运行的进程的。一旦它们成功执行了启动命令,它们就会终止。
  4. 重新启动策略:

    • 如果 Init 容器失败,Kubernetes 默认的重新启动策略是 'Always',它会一直重试直到容器成功为止。这与应用容器的启动失败策略是独立的。
  5. 资源限制:

    • 与应用容器一样,可以对 Init 容器设置资源请求和限制。
  6. 与应用容器共享卷:

    • Init 容器可以访问与应用容器相同的数据卷。这意味着它们可以用来准备或修改数据,这些数据后续将由应用容器使用。
  7. 运行环境隔离:

    • Init 容器和应用容器可以有不同的运行环境和根文件系统。它们甚至可以在不同的命名空间下执行,从而提供额外的安全隔离。

二、init容器

1.概述

       Pod 能够具有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的 Init 容器。

Init 容器与普通的容器非常像,除了如下两点:

        1. Init 容器总是运行到成功完成为止

        2. 每个 Init 容器都必须在下一个 Init 容器启动之前成功完成

       如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的 restartPolicy 为 Never,它不会重新启动。

2.init容器作用

       因为 Init 容器具有与应用程序容器分离的单独镜像,所以它们的启动相关代码具有如下优势:

       1. 可以包含并运行实用工具,但是出于安全考虑,是不建议在应用程序容器镜像中包含这些实用工具的。

       2. 应用程序镜像可以分离出创建和部署的角色,而没有必要联合它们构建一个单独的镜像。

       3. Init 容器使用 Linux Namespace,所以相对应用程序容器来说具有不同的文件系统视图。因此,它们能够具有访问 Secret 的权限,而应用程序容器则不能。        

       4. 它们必须在应用程序容器启动之前运行完成,而应用程序容器是并行运行的,所以 Init 容器能够提供了一种简单的阻塞或延迟应用容器的启动的方法,直到满足了一组先决条件。

3.InitC容器示例

vim initC-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.35.0
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox:1.35.0
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
  - name: init-mydb
    image: busybox:1.35.0
    command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

kubectl apply -f initC-pod.yaml

kubectl get pod

kubectl describe pod myapp-pod

kubectl logs myapp-pod -c init-myservice
    #因为这里无法解析myservice的dns地址,所以才会报错

 

kubectl create svc clusterip myservice --tcp=80:80

kubectl get svc

kubectl get pod
    #这里只加载好一个是因为,只解析了myservice的DNS,找不到mydb的DNS,所以无法加载

kubectl create svc clusterip mydb --tcp=80:80

#稍等一会再次查看,就会加载完成
kubectl get pod

三、容器探针

1.概述

       探针是由 kubelet 对容器执行的定期诊断。要执行诊断,kubelet 调用由容器实现的 Handler。有三种类型的处理程序:

         (1)ExecAction:在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。

         (2)TCPSocketAction:对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的。

         (3)HTTPGetAction:对指定的端口和路径上的容器的 IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于200 且小于 400,则诊断被认为是成功的

2.探针类型

       livenessProbe:指示容器是否正在运行。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态为 Success

       readinessProbe:指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默认状态为 Success

         存活探测:

                  探测失败:根据重启策略进行重载

                  探测成功:静默,等待下一次的存活探测

                  探测未知:静默,等待下一次探测

         就绪探测:如果mainC 不添加就绪探测,默认就绪,如果添加就绪探测,必须就绪通过后才标记就绪

                  探测失败:静默,等待下一次的探测

                  探测成功:将当前的未就绪状态,改为就绪

                  探测未知:静默,等待下一次探测

3.readinessProbe-就绪检测示例

vim readiness-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: readiness-httpget-pod
  namespace: default
  labels:
    app: myapp
    env: test
spec:
  containers:
  - name: readiness-httpget-container
    image: nginx:latest
    imagePullPolicy: IfNotPresent
    readinessProbe:
      httpGet:
        port: 80
        path: /index1.html
      initialDelaySeconds: 1	#延迟的间隔是一秒
      periodSeconds: 3		#检测的间隔时间是3秒	
      timeoutSeconds: 3		#超时时间是3秒
kubectl create -f readiness-pod.yaml

kubectl get pod
    #未就绪状态,因为请求不到index1.html文件

kubectl exec -it readiness-httpget-pod -- /bin/sh
#pod中添加index1.html文件
cd /usr/share/nginx/html/

echo "123" > index1.html

exit

#就绪状态,可以正常对外提供访问
kubectl get pod

4.livenessProbe-存活检测示例

vim livenessProbe-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec-pod
  namespace: default
spec:
  restartPolicy: Never
  containers:
  - name: liveness-exec-container
    image: busybox:1.35.0
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh","-c","touch /tmp/live ; sleep 60; rm -rf /tmp/live; sleep 3600"]
    livenessProbe:
      exec:
        command: ["test","-e","/tmp/live"]	
      initialDelaySeconds: 1	#延迟的间隔是一秒
      periodSeconds: 3		#检测的间隔时间是3秒	
      timeoutSeconds: 3		#超时时间是3秒
kubectl apply -f livenessProbe-pod.yaml

kubectl get pod

kubectl get pod
    #再次查看,已处于error状态。
    #文件被删除,存活探测失败。

5.livenessProbe-tcp--检测端口模板

apiVersion: v1
kind: Pod
metadata:
  name: probe-tcp
spec:
  containers:
  - name: nginx
    image: nginx:latest
    livenessProbe:		#存活探测
      initialDelaySeconds: 5	#初始化间隔时间时5秒
      timeoutSeconds: 1		#超时时间是1秒
      periodSeconds: 3		#检测间隔是3秒
      tcpSocket:
        port: 80			#检测的端口是80

 说明:这种方式不太好,检测端口是否存在,不代表服务能正常响应。

四、钩子

1.概述

       Pod hook(钩子)是由 Kubernetes 管理的 kubelet 发起的,当容器中的进程启动前或者容器中的进程终止之前运行,这是包含在容器的生命周期之中。可以同时为 Pod 中的所有容器都配置 hook。

Hook 的类型包括两种:

         exec:执行一段命令

         HTTP:发送 HTTP 请求

启动后钩子可以编译软件,挂载存储。

关闭前钩子可以保存文件,解除存储。

2.yaml模板

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx:latest
    lifecycle:
      postStart:		#启动后
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:			#关闭前
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the preStop handler > /usr/share/message"]

3.示例

vim lifecycle-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx:latest
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the preStop handler > /usr/share/message"]
kubectl apply -f lifecycle-pod.yaml

kubectl get pod

kubectl exec -it lifecycle-demo -- /bin/sh
#pod中执行
while 2>1;do cat /usr/share/message;done
#再开一个终端删除pod,然后观察原终端的返回信息
kubectl delete pod --all

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PSO-SVM多变量回归预测|粒子群算法优化支持向量机|Matalb

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、算法介绍: 四、完整程序下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编译&am…

一周学会Django5 Python Web开发 - Django5注册模型到Admin系统

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计54条视频,包括:2024版 Django5 Python we…

在全志H616核桃派开发板上进行PyQt5的代码编写和运行

核桃派本地 在上一节我们通过Qt Designer设计了ui窗口并转换成了Python代码,由于是Python编程,因此我们可以在核桃派开发板打开Python代码进行编程。 在核桃派上推荐使用Thonny来打开编写Python文件, 使用请参考:Thonny IDE。 打开上一节生…

揭秘抖音快速涨1000粉的方法:巨量千川投流,真实粉丝引爆你的账号;怎么快速涨有效粉

在抖音这个热门社交平台上,拥有大量粉丝不仅能增加曝光度,还能带来更多的关注和互动。因此,许多用户都在寻找能够快速增粉的方法。本文将揭秘抖音怎么快速涨1000粉的方法,并介绍了一种利用巨量千川投流和真实粉丝的方式&#xff0…

开放式耳机什么品牌最好?2024五款新晋爆款产品推荐!

​如今的耳机市场天下三分,有线入耳式耳机、蓝牙无线入耳式耳机以及开放式耳机,传统的有线入耳式耳机戴着不稳就算了,线很容易揉成一团,看着就头大;无线入耳式的耳机,同样面临着戴着不稳的问题,…

Transformers 加速的一些常用技巧

Transformers 是一个强大的架构,但模型因其采用的自注意力机制,虽然能够有效地处理序列数据并捕获长距离依赖关系,但同时也容易导致在训练过程中出现OOM(Out of Memory,内存不足)或者达到GPU的运行时限制。…

RS8521XF功能和参数介绍及PDF资料

RS8521XF功能和参数介绍及PDF资料-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 品牌: RUNIC(润石) 封装: SOT-23-5 描述: 零漂移,1uV Vos,350KHz,1通道运放 放大器数: 单路 增益带宽积(GBP): 350kHz 输入偏置电流(Ib): 1pA 压摆率(SR): 0.17V/us RS8521XF 是一款高性能的运算…

OBS插件--图片或视频源随着声音动态缩放

音效动态调整 应用此插件的源可以根据音效声音的高低进行动态的缩放。在本例中,我们在当前的场景里面添加了一个小喇叭的图片源,在这个图片源上引用这款滤镜插件,然后将VLC视频源的音效用于此插件的音效。设置完成后,场景中的小喇…

基于GD32的简易数字示波器(4)- 软件_GD32的keil5环境和串口下载

这期记录的是项目实战,做一个简易的数字示波器。 教程来源于嘉立创,帖子主要做学习记录,方便以后查看。 本期主要介绍GD32的keil5环境和串口下载。详细教程可观看下方链接。 软件-第1讲-工程模板新建_哔哩哔哩_bilibili 2.1 开发环境搭建 …

FebHost:什么是新西兰.NZ域名?

.nz域名是新西兰的顶级域名(TLD)。它是专门分配给新西兰的国家代码顶级域(ccTLD)。以 .nz 结尾的域名用于标识与新西兰或其居民相关的网站、电子邮件地址和其他在线资源。 .nz 域名由新西兰域名委员会管理。负责监督 .nz 域名的注…

[AutoSar]BSW_Diagnostic_005 bootloader跳转流程和配置

目录 关键词平台说明一、调度时序图总览二、P2*Server 和P2Server三、配置四、bootloader 设计 关键词 嵌入式、C语言、autosar、OS、BSW、UDS、diagnostic 平台说明 项目ValueOSautosar OSautosar厂商vector , EB芯片厂商TI 英飞凌编程语言C,C编译器…

2023愚人杯 )————被遗忘的反序列化

<?php# 当前目录中有一个txt文件哦 error_reporting(0); show_source(__FILE__); include("check.php");class EeE{public $text;public $eeee;public function __wakeup(){if ($this->text "aaaa"){echo lcfirst($this->text);}}public functi…

ansible -playbook运维工具、语法、数据结构、命令用法、触发器、角色

目录 配置文件 基本语法规则&#xff1a; YAML支持的数据结构 playbook核心元素 ansible-playbook用法&#xff1a; 触发器 特点&#xff1a; 角色&#xff1a; 习题&#xff1a; 配置文件 playbook配置文件使用yaml语法&#xff0c;YAML 是一门标记性语言,专门用来写配…

目标检测——印度车辆数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

C++中的complex

在 C 中&#xff0c;std::complex 是一个模板类&#xff0c;用于表示和操作复数。这个类是标准模板库&#xff08;STL&#xff09;的一部分&#xff0c;包含在 头文件中。std::complex 提供了一套丰富的功能&#xff0c;包括基本的算术运算、比较运算、数学函数等&#xff0c;使…

【微信小程序开发】flex布局在小程序开发项目中的应用详解

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Hive JSON数据处理

Hive JSON数据处理 JSON&#xff08;JavaScript Object Notation&#xff09;文件格式是一种轻量级的数据交换格式&#xff0c;用于存储和传输结构化的数据。它基于JavaScript的语法&#xff0c;但是可以被多种编程语言所支持和解析&#xff0c;因此被广泛应用于各种场景。 J…

Spring Security 复盘

1、什么Spring Security&#xff1f; Spring Security 是一种强大的框架&#xff0c;它在 Spring 生态系统中扮演着保护应用安全的关键角色。Spring Security 基于 Spring 框架&#xff0c;提供了一套 Web 应用安全性的完整解决方案。 2、认证 和 授权 1.什么是认证&#xff1…

Python 全栈系列244 nginx upstream 负载均衡 踩坑日记

说明 最初是因为租用算力机(Python 全栈系列242 踩坑记录:租用算力机完成任务)&#xff0c;所以想着做一个负载均衡&#xff0c;然后多开一些服务&#xff0c;把配置写在nginx里面就好了。 一开始租用了一个3080起了一个服务&#xff0c;后来觉得速度不够快&#xff0c;再起了…

如何解决IntelliJ IDEA中pom.xml依赖项引发的安全漏洞黄线警告问题

背景 在开发过程中&#xff0c;当我们在pom.xml文件中添加依赖项时&#xff0c;经常会发现IntelliJ IDEA报出黄色警告线条&#xff0c;提示存在潜在的安全漏洞。警告的具体展现形式如下&#xff1a; 解决方案 首先&#xff0c;打开设置菜单界面&#xff0c;接着选择编辑器选…