k8s-pod详解

一、Pod基本概念:

1.pod介绍:

Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行的StatefulSet和Deployment等控制器对象,用于暴露Pod应用的Service和Ingress对象,为Pod提供存储的PersistentVolume存储资源对象等。

pod是k8s最小的创建运行单元,一个pod包含一个或多个容器

2.在Kubrenetes集群中Pod有如下两种使用方式:

(1)一个Pod中运行一个容器。“每个Pod中一个容器”的模式是最常见的用法;在这种使用方式中,你可以把Pod想象成是单个容器的封装,kuberentes管理的是Pod而不是直接管理容器

(2)在一个Pod中同时运行多个容器一个Pod中也可以同时封装几个需要紧密耦合互相协作的容器,它们之间共享资源这些在同一个Pod中的容器可以互相协作成为一个service单位,比如一个容器共享文件,另一个“sidecar”容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理。

一个Pod下的容器必须运行于同一节点上。现代容器技术建议一个容器只运行一个进程,该进程在容器-中PID命令空间中的进程号为1,可直接接收并处理信号,进程终止时容器生命周期也就结束了。若想在容器内运行多个进程,需要有一个类似Linux操作系统init进程的管控类进程,以树状结构完成多进程的生命周期管理。运行于各自容器内的进程无法直接完成网络通信,这是由于容器间的隔离机制导致,k8s中的Pod资源抽象正是解决此类问题,Pod对象是一组容器的集合,这些容器共享Network、UTS及IPC命令空间,因此具有相同的域名、主机名和网络接口,并可通过IPC直接通信。
Pod资源中针对各容器提供网络命令空间等共享机制的是底层基础容器pause,基础容器(也可称为父容器)pause就是为了管理Pod容器间的共享操作,这个父容器需要能够准确地知道如何去创建共享运行环境的容器,还能管理这些容器的生命周期。为了实现这个父容器的构想,kubernetes中,用pause容器来作为一个Pod中所有容器的父容器。这个pause容器有两个核心的功能,一是它提供整个Pod的Linux命名空间的基础。二来启用PID命名空间,它在每个Pod中都作为PID为1进程(init进程),并回收僵尸进程。

总结:

一个pod包含几个容器——一个根容器/父容器/基础容器
pod里面容器共享目前使用的经常使用的有:

  •      network uts ipc 命名空间   除此之外还有mnt、pid、user

pause容器里面有一个或者多个应用容器/业务容器

 

3.pause容器的Pod中的所有容器共享的资源:

(1)网络:
每个Pod都会被分配一个唯一的IP地址。Pod中的所有容器共享网络空间,包括IP地址和端口。Pod内部的容器可以使用localhost互相通信。Pod中的容器与外界通信时,必须分配共享网络资源(例如使用宿主机的端口映射)。

(2)存储:
Pod可以指定多个共享的Volume。Pod中的所有容器都可以访问共享的Volume。Volume也可以用来持久化Pod中的存储资源,以防容器重启后文件丢失。

总结:

每个Pod都有一个特殊的被称为“基础容器”的Pause容器

Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或者多个紧密相关的用户应用容器。

4.kubernetes中的pause容器主要为每个容器提供功能:

  • 在pod中担任Linux命名空间(如网络命令空间)共享的基础;
  • 启用PID命名空间开启init进程

pause容器:

给pod中的所有应用容器提供网络(共享IP)和存储(共享存储)资源的共享,作为pid=1 进程(init进程),管理整个pod容器组的生命周期

问题:

pod中多个容器之间怎么通讯?

通过网络插件cnr等

pod与pod之间如何通讯:

通过主机的方式(因为共享网络)

那跨主机通讯呢?:

通过网络插件——Flannel、Calico

5.Kubernetes设计这样的Pod概念和特殊组成结构有什么用意?

原因一:在一组容器作为一个单元的情况下,难以对整体的容器简单地进行判断及有效地进行行动。比如,一个容器死亡了 那么引入与业务无关的Pause容器作为Pod的基础容器,以它的状态代表着整个容器组的状态,这样就可以解决该问题。

