05 Pod:如何理解这个Kubernetes里最核心的概念?

news2024/11/28 6:51:24

文章目录

  • 1 为什么要有pod?
  • 2. 为什么Pod 是 Kubernetes 的核心对象?
  • 3. 如何用YAML描述Pod?
    • 3.1 Pod的基本组成部分
      • 3.1.1 最重要的 spec.containers 字段使用
        • 3.1.1.1为什么要定义容器启动时要执行的命令?
  • 4. 如何使用kubectl 操作Pod?
    • 4.1 创建pod
    • 4.2 删除pod
    • 4.3 输出pod 日志
    • 4.4 获取pod 列表和运行状态
    • 4.5 调试排错pod
    • 4.6 kubectl 拷贝命令
    • 4.7 kubectl 进入pod
  • 5. Pod小结
  • 6. 思考
    • 6.1 如果没有 Pod,直接使用容器来管理应用会有什么样的麻烦?
    • 6.2 你觉得 Pod 和容器之间有什么区别和联系?

1 为什么要有pod?

Pod 这个词原意是“豌豆荚”,后来又延伸出“舱室”“太空舱”等含义,你可以看一下这张图片,形象地来说 Pod 就是包含了很多组件、成员的一种结构。
在这里插入图片描述
容器技术我想你现在已经比较熟悉了,它让进程在一个“沙盒”环境里运行,具有良好的隔离性,对应用是一个非常好的封装。

不过,当容器技术进入到现实的生产环境中时,这种隔离性就带来了一些麻烦。因为很少有应用是完全独立运行的,经常需要几个进程互相协作才能完成任务,比如在“入门篇”里我们搭建 WordPress 网站的时候,就需要 Nginx、WordPress、MariaDB 三个容器一起工作。

WordPress 例子里的这三个应用之间的关系还是比较松散的,它们可以分别调度,运行在不同的机器上也能够以 IP 地址通信。

但还有一些特殊情况,多个应用结合得非常紧密以至于无法把它们拆开。比如,有的应用运行前需要其他应用帮它初始化一些配置,还有就是日志代理,它必须读取另一个应用存储在本地磁盘的文件再转发出去。这些应用如果被强制分离成两个容器,切断联系,就无法正常工作了。

那么把这些应用都放在一个容器里运行可不可以呢?

当然可以,但这并不是一种好的做法。因为容器的理念是对应用的独立封装,它里面就应该是一个进程、一个应用,如果里面有多个应用,不仅违背了容器的初衷,也会让容器更难以管理。

为了解决这样多应用联合运行的问题,同时还要不破坏容器的隔离,就需要在容器外面再建立一个“收纳舱”,让多个容器既保持相对独立,又能够小范围共享网络、存储等资源,而且永远是“绑在一起”的状态。

所以,Pod 的概念也就呼之欲出了,容器正是“豆荚”里那些小小的“豌豆”,你可以在 Pod 的 YAML 里看到,“spec.containers”字段其实是一个数组,里面允许定义多个容器。

如果再拿之前讲过的“小板房”来比喻的话,Pod 就是由客厅、卧室、厨房等预制房间拼装成的一个齐全的生活环境,不仅同样具备易于拆装易于搬迁的优点,而且要比单独的“一居室”功能强大得多,能够让进程“住”得更舒服

2. 为什么Pod 是 Kubernetes 的核心对象?

因为 Pod 是对容器的“打包”,里面的容器是一个整体,总是能够一起调度、一起运行,绝不会出现分离的情况,而且 Pod 属于 Kubernetes,可以在不触碰下层容器的情况下任意定制修改。所以有了 Pod 这个抽象概念,Kubernetes 在集群级别上管理应用就会“得心应手”了。

Kubernetes 让 Pod 去编排处理容器,然后把 Pod 作为应用调度部署的最小单位,Pod 也因此成为了 Kubernetes 世界里的“原子”(当然这个“原子”内部是有结构的,不是铁板一块),基于 Pod 就可以构建出更多更复杂的业务形态了。

