k8s之pod

news2024/11/16 12:58:02

目录

 一、Pod基础概念

1.1 在Kubrenetes集群中Pod有如下两种使用方式

1.2 pod的种类

二、容器的分类

(1)基础容器(pause)

(2)初始化容器(initcontainers)

(3)应用容器(Maincontainer)

三、init初始化

四、k8s 镜像拉取策略

1、IfNotPresent

2、Always

3、Never

五、pod容器重启策略(restartPolicy)

1、Always

2、OnFailure

3、Never


 一、Pod基础概念

总结:pod是k8s最小的创建和运行单元

一个pod包含一个或几个容器

一个跟容器/父容器/基础容器---->pause容器---->一个或者多个应用容器/业务容器

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

一个Pod下的容器必须运行于同一节点上。现代容器技术建议一个容器只运行一个进程,该进程在容器中PID命令空间中的进程号为1,可直接接收并处理信号,进程终止时容器生命周期也就结束了。若想在容器内运行多个进程,需要有一个类似Linux操作系统init进程的管控类进程,以树状结构完成多进程的生命周期管理。运行于各自容器内的进程无法直接完成网络通信,这是由于容器间的隔离机制导致,k8s中的Pod资源抽象正是解决此类问题,Pod对象是一组容器的集合,这些容器共享Network、UTS及IPC命令空间,因此具有相同的域名、主机名和网络接口,并可通过IPC直接通信。

1.1 在Kubrenetes集群中Pod有如下两种使用方式

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

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

1.2 pod的种类

自主式Pod

总结:不被控制器管理的pod,没有自愈能力,一旦pod挂掉,不会被重新拉起。而且副本数量也不会因为达不到期望值而创建新的pod

这种Pod本身是不能自我修复的,当Pod被创建后(不论是由你直接创建还是被其他Controller),都会被Kuberentes调度到集群的Node上。直到Pod的进程终止、被删掉、因为缺少资源而被驱逐、或者Node故障之前这个Pod都会一直保持在那个Node上。Pod不会自愈。如果Pod运行的Node故障,或者是调度器本身故障,这个Pod就会被删除。同样的,如果Pod所在Node缺少资源或者Pod处于维护状态,Pod也会被驱逐。

控制器管理的Pod

总结:被控制器管理的pod,有自愈能力,一旦pod挂掉,会被重新拉起。而且副本数量会因为达不到期望值而创建新的pod。

Kubernetes使用更高级的称为Controller的抽象层,来管理Pod实例。Controller可以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个Node故障,Controller就能自动将该节点上的Pod调度到其他健康的Node上。虽然可以直接使用Pod,但是在Kubernetes中通常是使用Controller来管理Pod的。

自主式pod不存在etcd当中,所以坏了或者删除就不会再创建pod了

控制器可以根据etcd的信息,会根据预选和优选的策略,再重新创建一个pod。

二、容器的分类

(1)基础容器(pause)

pause容器使得Pod中的所有容器可以共享两种资源:网络和存储。

给pod中的所有应用容器提供网络(共享IP)和存储(共享存储)资源共享:作为PID=1的进程(init进程)

(2)初始化容器(initcontainers)

初始化容器(init容器):阻塞或者延迟应用容器的启动,可以为应用容器事先提供好运行环境和工具。

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

(3)应用容器(Maincontainer)

应用容器(main 容器):在所有init容器成功后启动和退出后应用容器才会启动,并行启动的,提供应用程序的业务。

三、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容器的名称必须唯一;与任何其它容器共享同一个名称,会在验证时抛出错误。

init初始化:当有一个或多个init时,必须先创建init成功之后,才会运行下一个,如果创建不成功,就不会运行下一个,会阻塞。

创建pod:myapp-pod

这段代码是一个 Kubernetes Pod 的配置文件,用于定义一个运行容器化应用程序的 Pod,并包含了两个 initContainer。让我逐步解释它:

- `apiVersion: v1` 和 `kind: Pod` 表示这是一个 Kubernetes Pod 配置。

- `metadata` 部分定义了 Pod 的元数据,包括名称和标签。这个 Pod 的名称是 "myapp-pod",并且它有一个标签 "app: myapp",标签用于标识和分类 Pod。

- `spec` 部分是 Pod 的规范,它定义了 Pod 包含的容器和 initContainer。

  - `containers` 部分定义了一个主要的容器,名称为 "myapp-container",使用了 "busybox:1.28" 镜像,并运行一个命令:`sh -c 'echo The app is running! && sleep 3600'`。