原因二:Pod里的多个应用容器共享Pause容器的IP,共享Pause容器挂载的Volume,这样简化了应用容器之间的通信问题,也解决了容器之间的文件共享问题。

6. Pod的分类:

  • 自主式/静态pod:

不被控制器管理的pod,没有自愈能力,一旦pod挂到,不会被重新拉起而且副本数量不会因为达不到期望值而创建新的pod——数据保存在节点上,一挂直接结束生命周期。

  • 控制器管理的pod:

被控制器管理的pod,有自愈能力,一旦pod挂掉,会被重新拉起,而且副本数量会因为达不到期望值而创建新的pod——也就是说pod出现问题(删除故障等)会自动重新拉起新的pod。

二、pod容器的分类:

1.基础容器(infrastructure container):

作用:

维护整个 Pod 网络和存储空间

//node 节点中操作
//启动一个Pod时,k8s会自动启动一个基础容器
cat /opt/kubernetes/cfg/kubelet
......
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"
//每次创建 Pod 时候就会创建,运行的每一个Pod都有一个 pause-amd64 的基础容器自动会运行,对于用户是透明的
docker ps -a
registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0   "/pause"

2.初始化容器(initcontainers):

概念:
Init容器必须在应用程序容器启动之前运行完成,而应用程序容器是并行运行的,所以Init容器能够提供了一种简单的阻塞或延迟应用容器的启动的方法。

Init 容器与普通的容器的差异

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

●每个 Init 容器都必须在下一个 Init 容器启动之前成功完成启动和退出
如果 Pod 的 Init 容器失败,k8s 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的重启策略(restartPolicy)为 Never,它不会重新启动。

Init 的容器作用:
因为init容器具有与应用容器分离的单独镜像,其启动相关代码具有如下优势:
●Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。例如,没有必要仅为了在安装过程中使用类似 sed、 awk、 python 或 dig 这样的工具而去FROM 一个镜像来生成一个新的镜像。

●Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。

●应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。

●Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。

●由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,
直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。

总结:

初始化容器(init容器):

阻塞或者延迟应用容器的启动,可以为应用容器事先提供好运行环境和工具

多个init容器时是串行启动的,没个init容器都必须在下一个init容器启动前完成启动和退出  

3、应用容器(Maincontainer):

概念:

初始化完成之后才启动,启动完成之后会启动业务是并行启动

官网示例:
https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/init-containers/

总结:

应用容器(main容器):

在所有init容器启动和退出后应用容器才会启动,并行启动的,提供应用的程序业

//特别说明:

●在Pod启动过程中,Init容器会按顺序在网络和数据卷初始化之后启动。每个容器必须在下一个容器启动之前成功退出。

●如果由于运行时或失败退出,将导致容器启动失败,它会根据Pod的restartPolicy指定的策略进行重试。然而,如果Pod的restartPolicy设置为Always,Init容器失败时会使用RestartPolicy策略。

●在所有的Init容器没有成功之前,Pod将不会变成Ready状态。Init容器的端口将不会在Service中进行聚集。正在初始化中的Pod处于Pending状态,但应该会将Initializing状态设置为true。

●如果Pod重启,所有Init容器必须重新执行。

●对Init容器spec的修改被限制在容器image字段,修改其他字段都不会生效。更改Init容器的image字段,等价于重启该Pod。

●Init容器具有应用容器的所有字段。除了readinessProbe,因为Init容器无法定义不同于完成(completion)的就绪(readiness)之外的其他状态。这会在验证过程中强制执行。

●在Pod中的每个app和Init容器的名称必须唯一;与任何其它容器共享同一个名称,会在验证时抛出错误。

三.镜像拉取策略(image PullPolicy):

1.概念:

Pod 的核心是运行容器,必须指定容器引擎,比如 Docker,启动容器时,需要拉取镜像,k8s 的镜像拉取策略可以由用户指定。

2.用户指定方式:

1、IfNotPresent:在镜像已经存在的情况下,kubelet 将不再去拉取镜像,仅当本地缺失时才从仓库中拉取,默认的镜像拉取策略

2、Always:每次创建 Pod 都会重新拉取一次镜像;

3、Never:Pod 不会主动拉取这个镜像,仅使用本地镜像。