下面的这张图你也许在其他资料里见过,它从 Pod 开始,扩展出了 Kubernetes 里的一些重要 API 对象,比如配置信息 ConfigMap、离线作业 Job、多实例部署 Deployment 等等,它们都分别对应到现实中的各种实际运维需求。

从这两张图中你也应该能够看出来,所有的 Kubernetes 资源都直接或者间接地依附在 Pod 之上,所有的 Kubernetes 功能都必须通过 Pod 来实现,所以 Pod 理所当然地成为了 Kubernetes 的核心对象。

在这里插入图片描述
在这里插入图片描述

3. 如何用YAML描述Pod?

既然 Pod 这么重要,那么我们就很有必要来详细了解一下 Pod,理解了 Pod 概念,我们的 Kubernetes 学习之旅就成功了一半。

还记得吧,我们始终可以用命令 kubectl explain 来查看任意字段的详细说明,所以接下来我就只简要说说写 YAML 时 Pod 里的一些常用字段。

3.1 Pod的基本组成部分

因为 Pod 也是 API 对象,所以它也必然具有 apiVersion、kind、metadata、spec 这四个基本组成部分。

  • “apiVersion”和“kind”
    这两个字段很简单,对于 Pod 来说分别是固定的值 v1 和 Pod。

  • “metadata”
    一般来说,里应该有 name 和 labels 这两个字段。
    < 我们在使用 Docker 创建容器的时候,可以不给容器起名字,但在 Kubernetes 里,Pod 必须要有一个名字,这也是 Kubernetes 里所有资源对象的一个约定。在课程里,我通常会为 Pod 名字统一加上 pod 后缀,这样可以和其他类型的资源区分开。>

    • name 只是一个基本的标识,信息有限。
    • labels 字段就派上了用处。它可以添加任意数量的 Key-Value,给 Pod“贴”上归类的标签,结合 name 就更方便识别和管理了。
      比如说,我们可以根据运行环境,使用标签 env=dev/test/prod,或者根据所在的数据中心,使用标签 region: north/south,还可以根据应用在系统中的层次,使用 tier=front/middle/back ……如此种种,只需要发挥你的想象力。
      apiVersion: v1
      kind: Pod
      metadata:
      name: busy-pod
       labels:
         owner: chrono
         env: demo
         region: north
         tier: back
      		
      
  • spec
    “spec”字段由于需要管理、维护 Pod 这个 Kubernetes 的基本调度单元,里面有非常多的关键信息,今天我介绍最重要的“containers”,其他的 hostname、restartPolicy 等字段你可以课后自己查阅文档学习。

3.1.1 最重要的 spec.containers 字段使用

“containers”是一个数组,里面的每一个元素又是一个 container 对象,也就是容器。

和 Pod 一样,container 对象也必须要有一个 name 表示名字,然后当然还要有一个 image 字段来说明它使用的镜像,这两个字段是必须要有的,否则 Kubernetes 会报告数据验证错误。

container 对象的其他字段基本上都可以和“入门篇”学过的 Docker、容器技术对应,理解起来难度不大,我就随便列举几个:

  • ports:列出容器对外暴露的端口,和 Docker 的 -p 参数有点像。
  • imagePullPolicy:指定镜像的拉取策略,可以是 Always/Never/IfNotPresent,一般默认是 IfNotPresent,也就是说只有本地不存在才会远程拉取镜像,可以减少网络消耗。
  • env:定义 Pod 的环境变量,和 Dockerfile 里的 ENV 指令有点类似,但它是运行时指定的,更加灵活可配置。
  • command:定义容器启动时要执行的命令,相当于 Dockerfile 里的 ENTRYPOINT 指令。
  • args:它是 command 运行时的参数,相当于 Dockerfile 里的 CMD 指令,这两个命令和 Docker 的含义不同,要特别注意。

举个栗子:
Pod 指定使用镜像 busybox:latest,拉取策略是 IfNotPresent ,然后定义了 os 和 debug 两个环境变量,启动命令是 /bin/echo,参数里输出刚才定义的环境变量。

把这份 YAML 文件和 Docker 命令对比一下,你就可以看出,YAML 在 spec.containers 字段里用“声明式”把容器的运行状态描述得非常清晰准确,要比 docker run 那长长的命令行要整洁的多,对人、对机器都非常友好。

