Kubernetes(k8s)核心资源解析:Pod详解

Kubernetes核心资源解析:Pod详解

  • 1、什么是Pod?
  • 2、Pod 的组成
  • 3、Pod 如何管理多个容器
  • 4、Pod 的网络
  • 5、Pod 的存储方式
  • 6、Pod 的工作方式
    • 6.1 自主式 Pod
    • 6.2 监控和管理 Pod
    • 6.3 Pod 的创建流程


💖The Begin💖点点关注,收藏不迷路💖

1、什么是Pod?

Pod是Kubernetes中最小的调度单元,它可以包含一个或多个容器。Pod中的所有容器共享网络和存储卷,它们一起运行在同一个节点上。Pod提供了一种抽象层,使得容器可以作为一个逻辑单元来管理。

Pod中的容器共享IP地址、端口空间和存储,它们可以通过localhost / 127.0.0.1相互通信。

Pod的运行需要根据Kubernetes集群的工作节点来运行,具体调度哪个节点,根据调度器(Scheduler)实现。

2、Pod 的组成

1、容器:Pod中可以包含一个或多个容器,这些容器共享网络和存储卷。
2、共享网络命名空间:Pod中的所有容器共享同一个网络命名空间,它们可以相互通信。
3、存储卷:Pod中的容器可以共享存储卷,这些存储卷可以用于数据持久化或共享。

在这里插入图片描述

3、Pod 如何管理多个容器

在 Kubernetes 中,Pod 是最小的可部署单元,可以包含一个或多个容器。Pod 内的所有容器共享相同的网络命名空间、IP 地址和存储卷,并在同一主机上调度。

例如:

可以将一个主要容器与一个或多个 Sidecar 容器组合在同一个 Pod 中。主要容器负责应用程序的主要逻辑,而 Sidecar 容器可以处理辅助任务,例如日志收集、监控等。

要管理多个容器的 Pod,需要仔细设计容器之间的交互和共享资源,并利用 Kubernetes 提供的各种功能来简化管理和操作。

比如:Kubernetes 提供了各种资源来管理多容器的 Pod,如 Deployment、StatefulSet、DaemonSet 等。这些资源可以自动管理 Pod 的部署、扩展和更新。

4、Pod 的网络

在容器化应用中,Pod 中的容器需要相互通信,以及与外部系统进行通信。Pod 网络提供了一种机制来管理这种通信,并确保安全、高效地进行网络连接。

Pod 网络的特性:

1、容器间通信:Pod 网络允许 Pod 内的容器相互通信,这使得容器之间可以共享资源和信息。
2、跨节点通信:Pod 可以分布在 Kubernetes 集群的不同节点上,Pod 网络负责确保跨节点的通信。
3、服务发现:Pod 网络通常与 Kubernetes 中的服务发现机制结合使用,使得应用程序能够轻松地发现和连接到其他服务。
4、网络策略:Pod 网络可以实施网络策略,限制 Pod 之间的通信,提高安全性。

Pod 网络实现方式:

1、Overlay 网络:使用 Overlay 网络技术(如 VXLAN、Flannel、Calico 等)创建一个虚拟网络层,使得 Pod 可以透明地跨节点通信。
2、Host 网络:容器直接使用节点的网络命名空间,与节点共享网络配置。这种方式效率高,但缺乏网络隔离性。
3、混合网络:结合 Overlay 网络和 Host 网络的优势,提供更灵活的网络管理方式。

5、Pod 的存储方式

容器是短暂的,它们可以随时启动、停止或重新调度。因此,任何存储在容器中的数据都会随着容器的生命周期而消失。为了持久化存储应用程序的数据,需要一种机制来确保数据的持久性和可靠性。

Pod 存储的特性:

1、持久性:Pod 存储提供持久化的存储机制,确保数据在容器重新启动或迁移时不会丢失。
2、可靠性:Pod 存储通常提供数据的备份、复制和恢复机制,以确保数据的可靠性和安全性。
3、性能:Pod 存储应该具有良好的性能,能够满足应用程序对存储的高吞吐量和低延迟的需求。
4、扩展性:Pod 存储应该能够方便地扩展以应对不断增长的数据量和请求量。

Pod 存储的实现方式:

1、空白存储:它不会持久化保存任何数据,只是一种临时存储卷类型,在容器退出后会被删除,用于临时操作。
2、持久卷:通过 Kubernetes 的持久卷机制,可以将外部存储卷挂载到 Pod 中,以实现数据的持久化存储。
3、配置存储:用于存储敏感信息的一种资源,比如密码、API 密钥等。通常用于 Pod 的环境变量或者文件中,跨pod共享数据使用,与容器内部数据无关。