注意:对于标签为“:latest”的镜像文件,其默认的镜像获取策略即为“Always”;而对于其他标签的镜像,其默认策略则为“IfNotPresent”。

总结:

镜像拉取策略(imagePullPolicy)三种:

  • ifNotPresent优先使用本地已存在的镜像,如本地没有则从仓库去拉取镜像
  • Always总是从仓库拉取镜像,无论本地是否已存在镜像
  • Never总是不从仓库拉取镜像,仅使用本地镜像

四.重启策略:

1.重启策略概念:

当 Pod 中的容器退出时通过节点上的 kubelet 重启容器。适用于 Pod 中的所有容器。

2.重启策略分类:

  • Always:当容器终止退出后,总是重启容器,默认策略
  • OnFailure:当容器异常退出(退出状态码非0)时,重启容器;正常退出则不重启容器
  • Never:当容器终止退出,从不重启容器。

#注意:K8S 中不支持重启 Pod 资源,只有删除重建

 总结:

pod容器重启策略(restart Policy)三种:(跟container字段在同一层)

Always:

容器退出时总是重启容器,不管返回状态码如何,默认的pod容器重启策略

OnFalure:

仅在容器异常退出时(返回状态码为非0时)会重启策略

Never:

容器退出时从不重启容器,不管返回状态码如

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

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

相关文章

电赛经验分享——赛前准备

