当前位置: 首页 > news >正文

6、Kubernetes核心技术 - Pod

目录

一、概述

二、Pod机制

2.1、共享网络

2.2、共享存储

三、Pod资源清单

四、 Pod 的分类

五、Pod阶段

六、Pod 镜像拉取策略

ImagePullBackOff

七、Pod 资源限制

八、容器重启策略


一、概述

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。Pod 里面是由一个或多个容器组成【一组容器的集合】,这些容器共享存储、网络、以及怎样运行这些容器的声明。

Pod 是 Kubernetes 的最重要概念,每一个 Pod 都有一个特殊的被称为”根容器“的Pause容器。Pause 容器对应的镜像属于 Kubernetes 平台的一部分,除了Pause 容器,每个Pod还包含一个或多个紧密相关的用户业务容器。


Pod有以下一些特性:

  • 资源共享

一个 Pod 里的多个容器可以共享存储和网络,可以看作一个逻辑的主机。共享namespace,cgroups 或者其他的隔离资源。

一个 Pod 里的多个容器可以共享存储卷,这个存储卷会被定义为 Pod 的一部分,并且可以挂载到该 Pod 里的所有容器的文件系统上 。

  • 生命周期短暂

Pod 属于生命周期比较短暂的组件,比如,当 Pod 所在节点发生故障,那么该节点上的Pod会被调度到其他节点,但需要注意的是,被重新调度的 Pod 是一个全新的Pod,跟之前的Pod 没有任何关系。

  • 平坦的网络

k8s 集群中的所有 Pod 都在同一个共享网络地址空间中,也就是说每个Pod 都可以通过其他 Pod 的 IP 地址来实现访问。

二、Pod机制

Pod 主要有以下两大机制:共享网络 和 共享存储

2.1、共享网络

容器通过 namespace 和 group 进行隔离。通过Pause容器,把其它业务容器加入到Pause容器中,让所有业务容器在同一个名称空间中,可以实现网络共享。在同一个 Pod 内,所有容器共享一个 IP 地址和端口空间,并且可以通过 localhost 发现对方。

2.2、共享存储

一个 Pod 可以设置一组共享的存储卷。 Pod 中的所有容器都可以访问该共享卷,从而允许这些容器共享数据。 卷还允许 Pod 中的持久数据保留下来,即使其中的容器需要重新启动。

三、Pod资源清单

下面给出yaml文件定义的nginx Pod 的示例内容:

$ kubectl create deployment nginx --image=nginx
deployment.apps/nginx created$ kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
nginx-748c667d99-mp4d6   0/1     ContainerCreating   0          5s// 查看pod的yaml资源清单
$ kubectl get pods nginx-748c667d99-mp4d6 -o yaml
apiVersion: v1  		//版本号
kind: Pod				//资源类型,这里是Pod
metadata:  	//元数据annotations:		//pod注解信息cni.projectcalico.org/containerID: 8190e79f9ce4ebc75058013e14bd247a8a92210b28b613f9f80bcc761975117bcni.projectcalico.org/podIP: 192.168.1.3/32cni.projectcalico.org/podIPs: 192.168.1.3/32creationTimestamp: "2022-12-29T06:27:33Z"generateName: nginx-748c667d99-  	//名称前缀labels:  	//pod标签列表app: nginxpod-template-hash: 748c667d99name: nginx-748c667d99-mp4d6  	//pod名称namespace: default  	//pod所在的命名空间,默认为defaultownerReferences:- apiVersion: apps/v1blockOwnerDeletion: truecontroller: truekind: ReplicaSetname: nginx-748c667d99uid: f09e2cff-2983-4af9-98e3-71e0d470eaa2resourceVersion: "2873"uid: 28f22749-7343-428e-a20a-d7973e4c5a94
spec: 	// 资源特征containers: 	//pod 中的容器列表,可以有多个容器- image: nginx  	//镜像地址,默认从docker hub拉取nginx镜像imagePullPolicy: Always  	//获取镜像的策略,默认值为Always,每次都尝试重新下载镜像. 有三种取值:[Always|Never|IfNotPresent]name: nginx  	//容器的名称resources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:  	//挂载到到容器内部的存储卷设置- mountPath: /var/run/secrets/kubernetes.io/serviceaccount   	//存储卷在容器内部 Mount的绝对路径name: kube-api-access-78n9q   	//引用的是kube-api-access-78n9这个容器卷,在下边有定义这个volumereadOnly: true 	 //只读,默认值为读写dnsPolicy: ClusterFirstenableServiceLinks: truenodeName: node01  		//pod所在的节点名称,由调度器scheduler进行调度preemptionPolicy: PreemptLowerPrioritypriority: 0restartPolicy: Always  	//重启策略schedulerName: default-scheduler   		//使用默认的调度器,通常情况下使用默认的即可securityContext: {}serviceAccount: defaultserviceAccountName: defaultterminationGracePeriodSeconds: 30tolerations: 		//污点容忍- effect: NoExecutekey: node.kubernetes.io/not-readyoperator: ExiststolerationSeconds: 300- effect: NoExecutekey: node.kubernetes.io/unreachableoperator: ExiststolerationSeconds: 300volumes:  	//定义volume容器卷列表- name: kube-api-access-78n9qprojected:defaultMode: 420sources:- serviceAccountToken:expirationSeconds: 3607path: token- configMap:items:- key: ca.crtpath: ca.crtname: kube-root-ca.crt- downwardAPI:items:- fieldRef:apiVersion: v1fieldPath: metadata.namespacepath: namespace
status:conditions: //pod的状况- lastProbeTime: nulllastTransitionTime: "2022-12-29T06:27:35Z"status: "True"type: Initialized- lastProbeTime: nulllastTransitionTime: "2022-12-29T06:27:51Z"status: "True"type: Ready- lastProbeTime: nulllastTransitionTime: "2022-12-29T06:27:51Z"status: "True"type: ContainersReady- lastProbeTime: nulllastTransitionTime: "2022-12-29T06:27:35Z"status: "True"type: PodScheduledcontainerStatuses:- containerID: containerd://1c7e903816a0de4192f3ffe4b3026d59bee259aa75b15a036d48aa3250574ad2image: docker.io/library/nginx:latestimageID: docker.io/library/nginx@sha256:0047b729188a15da49380d9506d65959cce6d40291ccfb4e039f5dc7efd33286lastState: {}name: nginxready: truerestartCount: 0started: truestate:running:startedAt: "2022-12-29T06:27:50Z"hostIP: 172.30.2.2phase: RunningpodIP: 192.168.1.3podIPs:- ip: 192.168.1.3qosClass: BestEffortstartTime: "2022-12-29T06:27:35Z"