spec:
  containers:
  - image: busybox:latest
    name: busy
    imagePullPolicy: IfNotPresent
    env:
      - name: os
        value: "ubuntu"
      - name: debug
        value: "on"
    command:
      - /bin/echo
    args:
      - "$(os), $(debug)"

3.1.1.1为什么要定义容器启动时要执行的命令?

官方链接:为容器设置启动时要执行的命令和参数
为什么要定义容器启动时要执行的命令?不设置会怎么样?

4. 如何使用kubectl 操作Pod?

有了描述 Pod 的 YAML 文件,现在我就介绍一下用来操作 Pod 的 kubectl 命令。
它们可以使用 -f 参数指定 YAML 文件创建或者删除 Pod,例如:

4.1 创建pod

kubectl apply -f busy-pod.yml

4.2 删除pod

kubectl delete -f busy-pod.yml

因为我们在 YAML 里定义了“name”字段,所以也可以在删除的时候直接指定名字来删除:


kubectl delete pod busy-pod

4.3 输出pod 日志

和 Docker 不一样,Kubernetes 的 Pod 不会在前台运行,只能在后台(相当于默认使用了参数 -d),所以输出信息不能直接看到。我们可以用命令 kubectl logs,它会把 Pod 的标准输出流信息展示给我们看,在这里就会显示出预设的两个环境变量的值:

kubectl logs busy-pod

在这里插入图片描述

4.4 获取pod 列表和运行状态

kubectl get pod

在这里插入图片描述

4.5 调试排错pod

kubectl describe pod busy-pod
kubectl logs busy-pod

通常需要关注的是末尾的“Events”部分,它显示的是 Pod 运行过程中的一些关键节点事件。对于这个 busy-pod,因为它只执行了一条 echo 命令就退出了,而 Kubernetes 默认会重启 Pod,所以就会进入一个反复停止 - 启动的循环错误状态

因为 Kubernetes 里运行的应用大部分都是不会主动退出的服务,所以我们可以把这个 busy-pod 删掉,用上次课里创建的 ngx-pod.yml,启动一个 Nginx 服务,这才是大多数 Pod 的工作方式。

kubectl apply -f ngx-pod.yml启动之后,我们再用 kubectl get pod 来查看状态,就会发现它已经是“Running”状态了:

在这里插入图片描述

4.6 kubectl 拷贝命令

kubectl 也提供与 docker 类似的 cp 和 exec 命令,kubectl cp 可以把本地文件拷贝进 Pod,kubectl exec 是进入 Pod 内部执行 Shell 命令,用法也差不多。

比如我有一个“a.txt”文件,那么就可以使用 kubectl cp 拷贝进 Pod 的“/tmp”目录里:

echo 'aaa' > a.txt
kubectl cp a.txt ngx-pod:/tmp

4.7 kubectl 进入pod

不过 kubectl exec 的命令格式与 Docker 有一点小差异,需要在 Pod 后面加上 --,把 kubectl 的命令与 Shell 命令分隔开,你在用的时候需要小心一些:

kubectl exec -it ngx-pod -- sh

5. Pod小结

  1. 现实中经常会有多个进程密切协作才能完成任务的应用,而仅使用容器很难描述这种关系,所以就出现了 Pod,它“打包”一个或多个容器,保证里面的进程能够被整体调度。
  2. Pod 是 Kubernetes 管理应用的最小单位,其他的所有概念都是从 Pod 衍生出来的。
  3. Pod 也应该使用 YAML“声明式”描述,关键字段是“spec.containers”,列出名字、镜像、端口等要素,定义内部的容器运行状态。
  4. 操作 Pod 的命令很多与 Docker 类似,如 kubectl run、kubectl cp、kubectl exec 等,但有的命令有些小差异,使用的时候需要注意。

虽然 Pod 是 Kubernetes 的核心概念,非常重要,但事实上在 Kubernetes 里通常并不会直接创建 Pod,因为它只是对容器做了简单的包装,比较脆弱,离复杂的业务需求还有些距离,需要 Job、CronJob、Deployment 等其他对象增添更多的功能才能投入生产使用。