⏩ 大家好哇!我是小光,想要成为系统架构师的嵌入式爱好者。 ⏩在之前的电赛中取得了省一的成绩,本文对电赛比赛前需要准备什么做一个经验分享。 ⏩感谢你的阅读,不对的地方欢迎指正。 加入小光嵌入式交流群(qq群号&…

在线人才测评在企业招聘和大学生求职中的应用场景

每年的春招秋招,都是毕业生们忙着找工作的季节,相比社招来说,春招秋招是每个毕业生务必重视的机会,大厂名企毕竟名额有限,如果找到自己心仪的职业岗位,作为毕业生就必须提前准备,深入了解招聘的…

五管OTA输入极性快速判断

做CMFB还有负反馈的时候曾经在判断输入输出极性上吃了大亏,直接做实验波形正确就是输入正端,全差分就不用考虑这么多了 和弯折,形状类似7,相同方向输入正端,相反的就是输入负端,输出也是和输入负端一个方向…

【NLP】人机对话

概念 机器翻译就是用计算机把一种语言翻译成另外一种语言的技术 机器翻译的产生与发展 17 世纪,笛卡尔与莱布尼茨试图用统一的数字代码来编写词典 1930 机器脑 1933 苏联发明家特洛阳斯基用机械方法将一种语言翻译为另一种语言 1946 ENIAC 诞生 1949 机器翻译问题…

香蕉成熟度检测YOLOV8NANO

香蕉成熟度检测YOLOV8NANO,采用YOLOV8NANO训练,得到PT模型,然后转换成ONNX模型,让OEPNCV调用,从而摆脱PYTORCH依赖,支持C。python,安卓开发。能检测六种香蕉类型freshripe freshunripe overripe…

Vita-CLIP: Video and text adaptive CLIP via Multimodal Prompting

标题:Vita-CLIP: 通过多模态提示进行视频和文本自适应CLIP 源文链接:https://openaccess.thecvf.com/content/CVPR2023/papers/Wasim_Vita-CLIP_Video_and_Text_Adaptive_CLIP_via_Multimodal_Prompting_CVPR_2023_paper.pdfhttps://openaccess.thecvf.…

sw布尔减

可能最有效率还是草图边界线,然后用草图做分割

ue5 中ps使用记录贴

一、快捷键记录 放大图形 ctrlalt空格 放大图形 缩小视口 ctrl空格 ctrlD 取消选区 ctrlt缩小文字 w魔棒工具 选择魔棒的时候把容差打开的多一点 二、案例 移动文字 在相应的图层选择 移动文字 修改图片里的颜色 在通道里拷贝红色通道,复制红色通道粘贴给正常图…

记录Hbase出现HMaster一直初始化,日志打印hbase:meta,,1.1588230740 is NOT online问题的解决

具体错误 hbase:meta,,1.1588230740 is NOT online; state{1588230740 stateOPEN, ...... 使用 hbase 2.5.5 ,hdfs和hbase分离两台服务器。 总过程 1. 问题发现 在使用HBase的程序发出无法进行插入到HBase操作日志后检查HBase状况。发现master节点和r…

大模型应用商业化落地关键:给企业带来真实的业务价值

2024 年被很多人称为大模型应用的元年,毫无疑问,大模型已经成为共识,下一步更急迫的问题也摆在了大家的面前——大模型到底能够用在哪?有哪些场景能落地?怎么做才能创造真正的价值? 在刚刚过去的 AICon 全…

【排序算法】快速排序(四个版本以及两种优化)含动图)

制作不易,三连支持一下吧!!! 文章目录 前言一.快速排序Hoare版本实现二.快速排序挖坑法版本实现三.快速排序前后指针版本实现四.快速排序的非递归版本实现五.两种优化总结 前言 前两篇博客介绍了插入和选择排序,这篇博…

halcon配合yolov8导出onnx模型检测物体

1.工业上多数视觉开发都是用halcon开发的,halcon本身也有自己的深度学习网络,至于halcon如果不使用本身的深度学习,使用其他网络导出的onnx模型怎样配合使用?本文基于yolov8写一个列子。 2。创建输入数据的转换代码 #region 创建输…

Nginx高可用性架构:实现负载均衡与故障转移的探索

随着网络应用的不断发展和用户访问量的增长,如何确保系统的高可用性、实现负载均衡以及快速响应故障转移成为了每个运维和开发团队必须面对的挑战。Nginx作为一款高性能的HTTP和反向代理服务器,凭借其强大的功能和灵活的配置,成为了实现这些目…

题目:填空练习(指向指针的指针)

题目:填空练习(指向指针的指针) There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about …

【bugfix】/usr/local/bin/docker-compose:行1: html: 没有那个文件或目录

前言 在使用 docker-compose 管理容器化应用时,偶尔会遇到一些意想不到的错误,比如当尝试运行 docker-compose 命令时,终端非但没有展示预期的输出,反而出现类似网页错误的信息。这类问题通常与 docker-compose 的安装或配置有关…

首都师范大学聘请旅美经济学家向凌云为客座教授

2024年4月17日,首都师范大学客座教授聘任仪式在首都师范大学资源环境与旅游学院举行。首都师范大学资源环境与旅游学院院长吕拉昌主持了仪式,并为旅美经济学家向凌云教授颁发了聘书。 吕拉昌院长指出,要贯彻教育部产学研一体化战略&#xff0…

数据库工具类

public interface DbMapper {/*** 查询数据库类型*/String queryDbType(); }<select id"queryDbType" resultType"java.lang.String">select<choose><when test"_databaseId mysql">mysql</when><when test"_d…

虚拟机Centos扩展磁盘空间

虚拟机空间&#xff1a;现sda大小20G&#xff0c;因课程需要扩容 在虚拟机扩容中&#xff0c; 新增一块硬盘 和 直接在原有硬盘基础上扩容是一样的&#xff08;只不过在原有硬盘上扩容需要关机才可以执行&#xff09;&#xff1b; 但两者都最好先做数据备份或快照&#xff0c…

夏令营复习coding 算法第一天-状态:新奇

T1:bubble冒泡排序 &#xff08;1&#xff09;思路&#xff1a;两次循环&#xff0c;外层循环从后面开始-作为一个支点&#xff0c;内层循环每次将当前需要排序的最大的那个元素一步步移动到该支点&#xff0c;最终升序排列完成 &#xff08;2&#xff09;代码: #include &l…

5、设计模式之适配器模式/原型模式

文章目录 开始之前适配器模式使用场景注意事项何时使用优缺点代码实现 原型模式深拷贝和浅拷贝 开始之前 本章节是一个系列&#xff0c;里面用的的代码实例都是连贯的。在实现某一种设计模式时&#xff0c;为了减少代码篇幅&#xff0c;前面博客出现model类&#xff08;仅限公…