k8s之pod概念

image

  1. 1. pod基本概念
  2. 2. pod网络概念
  3. 3. pod的生命周期和状态
  4. 4. 探针
  5. 5. 创建pod
  6. 6. 总结

  ‍

1. pod基本概念

  Kubernetes 中,Pod 是最小的网络调度单位, 每个pod可以放多个容器(例如可以放多个docke容器在同一个pod中运行),这些容器共享pod的网络、存储、以及容器规约。每个 Pod 被分配一个唯一的 IP 地址(Pod IP),这个 IP 在集群内是可达的。

  在介绍其他概念之前,首先先介绍一下相关的网络概念,因为这是容易比较迷糊的地方。在k8s中,node有一个ip,pod也有一个ip,然后一个pod中又有很多pod,对应了很多ip,这容易让人造成误解。

  • node的ip:node的是node对应的物理机(虚拟机,云主机)上的真实ip,比如说,你的一台物理机在公网上,那么这个node的ip便是一个公网的ip地址,我可以在任何地方拿着这个ip连接到这个node上。
  • pod的ip:pod的ip实际上就是一个内网ip,由k8s的网络插件在pod启动的时候进行动态分配。

Pod 运行在 Node 上,其网络流量进出需经过宿主机(Node),当外部访问 Pod 时,流量先到达 Node,再由相关组件转发到对应的pod

在一个正常工作的 Kubernetes 集群中,Node 节点之间的网络必须是互通的 —— 不仅 Node 之间要通,更重要的是,运行在不同 Node 上的 Pod 之间也必须能直接通信(三层路由可达)。

graph TD%% 定义节点和 Podsubgraph NodeA["NodeA (192.168.1.10)"]direction TBPodA["PodAIP: 10.244.1.5Port: 8080"]PodX["PodxIP: 10.244.1.xPort: xx"] endsubgraph NodeB["NodeB (192.168.1.11)"]direction TBPodB["PodBIP: 10.244.2.8Listens: 8080"]end%% 定义 ServiceService["Service: podB-serviceClusterIP: 10.96.xx.xxPort: 80 → targetPort: 8080"]%% 正确通信路径 —— PodA → PodBPodA -->|✅直接访问 Pod IP<br>curl http://10.244.2.8:8080</br>| PodB%% 推荐路径 —— PodA → Service → PodBPodA -->|✅推荐:通过 Service<br>curl http://podB-service:80</br>| ServiceService -->|自动负载均衡| PodB%% 错误路径(虚线 + 红色风格)PodA -.->|❌通常无效<br>curl http://192.168.1.11:8080</br>| NodeBPodA -->|✅显式设置<br>curl http://192.168.1.11:8080</br>| NodeB%% 添加说明注释classDef node fill:#e0f7fa,stroke:#0097a7;classDef pod fill:#fff9c4,stroke:#fbc02d;classDef svc fill:#c8e6c9,stroke:#388e3c;classDef invalid stroke:#f44336,stroke-dasharray: 5 5;class NodeA,NodeB nodeclass PodA,PodB podclass Service svcclass NodeB invalid

2. pod网络概念

在同一个 Pod 中的所有容器共享同一个网络命名空间(network namespace),因此它们拥有相同的 IP 地址(即 Pod IP),并共享同一个端口空间。容器之间可以通过 localhost 互相访问,但必须避免端口冲突。

  当你在一个 Pod 中定义多个容器,Kubernetes 会将这些容器放在同一个 Linux 网络命名空间中

  这意味着:

  • 所有容器看到的是同一个网络接口(如 eth0)
  • 所有容器共享同一个 IP 地址 —— 即 Pod IP
  • 所有容器共享同一个端口命名空间 —— 不能有两个容器监听同一个端口

  Pod IP 是集群内可路由的。外部(其他 Pod、Service、Node)访问该 Pod 时,访问的是 Pod IP + 某个端口,而这个端口由 Pod 内某个容器监听。

