【Pod 详解】Pod 的概念、使用方法、容器类型

Pod 详解》系列,共包含以下几篇文章:

  • Pod 的概念、使用方法、容器类型
  • Pod 的生命周期(一):Pod 阶段与状况、容器的状态与重启策略
  • Pod 的生命周期(二):Pod 的健康检查之容器探针
  • Pod 状态速查表
  • Pod 的调度策略
  • Pod 资源调度之亲和性调度
  • Pod 驱逐

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

Pod 的概念、使用方法、容器类型

  • 1.什么是 Pod
  • 2.Pod 的基本使用方法
  • 3.Pod 中的容器
    • 3.1 基础容器
    • 3.2 初始化容器
    • 3.3 临时容器
    • 3.4 业务容器

Kubernetes 通过一个抽象的逻辑单元 Pod 将应用的容器组合在一起,从而使得应用更容易被发现和管理。Pod 是 Kubernetes 的核心。
在这里插入图片描述

1.什么是 Pod

Pod 是 Kubernetes 中的一个 逻辑单位,它代表集群中正在运行的一个进程,是 Kubernetes 集群中的一个应用实例,由一个或者多个容器组成。在 Pod 中还可以包含数据的持久化存储、网络配置等资源。Pod 支持多种容器的执行环境,而 Docker 则是 Pod 最常见的 执行环境。Pod 也支持用其他容器引擎作为执行环境。

🚀 Pod 是 Kubernetes 项目的原子调度单位,关于 Pod 最重要的一个事实是:它只是一个逻辑概念。也就是说,Kubernetes 真正处理的,还是宿主机操作系统上 Linux 容器的 NamespaceCgroups,而并不存在一个所谓的 Pod 的边界或者隔离环境。

在 Kubernetes 中,主要有两种使用 Pod 的方式。

  • 单容器的 Pod:最常见的使用 Pod 的方式,即在 Pod 中只运行一个容器,Kubernetes 通过 Pod 来管理这个容器。
  • 多容器的 Pod:当应用需要多个容器一起协同工作时,Pod 中可以运行多个容器,从而满足应用的要求。Kubernetes 的调度器会保证这些容器都运行在同一台物理主机或虚拟主机上,从而达到容器之间的资源共享。

🚀 由于这些容器运作在同一个宿主机上,因此它们可以通过 localhost 互相访问。不过,除非是具有强耦合关系的容器,否则不推荐使用这种方式。

Kubernetes 使用 Pod 来管理容器具有以下优点:

  • Pod 作为最小的 逻辑部署单元,简化了应用部署的难度,同时也极大地方便了应用的管理。
  • Pod 作为独立运行的 服务单元,可以方便地进行 部署水平扩展 / 收缩调度管理资源分配
  • Pod 中的容器共享命名空间和网络地址,方便进行统一的资源管理与资源分配。

2.Pod 的基本使用方法

通过使用 YAML 文件可以描述一个 Pod。

Pod 的配置信息包含以下几部分。其中最重要的部分是 metadataspec

  • apiVersion:创建该对象所使用的 Kubernetes APl 的版本。
  • kind:指定对象的类型,即 Pod。
  • metadata:设置 Pod 的元信息,包括对象的名称、ID 及命名空间等。
  • spec:设置 Pod 的规约信息。
  • status:设置 Pod 运行时的状态。

下面是 Pod 的一个示例文件 firstpod.yaml

apiVersion: v1
kind: Pod
metadata:name: first-podlabels:app: demotype: bash
spec:replicas: 2containers:- name: busybox-containerimage: busyboxcommand: ['sh', '-c', 'echo Hello Kubernetes Pod! && sleep 1000']
  • 使用 firstpod.yaml 方式创建 Pod
kubectl create -f firstpod.yaml
  • 查看正在运行的 Pod 信息
kubectl get pod first-pod -o yaml
  • 查看 Pod 的标准输出日志
kubectl logs first-pod

输出日志如下:

Hello Kubernetes Pod!

如果在 Pod 中有多个容器,则在查看某个容器的日志时需要指定容器的名称,例如:kubectl logs pod-name -c container-name

  • 显示 Pod 的标签
