Kubernetes 入门实战课
罗剑锋
Kong 高级工程师,Nginx/OpenResty 开源项目贡献者
19527 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 41 讲
Kubernetes 入门实战课
15
15
1.0x
00:00/00:00
登录|注册

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

你好,我是 Chrono。
前两天我们学习了 Kubernetes 世界里的工作语言 YAML,还编写了一个简短的 YAML 文件,描述了一个 API 对象:Pod,它在 spec 字段里包含了容器的定义。
那么为什么 Kubernetes 不直接使用已经非常成熟稳定的容器?为什么要再单独抽象出一个 Pod 对象?为什么几乎所有人都说 Pod 是 Kubernetes 里最核心最基本的概念呢?
今天我就来逐一解答这些问题,希望你学完今天的这次课,心里面能够有明确的答案。

为什么要有 Pod

Pod 这个词原意是“豌豆荚”,后来又延伸出“舱室”“太空舱”等含义,你可以看一下这张图片,形象地来说 Pod 就是包含了很多组件、成员的一种结构。
图片来自网络
容器技术我想你现在已经比较熟悉了,它让进程在一个“沙盒”环境里运行,具有良好的隔离性,对应用是一个非常好的封装。
不过,当容器技术进入到现实的生产环境中时,这种隔离性就带来了一些麻烦。因为很少有应用是完全独立运行的,经常需要几个进程互相协作才能完成任务,比如在“入门篇”里我们搭建 WordPress 网站的时候,就需要 Nginx、WordPress、MariaDB 三个容器一起工作。
WordPress 例子里的这三个应用之间的关系还是比较松散的,它们可以分别调度,运行在不同的机器上也能够以 IP 地址通信。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kubernetes中最核心的概念之一是Pod,它是对容器的抽象,允许多个容器共享资源并协同工作。Pod作为Kubernetes的核心对象,能够作为应用调度部署的最小单位,并且可以任意定制修改而不影响底层容器。本文介绍了为什么需要Pod以及如何使用YAML描述Pod的重要字段,强调了Pod的关键作用和其在Kubernetes中的核心地位。通过对Pod的理解,读者可以更好地掌握Kubernetes的基本概念和使用方法。 文章还介绍了使用kubectl命令操作Pod的方法,包括创建、删除、查看和调试Pod。通过示例和命令演示,读者可以学习如何使用YAML文件和kubectl命令来管理Pod,以及如何调试和监控Pod的运行状态。 此外,文章强调了Pod的重要性,指出Pod作为Kubernetes管理应用的最小单位,具有足够的控制管理能力,适合在云计算领域作为应用调度的基本单元。尽管Pod是Kubernetes的核心概念,但在实际应用中通常不会直接创建Pod,而是通过其他对象如Job、CronJob、Deployment等来增添更多功能以满足复杂的业务需求。 总之,本文通过深入讲解Pod的概念、使用方法和重要性,帮助读者全面了解Kubernetes中最核心的概念,为他们在实际应用中更好地使用和管理Pod提供了重要指导。 欢迎留言参与讨论,分享给朋友一起学习。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kubernetes 入门实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(32)

  • 最新
  • 精选
  • pyhhou
    思考题 1. 可以把 Pod 看作是介于容器之上的一层抽象,之所以需要这一层抽象是因为容器与容器之间有着不确定的关系,有的容器需要与彼此隔离,而有的容器却需要彼此交互。当容器规模增大,容器之间的作用关系就会变得极其复杂,难于管理。Pod 的出现就是为了解决容器管理的问题,让大规模应用下的容器编排变得更加清晰有序,易于维护 2. 不管是容器还是 Pod,都是虚拟概念。把普通进程或应用加上权限限制就成了容器,再把容器加上权限限制就成了 Pod。说白了,就是不断地抽象封装,这也是软件中解决复杂问题的唯一手段。容器之于Pod,就好比 线程之于进程、函数之于类、文件之于文件夹等等

    作者回复: awesome

    2022-07-21
    66
  • 三溪
    我这里补充下个人遇到的坑,希望对大家有所帮助! 当你使用kubectl apply -f指定YAML文件来创建pod时,只要你spec.containers.image里面的tag是latest,那么无论你的imagePullpolicy策略是什么,无论本地是否已存在该镜像文件,一定会先联网查询镜像信息,如果此时正好是私网无法连接互联网时,那么pod就会直接创建失败,你使用describe查询时报错也是无法拉取镜像。 只要tag不是latest,比如stable或者1.23什么的具体版本,本地已存在对应镜像文件,这时设置为IfNotPresent和Never才会生效,就可以在私网环境下愉快地离线创建pod。

    作者回复: awesome

    2022-07-27
    3
    27
  • 江湖十年
    imagePullPolicy 默认值并非 IfNotPresent,而是 Always: ➜ kubectl explain pod.spec.containers.imagePullPolicy KIND: Pod VERSION: v1 FIELD: imagePullPolicy <string> DESCRIPTION: Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images

    作者回复: Defaults to Alwaysif :latest tag is specified。 只有lastest才是always。

    2022-07-18
    2
    15
  • container 对象. env:定义 Pod 的环境变量 ------------- 这里 不应该是 container 的环境变量吗?

    作者回复: 抱歉,不小心手误了,确实,它属于container字段,是容器的环境变量。

    2022-07-18
    12
  • Frank
    老师 ,一般情况下,pod里只定义一个容器吗? 还是可以定义多个容器。 它们之间没有什么区别吗?

    作者回复: 一般是一个容器,但因为containers是一个数组,里面是可以有多个容器的。 Pod里的多个容器共享IP地址、存储卷、进程空间,pod就类似逻辑主机、虚拟机了,这些容器就可以像在主机里一样协同工作。

    2022-07-20
    4
    10
  • Apple_d39574
    您好,想问一下,为什么要定义容器启动时要执行的命令?不设置会怎么样?

    作者回复: 因为容器本质上就是一个应用程序,没有命令该如何启动应用呢?想清楚这一点应该就能够理解了吧。

    2022-11-28归属地:北京
    6
  • Guder
    感觉pod有点像是docker-compose

    作者回复: 是的,不过尽量不要把docker的经验套在Kubernetes上,容易混淆。

    2022-07-19
    6
  • 咩咩咩
    1.若直接使用容器来管理应用,只能一个个容器去调度。应用之间一般都有进程和进程组的关系,而容器又只是单进程模型,无法管理多个进程 2.Pod是一组共享了某些资源的容器,只是一个逻辑概念

    作者回复: great

    2022-07-18
    5
  • 摊牌
    个人观点,不知道对不对,我觉得pod就应该叫做k8s自己的容器,如果没有pod, k8s直接调度容器对象,比如docker, 那它就永远要依赖docker; 如果k8s不对容器包装一下,没有类似pod这种粒度的话,k8s就必须选择一种现有容器技术,限制了其现在和未来的灵活性。所以,于公于私,构建pod这个基本调度单元是非常明智的选择,将来如果有新的容器技术代替了docker,但是k8s的基本单元永远是pod

    作者回复: great,中间层的思想。

    2022-07-18
    4
  • bjdz
    向老师请教一个问题,被折磨坏了, docker images 显示本地是有 busybox:stable-glibc 这个版本的,yaml文件中的 imagePullPolicy: IfNotPresent,image: busybox:stable-glibc, 根据这个yaml文件创建pod,显示 pod/busybox created,但是 kubectl logs busybox,就显示镜像拉取失败 Error from server (BadRequest): container "busybox" in pod "busybox" is waiting to start: trying and failing to pull image 不明白为什么本地已经有镜像了,且不是最新的tag,为什么还要去拉取镜像? get pod报错:busybox 0/1 CrashLoopBackOff 7 (4m47s ago) 22m Events: Normal Scheduled 28m default-scheduler Successfully assigned default/busybox to minikube Warning Failed 24m kubelet Failed to pull image "busybox:stable-glibc": rpc error: code = Unknown desc = context canceled Warning Failed 24m (x2 over 24m) kubelet Error: ErrImagePull Warning Failed 24m kubelet Failed to pull image "busybox:stable-glibc": rpc error: code = Unknown desc = error pulling image configuration: Get "xxx": net/http: TLS handshake timeout Normal BackOff 24m (x2 over 24m) kubelet Back-off pulling image "busybox:stable-glibc" Warning Failed 24m (x2 over 24m) kubelet Error: ImagePullBackOff Normal Pulling 24m (x3 over 28m) kubelet Pulling image "busybox:stable-glibc" Normal Pulled 21m kubelet Successfully pulled image "busybox:stable-glibc" in 2m20.001262902s Normal Created 20m (x4 over 21m) kubelet Created container busybox Normal Started 20m (x4 over 21m) kubelet Started container busybox Normal Pulled 20m (x3 over 21m) kubelet Container image "busybox:stable-glibc" already present on machine Warning BackOff 2m55s (x86 over 21m) kubelet Back-off restarting failed container

    作者回复: 要看pod被调度到哪个节点上运行,本地有,不代表节点上一定有,注意Kubernetes是集群管理系统,不要把本地和集群弄混了。

    2022-10-28归属地:上海
    3
收起评论
显示
设置
留言
32
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部