6. 思考

6.1 如果没有 Pod,直接使用容器来管理应用会有什么样的麻烦?

可以把pod 看作是介于容器之上的一层抽象,之所以需要这一层抽象是因为容器与容器之间有着不确定的关系。
有的容器需要彼此隔离,而有的容器却需要彼此交互。当容器规模增大,容器之间的作用关系就会变得及其复杂,难于管理。
pod 的出现就是为了解决容器管理的问题。让大规模应用下的容器编排变得更加清晰有序,易于维护。

6.2 你觉得 Pod 和容器之间有什么区别和联系?

不管是容器还是pod,都是虚拟概念。把普通进程或应用加上权限限制就成了容器,再把容器加上权限限制就成了pod。
说白了,就是不断地抽象封装,这也是软件中解决复杂问题的唯一手段。
容器之于Pod,就好比线程之于进程、函数之于类、文件之于文件夹等等

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

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

相关文章

数据结构与算法之查找算法

数据结构与算法——查找算法 本文将不断更新查找有关算法&#xff0c;由于精力有限&#xff0c;因此本博文将分多次更新&#xff0c;感谢您的关注 文章目录数据结构与算法——查找算法1. 二分法查找&#xff08;折半查找&#xff09;1.1 算法叙述1.2 实例说明2. 插值查找&#…

【ML特征工程】第 8 章 :自动化特征化器:图像特征提取和深度学习

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

[2022-11-26]神经网络与深度学习第5章 - 循环神经网络(part 2)

contents循环神经网络(part 2) - 梯度爆炸实验写在开头解决方式概览梯度爆炸实验梯度打印函数思考&#xff1a;什么是范数、L2范数、为什么要打印梯度范数复现梯度爆炸现象使用梯度截断解决梯度爆炸问题思考&#xff1a;梯度截断解决梯度爆炸问题的原理&#xff1f;写在最后循环…

搭建MinIO容器

文章目录1 问题背景2 资源准备3 安装Docker服务4 关闭防火墙5 以Docker方式安装MinIO6 访问MinIO1 问题背景 玩一个前后端的项目&#xff0c;需要用到对象存储器&#xff0c;于是使用开源的MinIO。期间以Docker方式搭建遇到某些坑&#xff0c;此处仅以博客的方式记录下来 2 资源…

【通信原理课设--基于MATLAB/Simulink的2ASK数字带通传输系统建模与仿真】Simulink的使用介绍以及在本实验中的使用

目录 Simulink的简要介绍 Simulink的使用流程 进入Simulink 进入模型编辑窗口 ​ 建立一个新的文件 根据求需建立模型 对选择的模块进行参数设置 本次课程设计需要使用Simulink做ASK的仿真处理&#xff0c;那么下面就一起学习了解一下Simulink吧&#xff01; Simuli…

全球经济自由度1995-2021最新版绿色金融指数2001-2020

&#xff08;1&#xff09;全球经济自由度指数 1995-2021 1、数据来源&#xff1a;美国传统基金会 2、时间跨度&#xff1a;1995-2021 3、区域范围&#xff1a;全球 4、指标说明&#xff1a; 经济自由度指数&#xff0c;是由《华尔街日报》和美国传统基金会发布的年度报告…

爱站网关键词挖掘工具-长尾关键词挖掘站长工具

长尾词挖掘免费工具&#xff0c;为什么我们要使用长尾词挖掘免费工具&#xff0c;我们只要找准关键词就等于掌握了流量。 关键词可应用于任何平台&#xff1a;不管是网站、短视频、自媒体等&#xff01; 比如说用户A经常看体育领域的内容&#xff0c;平台就会给A打上体育领域标…

LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)

文章目录一、编程题&#xff1a;142. 环形链表 II&#xff08;双指针-快慢指针&#xff09;1.题目描述2.示例1&#xff1a;3.示例2&#xff1a;4.示例3&#xff1a;5.提示&#xff1a;6.进阶&#xff1a;二、解题思路1.思路2.复杂度分析&#xff1a;3.算法图解三、代码实现总结…

[附源码]计算机毕业设计springboot班级事务管理论文2022

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MQTT协议