kubectl get pods --show-labels

标签 Label 是 Kubernetes 管理 Pod 的重要属性,我们可以在 YAML 文件的 metadata 配置参数中指定,也可以通过命令行指定。

  • 根据标签查询 Pod
kubectl get pods -l app=demo --show-labels
  • 通过命令给 Pod 增加标签
kubectl label pod first-pod side=frontend
  • 通过命令行修改 Pod 的标签
kubectl label pod first-pod side=unknown --overwrite
  • 也可以将标签显示为列
kubectl get pods -L app,type,side

3.Pod 中的容器

Pod 由一个或多个容器组成。这里的容器通常指运行应用的业务容器。在 Pod 中,除业务容器外,还有 基础容器初始化容器临时容器

3.1 基础容器

基础容器(Infrastructure Container)负责维护整个 Pod 的 网络空间。这种类型的容器对用户是 透明的,用户不能操作这种容器。

在 node 节点上,通过 docker ps 命令可以查看基础容器。

基础容器将使用 pause 镜像来创建和维护 Pod 的网络环境。

3.2 初始化容器

初始化容器 晚于基础容器运行,但先于业务容器运行。如果 Pod 的初始化容器运行失败,则默认情况下 Kubernetes 会不断尝试重启 Pod,直到初始化容器运行成功。如果将 Pod 的配置参数 restartPolicy 设置为 Never,则 Kubernetes 不会执行重启动作。

如果要将 Pod 中的容器指定为初始化容器,则需要在 spec 中添加 initContainers 字段。一个 Pod 可以指定多个初始化容器,它们会按顺序逐个运行:一个初始化容器运行成功,下一个才能够运行。当所有的初始化容器运行完成后,Kubernetes 才会执行业务容器从而运行应用。

下面是一个初始化容器的示例。

  • 创建 initcontainer.yaml 文件,并在其中输入以下内容。
apiVersion: v1
kind: Pod
metadata:name: myapp-podlabels:app: myapp
spec:containers:- name: myapp-containerimage: busybox:1.28command: ['sh', '-c', 'echo The app running! && sleep 5']initContainers:- name: init-myserviceimage: busybox:1.28command: ['sh', '-c', 'echo The init-myservice running! && sleep 5']- name: init-mydbimage: busybox:1.28command: ['sh', '-c', 'echo The init-mydb running! && sleep 5']
  • 执行以下语句创建 Pod
kubectl apply -f initcontainer.yaml
  • 在 Pod 创建成功后,使用 describe 命令查看输出信息
kubectl describe -f initcontainer.yaml

Kubernetes 会先启动了两个初始化容器(init-myserviceinit-mydb),之后启动了业务容器(myapp-container)。

初始化容器与业务容器是分离的,具有以下优势:

  • 🚀 在初始化容器中可以提前安装在业务容器中要使用的工具,或者运行一些初始化的脚本。
  • 🚀 将应用依赖的工具和脚本分离到初始化容器中,可以避免这些工具降低应用镜像的安全性。
  • 🚀 开发人员可以进行组件镜像的独立创建和部署,而不需要将所有的组件构建成一个大的应用镜像。
  • 🚀 初始化容器可以独立访问 Kubernetes 中的一些敏感信息,如 Secret。
  • 🚀 由于初始化容器必须在业务容器之前执行完成,因此,可以利用初始化容器来阻塞或延迟业务容器的启动,从而进行先决条件的检查。

3.3 临时容器

临时容器 是一种特殊的容器。它在现有的 Pod 中临时运行,以完成用户发起的操作(例如 故障排查性能诊断 等)。由于临时容器没有端口要配置,且资源分配是不可变的,所以它不适合用来构建应用。

临时容器的最大用途是 调试其他的容器。因为,当 Pod 中的容器异常退出,或者容器镜像不包含调试工具时(例如没有 shell),会导致 kubectl exec 命令无法使用。这时临时容器对于交式故障排查就很有用了。