@startuml
skinparam componentStyle rectangle
skinparam linetype orthotitle Kubernetes Pod 网络关系图package "Node 1" {[Pod A\n(IP: 10.244.1.10)\nNamespace: dev] as podA #LightBluepackage "Pod A 内部" {[Container: nginx\n:80] as nginxA[Container: sidecar\n访问 localhost:80] as sidecarA}
}package "Node 2" {[Pod B\n(IP: 10.244.2.20)\nNamespace: prod] as podB #LightGreenpackage "Pod B 内部"  {[Container: app\n:8080] as appB[Container: logger\n访问 localhost:8080] as loggerB}
}note right of podA所有容器共享同一个网络命名空间- 共享 IP: 10.244.1.10- 通过 localhost 通信- 端口不能冲突
end notenote right of podB同理:- 共享 IP: 10.244.2.20- localhost 通信
end note' Pod 内部连接
nginxA -[hidden]-> sidecarA
sidecarA --> nginxA : "curl localhost:80\n直接访问"appB -[hidden]-> loggerB
loggerB --> appB : "curl localhost:8080\n直接访问"' Pod 之间跨节点/跨命名空间通信
podA --> podB : "curl 10.244.2.20:8080\n跨命名空间可达\n(默认无 NetworkPolicy 限制)"' 说明网络平面
rectangle "Kubernetes 集群网络平面\n所有 Pod IP 全局路由可达" as netplane #FFF4E0
netplane .. podA
netplane .. podBlegend right<b>说明</b>- Pod 内部:容器共享网络栈,localhost 通信- Pod 之间:无论命名空间或节点,IP 直接可达
end legend@enduml

  ‍

3. pod的生命周期和状态

  pod的生命周期可以分为如下4种,pod的生命周期是单向的,不会回到之前的状态。

  1. Pending
  2. Running
  3. Succeeded or Failed
  4. Unknown
graph TDA[创建 Pod<br>kubectl apply / Controller] --> B[Pending]B -->|镜像拉取中 / 调度中 / PVC绑定 / Init容器运行| C[Running]C -->|所有容器成功退出<br>exit 0| D[Succeeded]C -->|至少一个容器失败退出<br>exit ≠0 或 Crash| E[Failed]C -->|节点失联 / Kubelet无响应| F[Unknown]%% 探针和条件影响(非状态,但影响行为)C -->|readinessProbe 失败| G[Pod NotReady<br>不加入 Endpoints<br>不接收流量]C -->|livenessProbe 失败| H[重启容器<br>→ CrashLoopBackOff]C -->|startupProbe 失败| I[重启容器]%% Init 容器路径B -->|Init 容器执行中| J[Init:0/2, Init:Error 等]J -->|全部成功| CJ -->|失败| E%% 从 Unknown 可恢复F -->|节点恢复| CF -->|节点永久丢失| K[需手动/控制器重建]%% 样式美化classDef pending fill:#fff3cd,stroke:#ffeaa7;classDef running fill:#d4edda,stroke:#c3e6cb;classDef success fill:#d1e7dd,stroke:#badbcc;classDef failed fill:#f8d7da,stroke:#f5c6cb;classDef unknown fill:#e2e3e5,stroke:#d6d8db;classDef note fill:#f0f0f0,stroke:#ccc,stroke-dasharray: 5 5;class B pendingclass C runningclass D successclass E failedclass F unknownclass G,H,I,J,K note

  而pod又可以分为如下5种状态:

取值 描述
Pending Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间。
Running Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。注意Runing状态≠pod健康
Succeeded Pod 中的所有容器都已成功结束,并且不会再重启。
Failed Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止,且未被设置为自动重启。
Unknown 因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。

  那么如何知道pod究竟可不可用呢,那就得看pod的就绪状态,pod.status.conditions[? type=="Ready"],如果type=Ready就代表pod可用,能接受流量,否则就代表不可用。

4. 探针

  前文我们提到了pod分为不同的生命周期,以及对应的pod相关状态,那么问题来了,我怎么知道pod就行有没有运行成功呢,有没有ready呢,这就得靠我们的探针大哥帮忙。

  探针的目的就是为了检测容器相关的状态,一共有如下四种探针检查机制:

  1. exec:执行命令,检查容器是否ok
  2. grpc:使用grpc检查容器是否正常
  3. httpGet:http请求检查容器是否正常
  4. tcpSocket:检查容器tcp端口是否打开,打开则正常

  针对于探针的检查结果,无非就三种结果:成功、失败、未知(也就是探测失败,不采取任何行动)。当然,如果你不设置探针,那结果肯定就都是默认成功。

  有了探针的检查结果,那么应该做什么呢?k8s有如下3种探针类型:

  1. livenessProbe检查容器是否“活着”(进程是否卡死/假死),失败则根据重启策略重启容器。
  2. readinessProbe检查容器是否“准备好服务”。如果失败,则容器容器就不能对外提供服务(其实就是自动将该 Pod 从对应的 Endpoints 对象中移除,从而不再将流量路由到这个 Pod,容器的状态为NotReady,对应的pod的状态Ready=False)。
  3. startupProbe指示容器中的应用是否已经启动。如果提供了该类型探针,在成功前,会屏蔽其他类型的探针。当然,如果失败了,则会根据对应的策略进行重启。