这个命令会在容器内打印一条消息 "The app is running!",然后让容器休眠 3600 秒(1小时)。

  - `initContainers` 部分定义了两个 initContainer,它们在主容器运行之前执行。这些 initContainer 的目的是在主应用程序容器开始运行之前,执行一些初始化任务,通常用于等待依赖项准备就绪。

    - 第一个 initContainer 名为 "init-myservice",它使用了 "busybox:1.28" 镜像,运行的命令是 `sh -c 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;'`。
这个 initContainer 的目的是等待名为 "myservice" 的 DNS 条目可用,它会不断执行 DNS 查询,直到 "myservice" 的 DNS 条目就绪,期间会每隔 2 秒打印一条消息 "waiting for myservice"。

    - 第二个 initContainer 名为 "init-mydb",与 "init-myservice" 类似,它使用了 "busybox:1.28" 镜像,运行的命令是 `sh -c 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;'`。
它的目的是等待名为 "mydb" 的 DNS 条目可用,也会不断执行 DNS 查询,直到 "mydb" 的 DNS 条目就绪,期间会每隔 2 秒打印一条消息 "waiting for mydb"。

这种设置通常用于确保在主应用程序容器开始运行之前,需要的依赖项(如其他服务或数据库)已经准备就绪。一旦这些 initContainer 完成了它们的任务,主应用程序容器才会开始运行。
这有助于应用程序的稳定性和可靠性,因为它们不会在依赖项未准备好的情况下启动。

 

这段代码是一个 Kubernetes Service(服务)的配置文件,用于定义一个服务对象。以下是对该配置文件的逐行解释:

- `apiVersion: v1`: 这是 Kubernetes API 的版本,表明这个配置文件适用于 Kubernetes API 版本 1。

- `kind: Service`: 这指定了配置文件中定义的 Kubernetes 资源类型,即 Service。

- `metadata`: 在这个部分中,您可以定义有关服务的元数据,包括服务的名称。
   - `name: myservice`: 这里指定了服务的名称为 "myservice"。服务名称是在集群内唯一标识服务的重要属性。

- `spec`: 这个部分定义了服务的规范,包括服务的端口配置和选择器。
   - `ports`: 这里定义了服务监听的端口,可以有多个端口。在这个例子中,只定义了一个端口。
     - `port: 80`: 表示服务在端口 80 上监听传入的请求。
     - `protocol: TCP`: 指定服务使用 TCP 协议来处理请求。
     - `targetPort: 80`: 这是服务将请求路由到的 Pod 的端口。在这种情况下,服务将请求路由到具有标签 `app: myapp` 的 Pod 上的端口 80。

   - `selector`: 这是一个用于选择要关联到服务的 Pod 的标签选择器。
     - `app: myapp`: 这里定义了一个标签选择器,它要求服务将流量路由到带有标签 `app: myapp` 的 Pod。这意味着该服务将关联到那些具有标签 `app: myapp` 的 Pod,而不是其他 Pod。

总结:这个配置文件定义了一个名为 "myservice" 的 Kubernetes 服务,监听端口 80,并将传入的请求路由到带有标签 `app: myapp` 的 Pod 上的端口 80。这有助于服务发现和负载均衡,使应用程序能够通过服务名 "myservice" 访问相关的 Pod。

这段代码是一个 Kubernetes Service(服务)的配置文件,用于定义另一个服务对象。以下是对该配置文件的逐行解释:

- `apiVersion: v1`: 这是 Kubernetes API 的版本,表明这个配置文件适用于 Kubernetes API 版本 1。

- `kind: Service`: 这指定了配置文件中定义的 Kubernetes 资源类型,即 Service。

- `metadata`: 在这个部分中,您可以定义有关服务的元数据,包括服务的名称。
   - `name: mydb`: 这里指定了服务的名称为 "mydb"。服务名称是在集群内唯一标识服务的重要属性。

- `spec`: 这个部分定义了服务的规范,包括服务的端口配置和选择器。
   - `ports`: 这里定义了服务监听的端口,可以有多个端口。在这个例子中,只定义了一个端口。
     - `port: 80`: 表示服务在端口 80 上监听传入的请求。
     - `protocol: TCP`: 指定服务使用 TCP 协议来处理请求。
     - `targetPort: 80`: 这是服务将请求路由到的 Pod 的端口。在这种情况下,服务将请求路由到具有标签 `app: myapp` 的 Pod 上的端口 80。

   - `selector`: 这是一个用于选择要关联到服务的 Pod 的标签选择器。
     - `app: myapp`: 这里定义了一个标签选择器,它要求服务将流量路由到带有标签 `app: myapp` 的 Pod。这意味着该服务将关联到那些具有标签 `app: myapp` 的 Pod,而不是其他 Pod。