6、Pod 的工作方式

6.1 自主式 Pod

自主式 Pod(也称为静态)Pod 是 Kubernetes 中的一种特殊类型的 Pod,它们不受控制器的管理,而是由用户直接创建和管理。这意味着它们不受 ReplicaSet、Deployment 或其他控制器的管理。

自主式 Pod 通常用于特殊用例(测试、开发环境)。

自主式 Pod 如果被删除、即会从集群中彻底删除,不会自动创建。

创建自主式 Pod 的一般步骤:

例子(创建自主式 Nginx Pod):

1、编写 Nginx Pod 的 YAML 配置文件:

vim nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx-podlabels:app: nginx
spec:containers:- name: nginximage: nginx:latestports:- containerPort: 80---
apiVersion: v1
kind: Service
metadata:name: nginx-service
spec:type: NodePortselector:app: nginxports:- protocol: TCPport: 80targetPort: 80nodePort: 30007

注意:nginx-service 将会匹配所有带有 app: nginx 标签的 Pods,并通过 NodePort 30007 将流量转发到这些 Pods 的 80 端口。

在这里插入图片描述

2、 将 YAML 文件应用到 Kubernetes 集群:

kubectl apply -f nginx-pod.yaml

在这里插入图片描述

3. 验证 Pod 是否成功创建:

kubectl get podskubectl get pods -o wide -l app=nginx#查看Pod 的详细信息
kubectl describe pod nginx

在这里插入图片描述

4. 访问 Nginx Pod:

既然 Service 类型是 NodePort,可以通过任意 Kubernetes 集群节点的 IP 地址加上端口号 30007 来访问 Nginx 服务,如 http://:30007。

在这里插入图片描述

在这里插入图片描述
5. 验证自主式Pod删除:

##删除前面创建的自主式 Nginx Pod[root@k8s-master test]# kubectl delete pod nginx-pod
pod "nginx-pod" deleted
[root@k8s-master test]#
[root@k8s-master test]# kubectl get pods -o wide -l app=nginx
No resources found in default namespace.
[root@k8s-master test]#

在这里插入图片描述

**结论**: 一旦删除自主式 Pod,其状态将无法恢复。在 Kubernetes 中,自主式 Pod 不会被控制器(如 Deployment 或 StatefulSet)所管理,因此删除后无法自动重建。



6.2 监控和管理 Pod

通常在生产环境中,Pod 都会由控制器对象(如 Deployment、StatefulSet、DaemonSet 等)进行管理,以确保高可用性、自动伸缩和故障恢复等功能。 这样做的好处包括能够更灵活地管理 Pod、自动重启失败的 Pod、根据需求扩展或缩减 Pod 数量等。

Kubernetes 会持续监控 Pod 的状态,并确保其处于期望的状态。如果 Pod 发生故障或终止,Kubernetes 将尝试重新启动 Pod,直到它达到期望的状态为止。

1、编写 Nginx Pod 的 YAML 配置文件:

前面的YAML 文件中包含了一个 Pod 和一个 Service 的定义,但没有使用控制器(如 Deployment 或 StatefulSet、Daemonset等)来管理 Pod。

例如:使用Deployment控制器来管理 Pod,修改 前面YAML 文件以包含 Deployment 部分。

vim nginx-deployment-service.yaml
apiVersion: apps/v1
kind: Deployment # 指定资源的类型,这里是一个 Deployment 资源。
metadata:name: nginx-deployment # 设置 Deployment 的名称为 nginx-deployment
spec: # 规格部分,包含了 Deployment 的规格信息replicas: 2  # 副本数为 2,表示将会创建 2 个 Pod,可以根据需要进行修改selector:matchLabels:app: nginx # 选择具有 app: nginx 标签的 Podtemplate:metadata:labels:app: nginx  # 为 Pod 设置标签为 app: nginxspec:containers:- name: nginx  # 容器的名称为 nginximage: nginx:latest  # 使用最新版本的 nginx 镜像ports:- containerPort: 80---
apiVersion: v1
kind: Service
metadata:name: nginx-service # 设置 Service 的名称为 nginx-service
spec:type: NodePort # 设置 Service 的类型为 NodePort,可以通过节点 IP 和节点端口来访问 Serviceselector:app: nginxports:- protocol: TCPport: 80  # Service 监听的端口号为 80targetPort: 80  # 将流量转发到 Pod 中的端口号为 80 的容器nodePort: 30007  # NodePort 类型的 Service 将会暴露在节点的 30007 端口上,可以通过节点 IP 和该端口来访问 Service