Pod 从创建到“真正可用”,必须等待所有容器的 readinessProbe 成功 —— 这是探针对 Pod “可用性”的核心控制点。

以下是千问老师总结的使用要点:

‍♂️ Readiness = 能不能干活 → 不行就“靠边站”,别重启!
Liveness = 还有没有气 → 不行就“抬走重来”,必须重启!
Startup = 刚出生要呵护 → 启动期特殊保护,长大再考核!

  ‍

graph TDA[Pod 创建] --> B[容器启动]B --> C{是否有 startupProbe?}C -- 有 --> D[执行 startupProbe 直到成功]C -- 无 --> E[开始 liveness/readinessProbe]D --> EE --> F[周期性探测]F --> G{liveness 失败?}G -- 是 --> H[重启容器 → Pod RestartCount++]F --> I{readiness 失败?}I -- 是 --> J[Pod Ready=False → 从 Endpoints 移除]

5. 创建pod

  前面介绍了这么多,现在让我们使用命令来创建一个pod吧,大家可以在这个Killercoda Interactive Environments进行在线创建。

kubectl run nginxtest --image=nginx:latest --port=80

  这样,我们便创建了一个nginx的pod:

image

6. 总结

  Pod 是 Kubernetes 中最小的可部署、可调度的计算单元,一个 Pod 可以包含一个或多个紧密耦合的容器(共享网络、存储、生命周期)。pod的生命周期是不可逆的,而探针能够不断去对pod的状态进行检测,从而保证服务的可用性。我们有通过相关命令创建了一个pod,但是大家可以想一想,这个pod如果挂了,还能够重启吗?如果不能重启,那怎么去解决这个问题呢?让我们在下一章再进行介绍。

  ‍

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

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

相关文章

鸿蒙版Taro 搭建开发环境 - 教程

鸿蒙版Taro 搭建开发环境 - 教程2025-10-06 10:09 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !import…

CF 1055 Div.1+Div.2

F - Triple Attack 我会了。 G - Query Jungle 我会了。 H1 - Victorious Coloring (Easy Version) 我不会。 H2 - Victorious Coloring (Hard Version) 我不会。

LUCKY STUN穿透在Windows上使用UPnP工具为BT客户端自动添加内外端口号不同的映射规则

LUCKY STUN穿透在Windows上使用UPnP工具为BT客户端自动添加内外端口号不同的映射规则2024.02.07 关于本教程 本教程基于:基于stun穿透工具LUCKY,使BT客户端绿灯、开放TCP端口的办法(进化版) 在该教程中实现了使用 …

深圳门户网站制作wordpress 鼠标特效

摘要&#xff1a; 4月30日&#xff0c;阿里云发现&#xff0c;俄罗斯黑客利用Hadoop Yarn资源管理系统REST API未授权访问漏洞进行攻击。 Hadoop是一款由Apache基金会推出的分布式系统框架&#xff0c;它通过著名的 MapReduce 算法进行分布式处理&#xff0c;Yarn是Hadoop集群的…

2026 NOI 做题记录(五)