总结:这个配置文件定义了一个名为 "mydb" 的 Kubernetes 服务,监听端口 80,并将传入的请求路由到带有标签 `app: myapp` 的 Pod 上的端口 80。与前一个服务配置类似,这有助于服务发现和负载均衡,使应用程序能够通过服务名 "mydb" 访问相关的 Pod。这个服务可能是应用程序中与数据库相关的服务。

 

四、k8s 镜像拉取策略

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

1、IfNotPresent

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

优先使用本地已存在的仓库,如果本地没有,则从仓库镜像拉取。

2、Always

每次创建 Pod 都会重新拉取一次镜像。

总是从仓库拉取镜像,无论本地是否已存在镜像。

3、Never

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

总是不从仓库拉取镜像,仅使用本地镜像。

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

以编辑模式查看指定的pod的配置

创建Pod资源时,因为设置镜像的版本资源为:lastest,默认的镜像拉取策略为Always

重新创建一个Pod资源,修改镜像版本为latest,然后再设置镜像策略为IfNotPresent,会按设置的顺序进行。

五、pod容器重启策略(restartPolicy)

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

1、Always

当容器终止退出后,总是重启容器,默认策略

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

2、OnFailure

当容器异常退出(退出状态码非0)时,重启容器;正常退出则不重启容器

仅在容器异常退出时,返回码为非0时,会重启容器。

3、Never

当容器终止退出,从不重启容器。

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

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

创建的Pod资源,默认的重启策略都为:Always

重新创建Pod资源,并且添加默认的重启策略为:Never 

 

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

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

相关文章

数字经济之于城市碳排放:“加速器”抑或“减速带”?

数据简介:数字经济是我国经济高质量发展的核心驱动力,在提升碳福利绩效过程中发挥重要作用,其在许多方面都能提供减少碳排放的机会。通过数字化和物联网技术,能源系统、交通运输、城市规划等领域可以实现智能化管理和优化&#xf…

VPN与IP代理用哪个好?有何区别?