四、 Pod 的分类

Pod 有两种类型:

  • (1)普通 Pod

普通 Pod 一旦被创建,就会被放入到 etcd 中存储,随后会被 Kubernetes Master 调度到某个具体的 Node 上并进行绑定,随后该 Pod 对应的 Node 上的 kubelet 进程实例化成一组相关的 Docker 容器并启动起来。在默认情 况下,当 Pod 里某个容器停止时,Kubernetes 会自动检测到这个问题并且重新启动这个 Pod 里某所有容器, 如果 Pod 所在的Node 宕机,则会将这个 Node 上的所有 Pod 重新调度到其它节点上。

  • (2)静态 Pod

静态 Pod 是由 kubelet 进行管理的仅存在于特定 Node 上的 Pod,它们不能通过API Server进行管理,无法与 ReplicationController、Deployment 或 DaemonSet 进行关联,并且kubelet 也无法对它们进行健康检查。

五、Pod阶段

Pod 的 status 字段是一个 PodStatus 对象,其中包含一个 phase 字段。Pod 的阶段(Phase)是 Pod 在其生命周期中所处位置的简单宏观概述。

下面是 phase 可能的值:

状态

说明

Pending(悬决)

api server已经创建了该pod,但pod中的一个或者多个容器的镜像还没有创建,包括镜像下载过程

Running(运行中)

pod内所有容器已经创建,且至少一个容器处于运行状态、正在启动或者正在重启状态

Succeeded(成功)

pod内所有容器均成功退出,且不会再重启

Failed(失败)

pod内所有容器均已退出,但至少一个容器退出失败

Unknown(未知)

由于某种原因无法获取pod状态,例如网络通信不畅

当一个 Pod 被删除时,执行一些 kubectl 命令会展示这个 Pod 的状态为 Terminating(终止)。 这个 Terminating 状态并不是 Pod 阶段之一。 Pod 被赋予一个可以体面终止的期限,默认为 30 秒。 你可以使用 --force 参数来强制终止 Pod。

六、Pod 镜像拉取策略

容器的 imagePullPolicy 和镜像的标签会影响 kubelet 尝试拉取(下载)指定的镜像。

以下列表包含了 imagePullPolicy 可以设置的值,以及这些值的效果:

  • IfNotPresent

只有当镜像在本地不存在时才会拉取。

  • Always

每当 kubelet 启动一个容器时,kubelet 会查询容器的镜像仓库, 将名称解析为一个镜像摘要。 如果 kubelet 有一个容器镜像,并且对应的摘要已在本地缓存,kubelet 就会使用其缓存的镜像; 否则,kubelet 就会使用解析后的摘要拉取镜像,并使用该镜像来启动容器。

  • Never