推荐阅读:A、B、E、F、N、O、R、T、U、WContest Link \(\text{By DaiRuiChen007}\)*A. [CF2097F] Lost Luggage (7.5) Problem Link 先建立网络流,每层的点 \(i\) 向下一层 \(i-1,i,i+1\) 分别连权值 \(a_i,b_i,c_i\…

ARC 207 (Div.1)

A - Affinity for Artifacts 我不会。我会了。 B - Balanced Neighbors 2然后 \(n\leq 5\) 无解。 C - Combine to Make Non-decreasing 容易发现原题目等价于将原序列分成若干段,要求段之间的 \(\text{OR}\) 值 non-…

四大门户网站的区别深圳营销型网站定制

教师资格认定前需要做的准备材料 准备身份证户口本 居住证 学生证 教师考试合格证明 普通话证书 学历证书 体检合格证书 近期一寸白底证件照 网上报名 河南24下教资认定 网上报名时间&#xff1a;10月21日-11月1日 现场确认 网上审核未通过的宝子&#xff0c;需要…

“齐俊杰投资智能体”更新完了9月份的资料

“齐俊杰投资智能体”更新完了9月份的资料,本次更新包括了9月份的课程和粉丝群问答,读书更新了这几本:明斯基时刻。每日问答的语音转文字已经使用了AI进行格式优化,更加容易阅读。将新资料更新到了智能体,大家可以…

联想电脑护眼卫士与系统颜色配置(X-Rite)冲突 | 显示设置频繁变换色阶 - 解决方案 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

(转载)无人机飞行模式全面解析

(转载)无人机飞行模式全面解析原文地址: https://baijiahao.baidu.com/s?id=1822706539478215889飞行模式详解 自稳模式: 在自稳模式下,飞手通过操作roll与pitch摇杆来控制飞行器的倾斜角度。一旦飞手松开这些摇…

html官方网站建站系统cms是什么

tcp长连接和保活时间TCP协议中有长连接和短连接之分。短连接在数据包发送完成后就会自己断开&#xff0c;长连接在发包完毕后&#xff0c;会在一定的时间内保持连接&#xff0c;即我们通常所说的Keepalive&#xff08;存活定时器&#xff09;功能。 www.2cto.com 默认的Keepa…

河北雄安建设投资集团网站微网站免费搭建平台

来源&#xff1a;专知 摘要对话系统是一个流行的自然语言处理(NLP)任务&#xff0c;因为它在现实生活中应用前景广阔。这也是一个复杂的任务&#xff0c;因为涉及到许多需要研究的自然语言处理任务。因此&#xff0c;关于深度学习的对话系统研究的大量工作开展了。在这个综述中…

网站建设怎么上传数据微信小程序设计软件

写在前面 内部审计是一种独立的、客观的确认和咨询活动&#xff0c;包括鉴证、识别和分析问题以及提供管理建议和解决方案。狭义的数字化转型是指将企业经营管理和业务操作的各种行为、状态和结果用数字的形式来记录和存储&#xff0c;据此再对数据进行挖掘、分析和应用。广义…

InstructGPT 论文略读:三步走,让大模型真正听懂人话

InstructGPT 论文略读:三步走,让大模型真正听懂人话InstructGPT 论文略读:三步走,让大模型真正听懂人话 摘要 (Introduction) 大语言模型(LLM),如 GPT-3,无疑开启了自然语言处理的新纪元。它们强大的零样本和少…

LVS+Keepalived高可用群集 - 指南

LVS+Keepalived高可用群集 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

luogu P1020 [NOIP 1999 提高组] 导弹拦截

题目大意 共有两问求最长不升子序列 求最少能分为几个不升子序列Sol 原数据是 \(1e4\) 的,所以先考虑 \(O(n^2)\) 做法。第一问 容易发现,这跟我们求最长不降子序列是一样的 所以我们直接设状态为 \(dp_i\) 表示前 \…

网站建设方案后期服务制作网站的商家

作者&#xff1a;Greg Cipolaro&#xff0c;NYDIG 全球研究主管 编译&#xff1a;WEEX Exchange 几只重要的 ETF 申请将于 10 月中旬迎来审核窗口&#xff0c;本文通过观察近期期权市场的动态&#xff0c;以研究交易者对这些关键 ETF 日期的仓位态度&#xff1b;门头沟&#xf…

深圳住房建设局官方网站广州建网站要多少钱

sed https://mp.weixin.qq.com/s/PxaesXU7nkmYNCxIQ1ZHfw sed是一个强大的流式文本编辑器&#xff0c;它可以在读取文本时进行修改并输出&#xff0c;支持各种复杂的字符串替换、内容删除、行插入等操作。 sed s/old_string/new_string/g test.txt > new_test.txts是sed命令…

网站后台 设计生活服务网站开发

work下面新建文件夹 commit上传 上传 组员update 出现文件夹 新建文件夹 右键上传 点击小乌龟show-log 记录问题 版本操作 再次输入 bbb 先更新 更新之后再次上传 添加了bbb 单击右键 回滚

零基础学网站开发电子商务网站建设规划的论文

1&#xff1a;生成svg图标 登录阿里云官网 1.1 创建项目组 1.2 从阿里云网站上面获取喜欢的图标加入到已有的项目组 1.3 如果团队有自己的设计师&#xff0c;也可以让设计师上传自己的svg图标到阿里云指定的项目组&#xff1b; 使用的时候&#xff0c;把 资源包下载到本地项…