1、概述
Pod 是 k8s 系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最 小资源对象模型,也是在 k8s 上运行容器化应用的资源对象,其他的资源对象都是用来支 撑或者扩展 Pod 对象功能的,比如控制器对象是用来管控 Pod 对象的,Service 或者 Ingress 资源对象是用来暴露 Pod 引用对象的,PersistentVolume 资源对象是用来为 Pod 提供存储等等,k8s 不会直接处理容器,而是 Pod,Pod 是由一个或多个 container 组成。
Pod 是 Kubernetes 的最重要概念,每一个 Pod 都有一个特殊的被称为”根容器“的 Pause 容器。Pause 容器对应的镜 像属于 Kubernetes 平台的一部分,除了 Pause 容器,每个 Pod 还包含一个或多个紧密相关的用户业务容器。
2、特性
(1)资源共享
一个 Pod 里的多个容器可以共享存储和网络,可以看作一个逻辑的主机。共享的如 namespace,cgroups 或者其他的隔离资源。
多个容器共享同一 network namespace,由此在一个 Pod 里的多个容器共享 Pod 的 IP 和 端口 namespace,所以一个 Pod 内的多个容器之间可以通过 localhost 来进行通信,所需要 注意的是不同容器要注意不要有端口冲突即可。不同的 Pod 有不同的 IP,不同 Pod 内的多 个容器之前通信,不可以使用 IPC(如果没有特殊指定的话)通信,通常情况下使用 Pod 的 IP 进行通信。
一个 Pod 里的多个容器可以共享存储卷,这个存储卷会被定义为 Pod 的一部分,并且可 以挂载到该 Pod 里的所有容器的文件系统上。
(2)生命周期短暂
Pod 属于生命周期比较短暂的组件,比如,当 Pod 所在节点发生故障,那么该节点上的 Pod 会被调度到其他节点,但需要注意的是,被重新调度的 Pod 是一个全新的 Pod,跟之前的 Pod 没有半毛钱关系。
(3)平坦的网络
K8s 集群中的所有 Pod 都在同一个共享网络地址空间中,也就是说每个 Pod 都可以通过其 他 Pod 的 IP 地址来实现访问。
3、分类
(1)普通 Pod
普通 Pod 一旦被创建,就会被放入到 etcd 中存储,随后会被 Kubernetes Master 调度到某 个具体的 Node 上并进行绑定,随后该 Pod 对应的 Node 上的 kubelet 进程实例化成一组相 关的 Docker 容器并启动起来。在默认情 况下,当 Pod 里某个容器停止时,Kubernetes 会 自动检测到这个问题并且重新启动这个 Pod 里某所有容器, 如果 Pod 所在的 Node 宕机, 则会将这个 Node 上的所有 Pod 重新调度到其它节点上。
(2)静态 Pod
静态 Pod 是由 kubelet 进行管理的仅存在于特定 Node 上的 Pod,它们不能通过 API Server 进行管理,无法与 ReplicationController、Deployment 或 DaemonSet 进行关联,并且 kubelet 也无法对它们进行健康检查。
4、Pod存在的意义
一个Pod可以存入多个容器,咱们就拿docker来说,docker是建议一个容器只是只是运行一个应用程序,pod是以多进程设计的,可以将依赖度比较高的两个容器放入同一个pod(例如一个微服务项目调用了mysql数据库,微服务和mysql数据库这两个容器放入同一个pod),因为pod内网络共享,这样微服务连接mysql就像连接本地数据一样,减少网络IO等提高调用效率。
5、生命周期和重启策略
(1)Pod 的状态
状态 | 描述 |
Pending | Api-server已创建改pod,但是pod中一个或者多个容器的镜像还未创建,包括镜像下载过程 |
Running | pod内所有容器已创建,且至少一个容器处于运行状态、正在启动或者重启状态 |
Completed | pod内所有容器均成功执行退出,且不会重启 |
Failed | pod内所有容器均已退出,但至少一个容器退出失败 |
Unknown | 由于某种原因无法获取pod状态,例如网络不通畅 |
(2)Pod 重启策略
Pod 的重启策略包括 Always、OnFailure 和 Never,默认值是 Always
策略 | 描述 |
Always | 当容器失效时,由kubelet自动重启该容器 |
OnFailure | 当容器终止运行且运行代码不为0,,由kubelet自动重启该容器 |
Never | 不论容器运行状态如何,kubelet都不会重启该容器 |
(3)常见状态转换
Pod包含的容器数 | Pod当前状态 | 发生事件 | Pod结果状态 | ||
RestartPolicy=Always | OnFailure | Never | |||
1个容器 | Running | 容器成功退出 | Running | Succeeded | Succeeded |
1个容器 | Running | 容器失败退出 | Running | Running | Failure |
2个容器 | Running | 1个容器失败退出 | Running | Running | Running |
2个容器 | Running | 容器被OOM杀掉 | Running | Running | Failure |