Kubelet 不会尝试获取镜像。如果镜像已经以某种方式存在本地, kubelet 会尝试启动容器;否则,会启动失败。

在生产环境中部署容器时,你应该避免使用 :latest 标签,因为这使得正在运行的镜像的版本难以追踪,并且难以正确地回滚。

相反,应指定一个有意义的标签,如 v1.42.0。

ImagePullBackOff

当 kubelet 使用容器运行时创建 Pod 时,容器可能因为 ImagePullBackOff 导致状态为 Waiting。

ImagePullBackOff 状态意味着容器无法启动, 因为 Kubernetes 无法拉取容器镜像(原因包括无效的镜像名称,或从私有仓库拉取而没有 imagePullSecret)。 BackOff 部分表示 Kubernetes 将继续尝试拉取镜像,并增加回退延迟。

Kubernetes 会增加每次尝试之间的延迟,直到达到编译限制,即 300 秒(5 分钟)。

七、Pod 资源限制

每个 Pod 都可以对其能使用的服务器上的计算资源设置限额,Kubernetes 中可以设置限额的计算资源有 CPU 与 Memory 两种,其中 CPU 的资源单位为 CPU 数量,是一个绝对值而非相对值。Memory 配额也是一个绝对值,它的单位是内存字节数。 Kubernetes 里,一个计算资源进行配额限定需要设定以下两个参数:

  • Requests :该资源最小申请数量,系统必须满足要求【表示调度所需的资源】
  • Limits :该资源最大允许使用的量,不能突破,当容器试图使用超过这个量的资源时,可能会被 Kubernetes Kill 并重启 【表示最大所占用的资源】
spec:containers:- name: mysqlimage: mysqlresources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"

上述代码表明 mysql 容器申请最少 0.25 个 CPU 以及 64MiB 内存,在运行过程中容器所能使用的资源配额为 0.5 个 CPU 以及 128MiB 内存。

八、容器重启策略

Pod 的 spec 中包含一个 restartPolicy 字段,其可能取值包括 Always、OnFailure 和 Never。默认值是 Always。

restartPolicy 适用于 Pod 中的所有容器,restartPolicy 仅针对同一节点上 kubelet 的容器重启动作。当 Pod 中的容器退出时,kubelet 会按指数回退方式计算重启的延迟(10s、20s、40s、...),其最长延迟为 5 分钟。 一旦某容器执行了 10 分钟并且没有出现问题,kubelet 对该容器的重启回退计时器执行重置操作。

重启策略(restartPolicy)主要分为以下三种:

  • Always:当容器终止退出后,总是重启容器,默认策略 ;
  • OnFailure:当容器异常退出且退出状态码非0时,才重启容器;
  • Never:当容器终止退出,都不重启容器 ;

相关文章:

6、Kubernetes核心技术 - Pod

目录 一、概述 二、Pod机制 2.1、共享网络 2.2、共享存储 三、Pod资源清单 四、 Pod 的分类 五、Pod阶段 六、Pod 镜像拉取策略 ImagePullBackOff 七、Pod 资源限制 八、容器重启策略 一、概述 Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。P…...

VlanIf虚拟接口 通信技术(二十三课)

一 Vlan技术之间的通信 单臂路由(One-Arm Routing)是一种网络架构设计方式,通常用于部署网络设备(如防火墙、负载均衡器等)实现网络流量控制和安全策略。在单臂路由中,网络设备只有一个物理接口与局域网(LAN)或广域网(WAN)相连。 1.2 交换机 数据链路层 (第二层)…...

图神经网络(GNN)入门学习笔记(直观且简单)

文章目录 图的定义和表示可以使用图数据结构的问题将图结构用于机器学习的挑战最基本的图神经网络概述汇聚操作基于信息传递的改进图神经网络全局向量信息的利用 本篇文章参考发表于Distill上的图神经网络入门博客: A Gentle Introduction to Graph Neural Network…...

【Java开发】 Mybatis-Flex 01:快速入门

Mybatis 作为头部的 ORM 框架,他的增强工具可谓层出不穷,比如出名的 Mybatis-Plus 和 阿里云开源的 Fluent-MyBatis,如今出了一款 Mybatis-Flex ,相比前两款功能更为强大、性能更为强悍,不妨来了解一下。 目录 1 Myba…...

企业级业务架构学习笔记<二>