1.MQTT基础知识学习 MQTT协议基础知识视频学习资源:太极创客 太极创客的MQTT基础篇博文目录链接:零基础入门学用物联网 – MQTT基础篇 – 目录 备注:建议先学习一下MQTT的基础知识后再学习下面章节部分的内容。 2.MQTT服务器的搭建 MQTT服务器的搭建步骤如下: 使用docker pull…

【vue + echarts】图表自适应缩放(跟随浏览器的窗口缩放,项目侧边栏折叠后的窗口缩放),图表重绘

效果图: 先清楚两个东西,浏览器窗口的缩放和项目侧边栏折叠后窗口的缩放,这两个是不一样的 第一种,浏览器窗口缩放后,当前窗口会放大了或者缩小了,这时会走浏览器缩放的代码部分, 第二种,而项目侧边栏折叠后窗口的缩放,虽然项目里面的窗口缩放了,但是,浏览器的窗口并没有发生…

tACS恢复老年人认知控制能力的EEG功能和DTI结构网络机制

认知控制能力是大多数日常任务中的关键能力&#xff0c;与年龄相关的认知控制能力下降威胁到个人的独立性。作者之前在老年人和年轻人中都发现&#xff0c;经颅交流电刺激&#xff08;tACS&#xff09;可以改善认知控制&#xff0c;在远离受刺激部位和频率之外的神经区域观察到…

使用python玩转二维码!速学速用!⛵

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; Python3◉技能提升系列&#xff1a;https://www.showmeai.tech/tutorials/56 &#x1f4d8; 本文地址&#xff1a;https://showmeai.tech/article-detail/398 &#x1f4e2; 声明&#xff1a;版权所有&#xff0c;…

前端开发如何做新手引导

通常&#xff0c;在产品发布新版本或者有新功能上线时&#xff0c;都会开发一个新手引导功能来引导用户了解应用的功能。在前端开发中&#xff0c;如何快速地开发新手引导功能呢&#xff0c;下面介绍几个开箱即用的新手引导组件库。 1&#xff0c;Intro.js Intro.js是一个使用…

外汇天眼:外汇杠杆的“诱惑”到底有多大,为何做外汇的人都那么上瘾?

近些年随着外汇保证金在中国的持续发展&#xff0c;中国的外汇保证金交易就像当初的股票市场一样&#xff0c;从无到有&#xff0c;不断的发展壮大&#xff0c;再加上国内金融市场对外开放步伐加快&#xff0c;在中国国内参与外汇市场的投资者也是连年上升&#xff0c;那么这个…

【EI会议2023】12.20之后ddl

csdn 摘出来上文中的一些ddl ICET 2023(成都 5月12日-5月15日) http://www.icet.net/track9.html 截稿时间2022.12.20 通知录用:2023.1.20 SEGRE 2023(长沙 4月21日-4月23日) http://www.icsegre.org/ 截稿时间2023.2.26 通知录用:2023.4.3 ICIBA 2023(重庆 5月26日-…

全同态加密:GSW

参考文献&#xff1a; Micciancio D, Peikert C. Trapdoors for lattices: Simpler, tighter, faster, smaller[C]//Annual International Conference on the Theory and Applications of Cryptographic Techniques. Springer, Berlin, Heidelberg, 2012: 700-718.Gentry C, S…

Mysql-解决Truncated incorrect DOUBLE value xxx

问题 出现这种问题一般来说就是多表操作的时候, 使用的字段类型不一致导致的(查询除外),我们来看下真实案例 在hd_user表中parentId是binint类型 而在hd_user_increment_copy1表中parentId是varchar类型, 如果只是查询的话那么是不会报错的,我把查询sql提出了运行是可以的 …

[附源码]计算机毕业设计springboot保护濒危动物公益网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Java 编程性能调优

把 Java 性能调优分成 5 个层级&#xff1a;Java 编程、多线程、JVM 性能检测、设计模式、数据库性能&#xff0c;每个层级下都覆盖了最常见的优化问题。下面分别给你梳理一下&#xff1a; 可参考地址&#xff1a;Java性能调优全攻略来了_着火点的博客-CSDN博客_java性能调优 …