下面是 Kubernetes 官方提供的一个临时容器的示例。

  • 使用 k8s.gcr.io/pause:3.1 镜像创建一个 Pod。
kubectl run ephemeral-demo --image=k8s.gcr.io/pause:3.1 --restart=Never

🚀 这里使用 k8s.gcr.io/pause:3.1 镜像是因为它不包含任何调试程序。

  • 使用 kubectl exec 命令创建 shell 进入容器。
kubectl exec -it ephemeral-demo -- sh

由于该镜像不包含任何调试程序,因此会出现以下错误信息:

OCI runtime exec failed: exec failed: container_linux.go:346: starting container process caused "exec: \"sh\": executable file not found in $PATH": unknown
  • 使用 kubectl debug 命令为 ephemeral-demo 容器添加一个临时容器,以达到调试的目的。
kubectl debug -it ephemeral-demo --image=busybox --target=ephemeral-demo

这里使用 busybox 的镜像来创建临时容器,Kubernetes 将自动启动临时容器的控制台。在临时容器启动后,会输出如下信息:

Defaulting debug container name to debugger-8xzrl.
If you don't see a command prompt, try pressing enter.
/#

3.4 业务容器

业务容器(Containers)是实际运行应用的容器,如第 2 节中创建的 busybox-container 容器。

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

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

相关文章

C++入门基础:C++中的常用操作符练习

开头介绍下C语言先,C是一种广泛使用的计算机程序设计语言,起源于20世纪80年代,由比雅尼斯特劳斯特鲁普在贝尔实验室开发。它是C语言的扩展,增加了面向对象编程的特性。C的应用场景广泛,包括系统软件、游戏开发、嵌入式…

智慧医院临床检验管理系统源码(LIS),全套LIS系统源码交付,商业源码,自主版权,支持二次开发

实验室信息系统是集申请、采样、核收、计费、检验、审核、发布、质控、查询、耗材控制等检验科工作为一体的网络管理系统。它的开发和应用将加快检验科管理的统一化、网络化、标准化的进程。一体化设计,与其他系统无缝连接,全程化条码管理。支持危机值管…

DataX(二):DataX安装与入门

