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:当容器终止退出,都不重启容器 ;

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

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

相关文章

时序预测 | Python实现NARX-DNN空气质量预测

时序预测 | Python实现NARX-DNN空气质量预测 目录 时序预测 | Python实现NARX-DNN空气质量预测效果一览基本介绍研究内容程序设计参考资料效果一览 基本介绍 时序预测 | Python实现NARX-DNN空气质量预测 研究内容 Python实现NARX-DNN空气质量预测,使用深度神经网络对比利时空气…

有道OCR图文识别整合SpringBoot

背景需求, 官方SDK,在SpringBoot项目中过于臃肿,需要引入的Jar包过多, 在SpringBoot中, 本文使用SpringBoot中的RestTemplate对象进行请求接口 案例代码如下 package com.example.demo2.Test;import com.example.demo2.Test.Ocr.OcrResponse; import org.springframework.h…

基于51单片机和proteus的加热洗手器系统设计

此系统是基于51单片机和proteus的仿真设计,功能如下: 1. 检测到人手后开启出水及加热。 2. LED指示加热出水及系统运行状态。 功能框图如下: Proteus仿真界面如下: 下面就各个模块逐一介绍, 模拟人手检测模块 通过…

mysql 非definer用户如何查看存储过程定义

当我们创建存储过程时,如果没有显示指定definer,则会默认当前用户为该sp的definer,如果没有相关授权,则其他用户是看不了这个sp的。 比如用户zhenxi1拥有如下权限: 它拥有对dev_nacos库的查询权限,这个时候…

Xamarin.Android实现加载中的效果

目录 1、说明2、代码如下2.1 图1的代码2.1.1、创建一个Activity或者Fragment,如下:2.1.2、创建Layout2.1.3、如何使用 2.2 图2的代码 4、其他补充4.1 C#与Java中的匿名类4.2 、其他知识点 5、参考资料 1、说明 在实际使用过程中,常常会用到点…

【ChatGPT辅助学Rust | 基础系列 | 基础语法】变量,数据类型,运算符,控制流

文章目录 简介:一,变量1,变量的定义2,变量的可变性3,变量的隐藏 二、数据类型1,标量类型2,复合类型 三,运算符1,算术运算符2,比较运算符3,逻辑运算…

python_在K线找出波段_01_找出所有转折点

目录 写在前面: 需要考虑的几种K线图情况: 寻找所有转折点逻辑: 代码: 寻找转折点方法:找到第一个转折点就返回 循环寻找峰谷方法 主方法 调用计算: 返回: 在【PyQt5开发验证K线视觉想…

数字图像处理(番外)图像增强

图像增强 图像增强的方法是通过一定手段对原图像附加一些信息或变换数据,有选择地突出图像中感兴趣的特征或者抑制(掩盖)图像中某些不需要的特征,使图像与视觉响应特性相匹配。 图像对比度 图像对比度计算方式如下: C ∑ δ δ ( i , j …

7 网络通信(上)

文章目录 网络通信概述ip地址ip的作用ip地址的分类私有ip 掩码和广播地址 linux 命令(ping ifconfig)查看或配置网卡信息:ifconfig(widows 用ipconfig)测试远程主机连通性:ping路由查看 端口端口是怎样分配的知名端口动态端口 查看…

合宙Air724UG LuatOS-Air script lib API--log

Table of Contents log _log(level, tag, …) (local函数 无法被外部调用) log.trace(tag, …) log.debug(tag, …) log.info(tag, …) log.warn(tag, …) log.error(tag, …) log.fatal(tag, …) log.openTrace(v, uartid, baudrate) log 模块功能:系统日志记录,分…

【数据结构与算法】基数排序

基数排序 基数排序(Radix Sort)属于“分配式排序”,又称“桶子法”或 bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。基数排序法是属于稳定性…

【C++】开源:Boost网络库Asio配置使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Asio网络库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次…

信息安全战线左移!智能网联汽车安全亟需“治未病”

当汽车由典型的工业机械产品逐步发展成为全新的智能移动终端,汽车的安全边界发生了根本性改变,信息安全风险和挑战不断增加。 面对复杂的异构网络、异构系统及车规级特异性要求,智能智能网联汽车信息安全到底要如何防护,已经成为…

qml中,在ListView中添加滚轮无法展现最后几行数据的问题解决

这个是我困扰我数几个小时的问题,好不容易知道了如何在LIstView中添加滚轮,然而,当我鼠标滚轮到最后的时候,展现的总不是最后那几行数据,这真的很让人头大,还好有了这次经历,把这个问题记录下来…

八大排序算法--选择排序(动图理解)

选择排序 算法思路 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。 选择排序的步骤: 1>首先在未排序序列中找到最小(大)元素…

Redis五大基础类型解析

1.String类型 特征:即存储字符串的类型,单个字符串存储量最大不超过512MB 常用业务场景:⽤来存储JSON序列化之后对象 底层编码: int编码 数据结构特点:ptr指针直接指向字符串常量池中对应字符串地址,而…

基于vue+uniapp微信小程序公司企业后勤服务(设备)系统

本系统分为用户和管理员两个角色,其中用户可以注册登陆系统,查看公司公告,查看设备,设备入库,查看通讯录,会议室预约,申请出入,申请请假等功能。管理员可以对员工信息,会…

从 0 到 1!得物如何打造通用大模型训练和推理平台

1.背景 近期,GPT 大模型的发布给自然语言处理(NLP)领域带来了令人震撼的体验。随着这一事件的发生,一系列开源大模型也迅速崛起。依据一些评估机构的评估,这些开源模型大模型的表现也相当不错。一些大模型的评测情况可…

std vector 用法

使用vector&#xff0c;需添加头文件#include&#xff0c;要使用sort或find&#xff0c;则需要添加头文件#include。函数封装在命名空间std中&#xff0c;使用&#xff1a;using namespace std; 1、vector的初始化 std::vector<int> nVec;    // 空对象 std::vecto…

【Eigen 1】Eigen中的norm、normalize、normalized三者对比

一、norm() 1. 对于Vector&#xff0c;norm返回的是向量的二范数 即: ∣ ∣ x ∣ ∣ 2 ∑ i 1 N x i 2 ||x||_2 \sqrt{\sum_{i1}^{N} {x}^{2}_{i} } ∣∣x∣∣2​i1∑N​xi2​ ​ Vector2d vec(3.0,4.0); cout << vec.norm() << endl; /输出52. 对于Matrix&…