在这里插入图片描述

2、 将 YAML 文件应用到 Kubernetes 集群:

kubectl apply -f nginx-deployment-service.yaml

在这里插入图片描述

3. 验证 Pod 是否成功创建:

kubectl get podskubectl get pods -o wide -l app=nginx#查看Pod 的详细信息
kubectl describe pod nginx

在这里插入图片描述

5. 验证控制器管理的Pod删除:

测试:当删除一个由控制器(如 Deployment)管理的 Pod 时,控制器将负责维护所需的副本数2。如果删除了一个 Pod,控制器将会检测到并尝试按照定义的副本数重新创建 Pod,以确保所需的 Pod 数量处于正常状态。

1、删除 Pod:首先,我们将删除由控制器管理的 Pod nginx-deployment-544dc8b7c4-5s9mk。kubectl delete pods nginx-deployment-544dc8b7c4-5s9mk2、验证 Pod 删除:使用以下命令确认 Pod 是否已被删除:kubectl get pods

在这里插入图片描述

3、等待 Pod 恢复:等待一段时间,让控制器检测到 Pod 的删除并采取行动。根据配置,可能需要几秒钟或几分钟来重新创建 Pod。4、确认 Pod 是否已恢复:再次运行以下命令来检查 Pod 是否已被重新创建:

在这里插入图片描述

能够看到新的 Pod 正在运行,并且它们的名称与之前的 Pod 不同,因为控制器会为它们生成新的唯一标识符。这表明控制器成功地将被删除的 Pod 替换为新的 Pod。

6.3 Pod 的创建流程

在这里插入图片描述

Pod 创建流程

Pod 创建的流程通常包括以下几个步骤:

1、定义 Pod 的 YAML 文件:首先,您需要创建一个 Pod 的描述文件,通常是一个 YAML 文件,其中包含了 Pod 的各种配置信息,比如容器镜像、资源需求、环境变量等。

2、API Server 接收请求:将 Pod 的 YAML 文件提交给 Kubernetes 集群的 API Server。

3、验证和准备:API Server 首先会对 Pod 的描述进行验证,包括格式检查、权限检查等。一旦验证通过,Kubernetes 就会为 Pod 分配一个唯一的标识符。

4、调度器选择节点:接下来,调度器(Scheduler)会根据 Pod 的调度需求(比如资源需求、亲和性和反亲和性规则等)选择一个合适的节点(Node)来运行 Pod。

5、节点拉取镜像:一旦调度器确定了节点,该节点上的容器运行时(比如 Docker 或者 Containerd)将会拉取 Pod 中定义的容器镜像。

6、创建 Pod:容器运行时根据 Pod 的描述信息在节点上创建容器,并且应用相关的配置,比如挂载卷、设置网络等。

7、运行容器:一旦容器创建完成,容器运行时就会启动容器,并且监控容器的运行状态。

8、Pod 状态更新:一旦 Pod 中的容器全部启动成功,Kubernetes 就会更新该 Pod 的状态为“运行中”。

9、监控和自愈:Kubernetes 会持续监控 Pod 的运行状态,如果发现 Pod 出现异常(比如容器崩溃、节点故障等),Kubernetes 会尝试自动修复或者重新创建 Pod。

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

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

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

相关文章

解锁动态规划:从斐波那契到高效算法

动态规划(Dynamic Programming, DP)是解决优化问题的一种算法策略,它将一个复杂问题分解为更小的子问题,通过解决子问题来逐步找到复杂问题的最优解。动态规划适用于有重叠子问题和最优子结构性质的问题。接下来,我们通…

基于SSM的药店药品商城管理系统

介绍 本项目分为前后台,分为管理员与普通用户两种角色,管理员登录后台,普通用户登录前台; 管理员角色包含以下功能: 管理员登录,订单管理,客户管理,药品管理,类目管理等功能。用户角色包含以下功能: 用户首…

pycharm打包python文件为exe文件(图文教程)

1.安装pyinstaller库 pip3 install pyinstaller 2.使用pyinstaller 打包文件 首先确保Terminal命令行中,你的路径和你的项目是同一个路径 我的项目就是放在golden_dev中的。 3.命令行内输入打包代码 pyinstaller -F -w gold_miner.py gold_miner.py 是我的项目…

高斯消元详解

算法概述 高斯消元法是一个用来求解线性方程组的算法 那么什么是线性方程组呢? 线性:每个未知数次数都为1次方程组:多个方程,多个未知数。 (a1x1a2x2..anxnbn)x为一次的 当x是平方的时候就不是线性 简而言之就是有多个未知数&#xff…