1. 官方地址 下载地址:http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz 源码地址:GitHub - alibaba/DataX: DataX是阿里云DataWorks数据集成的开源版本。 2. 前置要求 Linux JDK(1.8 以上,推荐 1.8) Python(推荐 Pyt…

一文总结代理:代理模式、代理服务器

概述 代理在计算机编程领域,是一个很通用的概念,包括:代理设计模式,代理服务器等。 代理类持有具体实现类的实例,将在代理类上的操作转化为实例上方法的调用。为某个对象提供一个代理,以控制对这个对象的…

测试分类篇

按测试对象划分 这里可以分为界面测试, 可靠性测试, 容错率测试, 文档测试, 兼容性测试, 安装卸载测试, 安全测试, 性能测试, 内存泄露测试. 界面测试 界面测试(简称UI测试),指按照界面的需求(一般是UI设计稿)和界面的设计规则…

DOS攻击实验

实验背景 Dos 攻击是指故意的攻击网络协议实现的缺陷或直接通过野蛮手段,残忍地耗尽被攻击对象的资源,目的是让目标计算机或网络无法提供正常的服务或资源访问,使目标系统服务系统停止响应甚至崩溃。 实验设备 一个网络 net:cloud0 一台模…

基于微信小程序+SpringBoot+Vue的儿童预防接种预约系统(带1w+文档)

基于微信小程序SpringBootVue的儿童预防接种预约系统(带1w文档) 基于微信小程序SpringBootVue的儿童预防接种预约系统(带1w文档) 开发合适的儿童预防接种预约微信小程序,可以方便管理人员对儿童预防接种预约微信小程序的管理,提高信息管理工作效率及查询…

24暑假算法刷题 | Day22 | LeetCode 77. 组合,216. 组合总和 III,17. 电话号码的字母组合

目录 77. 组合题目描述题解 216. 组合总和 III题目描述题解 17. 电话号码的字母组合题目描述题解 77. 组合 点此跳转题目链接 题目描述 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输…

移动UI:排行榜单页面如何设计,从这五点入手,附示例。

移动UI的排行榜单页面设计需要考虑以下几个方面: 1. 页面布局: 排行榜单页面的布局应该清晰明了,可以采用列表的形式展示排行榜内容,同时考虑到移动设备的屏幕大小,应该设计合理的滚动和分页机制,确保用户…

贪心算法.

哈夫曼树 哈夫曼树(Huffman Tree),又称为霍夫曼树或最优二叉树,是一种带权路径长度最短的二叉树,常用于数据压缩。 定义:给定N个权值作为N个叶子结点,构造一棵二叉树,若该树…

普乐蛙VR航天航空体验馆知识走廊VR体验带你登陆月球

VR航天航空设备是近年来随着虚拟现实(VR)技术的快速发展而兴起的一种新型设备,它结合了航天航空领域的专业知识与VR技术的沉浸式体验,为用户提供了前所未有的航天航空体验。以下是对VR航天航空设备的详细介绍: 一、设备…

UGUI优化篇--UGUI合批

UGUI合批 UGUI合批规则概述UGUI性能查看工具合批部分的特殊例子一个白色image、蓝色image覆盖了Text,白色image和Text哪个先渲染 Mask合批Mask为什么会产生两个drawcallMask为什么不能合批Mask注意要点 RectMask2D为什么RecMask2D比Mask性能更好主要代码RectMask2D注…

Golang | Leetcode Golang题解之第295题数据流的中位数

题目: 题解: type MedianFinder struct {nums *redblacktree.Treetotal intleft, right iterator }func Constructor() MedianFinder {return MedianFinder{nums: redblacktree.NewWithIntComparator()} }func (mf *MedianFinder) AddNum(…

MySQL中多表查询之外连接

首先先来介绍一下我做的两个表,然后再用他们两个举例说明。 -- 创建教师表 create table teachers( id_t int primary key auto_increment, -- 老师编号 name_t varchar(5) -- 姓名 ); -- 创建学生表 create table students( id_s int primary key auto_increment,…

数据结构——单链表OJ题(下)

目录 一、链表的回文结构 思路一:数组法 (1)注意 (2)解题 思路二:反转链表法 (1) 注意 (2)解题 二、相交链表 (1)思路&#…

优化算法:1.遗传算法(GA)及Python实现

一、定义 遗传算法就像是在模拟“优胜劣汰”的进化过程,通过选择最优秀的个体,交配产生下一代,并引入一定的变异,逐步优化解决问题。 二、具体步骤 初始化种群(Initialization): 假设你要找到一个迷宫的最佳出口路径。…

CTF-NSSCTF[GKCTF 2021]

[GKCTF 2021]easycms 考察: 用扫描工具扫描目录,扫描到后台登录界面/admin.php 题目提示了密码是五位弱口令,试了试弱口令admin和12345直接成功了 任意文件下载 点击设计-->主题然后随便选择一个主题,点击自定义&#xff0…

故障诊断 | 基于Transformer故障诊断分类预测(Matlab)

文章目录 预测效果文章概述程序设计参考资料预测效果 文章概述 Transformer故障诊断/分类预测 | 基于Transformer故障诊断分类预测(Matlab) Transformer 模型本质上都是预训练语言模型,大都采用自监督学习 (Self-supervised learning) 的方式在大量生语料上进行训练,也就是…

CTF之网站被黑

简单看一下网页和源码没发现什么明显漏洞 那就扫描一下目录 发现了/shell.php文件,访问一下,发现是一个后台管理登录页面 别无他法只能爆破喽,爆破后发现密码是hack flag{25891d9e9d377f006eda3ca7d4c34c4d}

@JSONField(format = “yyyyMMddHH“)的作用和使用

JySellerItqrdDataDO对象中的字段为: private Date crdat; 2.数据库中的相应字段为: crdat datetime DEFAULT NULL COMMENT 创建时间,2. 打印出的结果为: “crdat”:“2024072718” 年月日时分秒 3. 可以调整format的格式 4. 这样就把Date类…