一.业务架构基础 业务架构的定义 以实现企业战略为目标,构建企业整体业务能力规划并将其传导给技术实现端的结构化企业能力分析方法 (业务架构可以从企业战略触发,按照企业战略设计业务及业务过程,业务过程时需要业务能力支撑的&#xff0…...

Minio在windows环境配置https访问

minio启动后,默认访问方式为http,但是有的时候我们的访问场景必须是https,浏览器有的会默认以https进行访问,这个时候就需要我们进行配置上的调整,将minio从http访问升级到https。而查看minio的官方文档,并…...

安装JDK环境(Windows+Linux双教程)

今日一语:今天的事情不去做,到了明天就成了麻烦,到了下个月就成了隐患,到了明年只剩下悔恨和惋惜 Linux 从Oracle网站下载linux的rpm包java -version 查询java环境是否已经安装 如果已经安装,可以选择卸载重装或者直接…...

SVG图标,SVG symbols,SVG use标签

SVG图标,SVG symbols 项目中图标的使用,趋势是使用svg作图标的,优点如下 兼容现有图片能力前提还支持矢量 可读性好,有利于SEO与无障碍 在性能和维护性方面也比iconfont要强很多 怎么在项目中优雅的使用svg图标,下面…...

常用css 笔记

0、定义变量 :root { --primary-color: #007bff;} .button { background-color: var(--primary-color);} 1、水平垂直居中 div {width: 100px;height: 100px;position: absolute;top: 0;right: 0;bottom: 0;left: 0;margin: auto; }父级控制子集居中 .parent {display: fle…...

git的ssh方式对接码云

一、环境准备: 1、git下载,360管家或是百度。 2、vs2022,百度下载。 二、配置git: 1、打开准备存放文件的文件夹,右键,选择“Git Bash here”,弹出命令窗口, 输入:ss…...

Golang之路---02 基础语法——变量

Golang变量 变量的声明 声明变量的一般形式是使用 var 关键字 Go 语言是静态类型语言,编译时,编译器会检查变量的类型,所以要求所有的变量都要有明确的类型。 1 :一个变量单行声明 语法格式: var name type var是关…...

Webpack5 DefinePlugin的作用

在Webpack 5中,DefinePlugin是一个插件,用于创建全局常量,这些常量可以在编译过程中被引用。它的作用是允许开发人员在代码中定义全局变量,这些变量在构建过程中将被替换为其对应的值。 DefinePlugin并不是必须的,但它…...

Verilog语法学习——LV7_求两个数的差值

LV7_求两个数的差值 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 描述 根据输入信号a,b的大小关系,求解两个数的差值:输入信号a,b…...

C#匿名函数,lambda表达式笔记

一.匿名函数 匿名函数是一种定义时不起函数名的技术,因此无法直接调用,通常用来赋值给委托后被委托调用。在匿名方法中您不需要指定返回类型,它是从方法主体内的 return 语句推断的 它的语法形式为:delegate (input-parameters)…...

【图论】LCA(倍增)

一.LCA介绍 LCA通常指的是“最近共同祖先”(Lowest Common Ancestor)。LCA是一种用于解决树或图结构中两个节点的最低共同祖先的问题的算法。 在树结构中,LCA是指两个节点的最近层级的共同祖先节点。例如,考虑一棵树,…...

QT 使用串口

目录 1.1.1 添加库,添加类 1.1.2 定义串口 1.1.3 搜索串口 1.1.4 设置和打开串口 1.1.5 读取数据 1.1.6 发送数据 1.1.7 关闭串口 1.1.1 添加库,添加类 首先,QT5 是自带 QSerialPort(Qt5 封装的串口类)这个类的,使用时…...

GitHub上怎么寻找项目?

前言 下面由我精心整理的关于github项目资源搜索的一些方法,这些方法可以帮助你更快更精确的搜寻到你需要的符合你要求的项目。 写文章不易,如果这一篇问文章对你有帮助,求点赞求收藏~ 好,下面我们直接进入正题——> 首先我…...

如何快速用Go获取短信验证码

要用Go获取短信验证码,通常需要连接到一个短信服务提供商的API,并通过该API发送请求来获取验证码。由于不同的短信服务提供商可能具有不同的API和授权方式,我将以一个简单的示例介绍如何使用Go语言来获取短信验证码。 在这个示例中&#xff0…...

详解Mybatis查询之resultType返回值类型问题【4种情况】

编译软件:IntelliJ IDEA 2019.2.4 x64 操作系统:win10 x64 位 家庭版 Maven版本:apache-maven-3.6.3 Mybatis版本:3.5.6 文章目录 引言一、查询单行数据返回单个对象二、查询多行数据返回对象的集合三、 查询单行数据返回Map[Key,…...

Python-Python基础综合案例:数据可视化 - 折线图可视化

版本说明 当前版本号[20230729]。 版本修改说明20230729初版 目录 文章目录 版本说明目录知识总览图Python基础综合案例:数据可视化 - 折线图可视化json数据格式什么是jsonjson有什么用json格式数据转化Python数据和Json数据的相互转化 pyecharts模块介绍概况如何…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...