当谈到网络安全和IP变更时,人们会想到VPN和IP代理服务器。很多人很困惑,它们之间有什么区别,应该选择哪一个呢?这取决于您的需求来决定哪一个更好。 一、什么是VPN与IP代理? VPN 是虚拟专用网络 (Virtual Private Net…

软件测试进阶篇----接口测试

接口测试 一、接口的概述 接口是什么? 在系统与系统之间、子系统与子系统之间数据交互的功能就是接口。 接口就是一个特定功能的函数(方法),有参数,有返回值,调用者需要通过某种方式(网络协议&…

CVE-2021-21234 spring-boot-actuator-logview目录遍历漏洞

0x01 影响版本 Spring-Boot-Actuator-logview < 0.2.13 0x02 漏洞分析 源码中对filename进行了校验但并未对路径进行校验 校验函数如下&#xff1a; 0x03 漏洞复现 首先开vulhub的镜像 点击下载&#xff0c;原数据包如下 送入repeater打入payload&#xff0c;复现…

【机器学习】一、机器学习概述与模型的评估、选择

机器学习简介 由来 阿瑟.萨缪尔Arthur Samuel,1952年研制了一个具有自学习能力的西洋跳棋程序&#xff0c;1956年应约翰.麦卡锡John McCarthy&#xff08;人工智能之父&#xff09;之邀&#xff0c;在标志着人工智能学科诞生的达特茅斯会议上介绍这项工作。他发明了“机器学习…

视频增强修复软件Topaz Video AI mac中文版支持功能

Topaz Video AI mac是一款使用人工智能技术对视频进行增强和修复的软件。它可以自动降噪、去除锐化、减少压缩失真、提高清晰度等等。Topaz Video AI可以处理各种类型的视频&#xff0c;包括低分辨率视频、老旧影片、手机录制的视频等等。 使用Topaz Video AI非常简单&#xff…

一文搞懂隐私计算

隐私计算 1. 安全多方计算2. 联邦学习3. 可信执行环境4. 隐私计算三类技术比较 隐私计算&#xff08;Privacy computing&#xff09;是指在保证数据不对外泄露的前提下&#xff0c;由两个或多个参与方联合完成数据分析计算相关技术的统称。 隐私计算作为跨学科技术&#xff0c…

如何优雅地单元测试 Kotlin/Java 中的 private 方法?

翻译自 https://medium.com/mindorks/how-to-unit-test-private-methods-in-java-and-kotlin-d3cae49dccd ❓如何单元测试 Kotlin/Java 中的 private 方法❓ 首先&#xff0c;开发者应该测试代码里的 private 私有方法吗&#xff1f; 直接信任这些私有方法&#xff0c;测试到…

Leetcode—169.多数元素【简单】

2023每日刷题&#xff08;十四&#xff09; Leetcode—169.多数元素 算法思想 由于nums中一定存在多数元素&#xff0c;所以将nums数组元素递增排序&#xff0c;取出位置的元素即可 实现代码 class Solution { public:int majorityElement(vector<int>& nums) {s…

视频转gif表情怎么操作?一键提取gif动画

通过电影、电视剧等视频转换gif动画&#xff0c;效果非常的吸引人。但是很多视频转换gif的工具要么是需要下载要么就是操作起来很复杂。其实&#xff0c;大家只需要使用gif动画图片&#xff08;https://www.gif.cn/&#xff09;制作工具&#xff0c;不用下载任何软件&#xff0…

前端基础---跳转相关的功能

后端给链接地址并且给token进行跳转 如果点击有key4&#xff0c;说明要跳转到相应的页面 auth是通过后端获取的地址&#xff0c; jdk是后端获取的相应的token&#xff0c; 然后进行拼接&#xff0c;进行window.open&#xff08;&#xff09;进行跳转 if (key 4) {var testUrl …

JavaEE入门介绍,HTTP协议介绍,常用状态码及含义,服务器介绍(软件服务器、云服务器)

一、JavaEE入门 JavaEE&#xff08;Java Enterprise Edition&#xff09;&#xff0c;Java企业版&#xff0c;是一个用于企业级web开发&#xff08;不需要使用控制台&#xff09;平台。最早由Sun公司定制并发布&#xff0c;后由Oracle负责维护。 JavaEE平台规范了在开发企业级w…

开发者看亚马逊云科技1024【文末有福利~】

1024&#xff0c;2023年的1024&#xff0c;注定是不平凡的1024&#xff0c;AIGC已经成为了整个年度的主题&#xff0c;亚马逊云科技在这个开发者每年最重要的日子&#xff0c;举办了生成式AI构建者大会&#xff0c;让我们一起再次了解本次生成式AI构建者大会&#xff0c;回顾会…

【c++|opencv】一、基础操作---2.图像信息获取

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 图像信息获取&#xff0c;roi 1. 图像信息获取 // 获取图像信息#include <iostream> #include <opencv2/opencv.hpp>using namespace cv; …

浅谈智能卡远程费控电能表的设计与实现

叶根胜 安科瑞电气股份有限公司 上海嘉定201801 摘要:本文分析了国内外远程费用控制电能表的研究现状&#xff0c;并根据功能要求和参数要求设计研究了远程费用控制电能表。采用模块化设计的电能表硬件电路系统&#xff0c;并研究了电能表的功能程序软件&#xff0c;实现了测…

虚拟内存之页面置换算法

内存空间不够&#xff0c;OS将内存中暂时用不到的信息换出到外存。但页面的换入/出需要磁盘I/O&#xff0c;系统开销较大。页面置换算法要更少的缺页率。 一、最佳置换(OPT)-optimal 1.思想 每次选择淘汰以后永不使用、在最长时间内不再被访问的页面&#xff0c;以此保证最低的…

3 tensorflow构建模型详解

上一篇&#xff1a;2 用TensorFlow构建一个简单的神经网络-CSDN博客 1、神经网络概念 接上一篇&#xff0c;用tensorflow写了一个猜测西瓜价格的简单模型&#xff0c;理解代码前先了解下什么是神经网络。 下面是百度AI对神经网络的解释&#xff1a; 神经网络是一种运算模型&…

音视频技术开发周刊 | 317

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 MIT惊人再证大语言模型是世界模型&#xff01;LLM能分清真理和谎言&#xff0c;还能被人类洗脑 MIT等学者的「世界模型」第二弹来了&#xff01;这次&#xff0c;他们证明…

什么是Steam红锁?及红锁的原因

Steam红锁分为两种&#xff0c;一种是商业红&#xff0c;一种是欺诈红。 造成红锁的原因有哪些&#xff1f; 1.非正常玩家&#xff0c;大量囤货&#xff0c;就是你交易饰品的交易量太大了&#xff0c;而且频繁地买进同一个饰品&#xff0c;官方就会判定你是商业行为&#xff0…

批量重命名文件夹:用数字随机重命名法管理您的文件夹

在文件管理中&#xff0c;文件夹的命名是一项至关重要的任务。一个好的文件夹命名方案可以帮助我们更高效地组织和查找文件。然而&#xff0c;随着时间的推移&#xff0c;我们可能会遇到文件夹数量过多&#xff0c;难以管理和查找的问题。为了解决这个问题&#xff0c;我们可以…