0基础学习Mybatis系列数据库操作框架——多环境配置

大纲 配置代码参考资料 在实际开发中,我们往往会将开发环境分成:开发、测试、线上等环境。这些环境的数据源不一样,比如开发环境就不能访问线上环境,否则极容易出现线上数据污染等问题。Mybatis通过多环境配置分开定义来解决这个问…

Shell脚本之基本语法

目录 一、变量定义 变量命名规则: 变量的赋值: 只读变量: 删除变量: 二、变量的类型 自定义变量: 环境变量: 位置参数: 预定义变量: 三、键盘输入 四、数值运算 为什么…

数据结构—堆

什么是堆 堆是一种特殊的树形结构,其中每个节点都有一个值。堆可以分为两种类型:最大堆和最小堆。在最大堆中,每个节点的值都大于等于其子节点的值;而在最小堆中,每个节点的值都小于等于其子节点的值。这种特性使得堆…

RPA自动化小红书自动化写文以及发文!

1、视频演示 RPA自动化小红书自动写作发文 2、核心功能点 采集笔记:采集小红书上点赞量大于1000的爆款笔记 下载素材:下载爆款笔记的主图 爆款改写:根据爆款笔记的标题仿写新的标题以及新的文案 自动发布:将爆款笔记发布到小红…

Three.js——scene场景、几何体位置旋转缩放、正射投影相机、透视投影相机

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

第N6周:使用Word2vec实现文本分类

import torch import torch.nn as nn import torchvision from torchvision import transforms,datasets import os,PIL,pathlib,warnings #忽略警告信息 warnings.filterwarnings("ignore") # win10系统 device torch.device("cuda"if torch.cuda.is_ava…

基于springboot+vue+Mysql的招生管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

震惊!!原来阻塞队列消息队列这样理解会更简单!!!

震惊!!原来阻塞队列&&消息队列这样理解会更简单!!! 一:阻塞队列二:消息队列2.1:生产者消费者模型2.1.1:解耦合:2.1.2:削峰填谷: 三:消息队列代码3.1.13.1.2:3.1.3:生产慢,消费快,消费阻塞3.1.3:生产快,消费慢,生产阻塞 二级目录二级目录 一:阻塞队列 阻塞队列:先进先出…

gitcode 配置 SSH 公钥

在 gitcode 上配置SSH公钥后,可以通过SSH协议安全地访问远程仓库,无需每次都输入用户名和密码。以下是配置SSH公钥的步骤: 5分钟解决方案 用 OpenSSH公钥生成器 生成 公钥和私钥,私钥文件(id_rsa)下载&am…

【Leetcode】top 100 图论

基础知识补充 1.图分为有向图和无向图,有权图和无权图; 2.图的表示方法:邻接矩阵适合表示稠密图,邻接表适合表示稀疏图; 邻接矩阵: 邻接表: 基础操作补充 1.邻接矩阵: class GraphAd…

Open3D(C++) 鲁棒损失函数优化的ICP算法

目录 一、损失函数1、关于2、损失函数3、Open3D实现二、代码实现三、结果展示1、配准前1、配准后本文由CSDN点云侠原创,

C语言----数据在内存中的存储

文章目录 前言1.整数在内存中的存储2.大小端字节序和字节序判断2.1 什么是大小端?2.2 练习 3.浮点数在内存中的存储3.1.引子3.2.浮点数的存储3.2.2 浮点数取的过程 前言 下面给大家介绍一下数据在内存中的存储,这个是一个了解c语言内部的知识点&#xf…

【Linux学习】Linux 的虚拟化和容器化技术

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

MySQL 导入库/建表时/出现乱码

问题描述: 新建不久的项目在使用Navicat for MySQL进行查看数据,发现表中注释的部分乱码,但是项目中获取的数据使用不会。 猜测因为是数据库编码和项目中使用的不一样,又因为项目的连接语句定义了需要编码,故项目运行…

浅述安防视频监控平台EasyCVR视频汇聚管理系统运维管理能力

智慧安防监控EasyCVR视频管理平台能在复杂的网络环境中,将前端设备统一集中接入与汇聚管理。国标GB28181协议视频监控/视频汇聚EasyCVR平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、…

在云端遇见雨云:一位服务器寻觅者的指南

引言:寻觅一座云端归宿 当我踏入数字世界的边缘,带着对网络的探索与期待,我迫切需要一座安全可靠的数字栖息地。云计算技术正如一场魔法般的变革,而在这片广袤的云端中,雨云就像是一位友善的向导,引领我穿越…