Kubernetes Pod 是 Kubernetes 中最小的可部署单元,是一个或多个相互协作的应用容器的集合,它们共享相同的网络命名空间和存储卷。每个 Pod 都有一个唯一的 IP 地址,用于和其他 Pod 进行通信。
Pod 的核心概念如下:
- Pod 是一个逻辑主机,它可以包含多个容器,其中pause容器作为其他容器的父容器,同一个Pod的容器 共享同一个网络、 PID、IPC、UTS 命名空间,这意味着容器可以通过 localhost 来相互访问,并且它们可以在同一个命名空间内共享文件系统。
- Pod 的网络方案通过 Kubernetes 中的 CNI 插件(如flannel,calico等)来实现,包括隔离、路由、IP 分配等。
- Pod 包含了对于应用程序非常关键的卷挂载支持。卷可以是本地磁盘卷,也可以是来自于存储后端的网络磁盘。Kubernetes 支持多种不同的存储卷类型,比如本地磁盘卷、网络存储(例如 NFS 和 iSCSI ),以及分布式存储卷(例如 GCE Persistent Disk 和 Amazon EBS 卷等)。
- Kubernetes 控制器(例如 Deployment、Replica Set)负责维护 Pod 的数量,保证运行的 Pod 数目与期望数量一致。控制器确保了 Pod 在节点上的运行状态,以及在节点故障或调度的情况下重新调度 Pod。
涉及和Pod相关的组件有:
- Kubelet:Kubelet是Kubernetes集群中每个工作节点上运行的进程。Kubelet负责启动、停止和监视Pod。
- Docker:Kubernetes使用Docker来运行容器。Docker是一个容器运行时,提供了一个标准的方式来创建、运行和管理容器。
- CRI:容器运行时接口(CRI)是一个抽象层,允许Kubernetes与不同的容器运行时(如Docker)交互。
- 网络:Kubernetes中的Pod被分配了它们自己的网络接口。这使得Pod能够互相通信并与外部世界交互。
- 存储:Kubernetes中的Pod可以连接到持久存储卷。这使得Pod可以存储数据,即使Pod被重启或删除,数据也能够持久化保存。
Pod的生命周期有:
- Pending:Pod已被创建,但尚未分配到节点上。
- Running:Pod已被分配到节点上,容器已经在运行中。
- Succeeded:Pod中所有容器都已成功地完成了其工作,已经退出。
- Failed:Pod中至少有一个容器已经退出,且已经达到了重试限制。
- Unknown:由于某种原因,Pod的状态无法确定。
Pod的初始化过程:
- 创建 Pod,当用户在 Kubernetes 中创建一个 Pod 时,API Server 会接收到请求,然后创建一个 Pod 的初始对象。
- 初始化容器,当 Kubernetes 创建了 Pod 对象后,每个容器都会在其所在的节点上被初始化。初始化容器是同步运行的,只有当所有的初始化容器都成功运行并退出后,才会启动普通的容器。初始化容器可以用来做一些在主容器启动之前必需的准备工作,例如为数据库准备必需的存储目录、下载数据源文件等。
- 运行容器启动健康状态监测,一旦所有的初始化容器都成功运行,Pod 就可以开始启动普通容器并检测容器是否启动正常。Pod 中的所有容器都可以同时运行,它们共享 Pod 的网络空间和文件系统,并可以使用 Kubernetes 中的资源管理器适当地 CPU 使用率和内存。
- 容器就绪探针,每个容器都有一个就绪探针,用于指示容器是否准备就绪。当容器就绪时,它会让其就绪探针变为 true。如果某个容器的就绪探针为 false,则 Kubernetes 认为该容器没有准备好,它将不会再次被调度或负载均衡器。因此,Pod 中所有容器的就绪探针都为 true 是非常重要的。
- Pod 初始化完成,当所有容器都就绪并准备好接收网络流量时,Pod 的初始化过程就完成了。Pod 将开始执行其核心业务逻辑,与本地或网络上的其他服务进行交互,并提供服务。Pod 将继续处理请求并处理容器的生命周期,直到 Pod 或容器终止或从 Kubernetes 中删除
- 定期进行存活监测和就绪监测,存活监测失败会导致容器重启,就绪状态监测失败会导致该pod从其属于的service对象中移除。
Pod的提交创建过程组件功能:
- 客户端:用户使用 Kubectl、API 网关或其他 Kubernetes 可用的客户端向 Kubernetes API Server发送 Pod 创建请求。
- API Server:API Server 是 Kubernetes 的中央组件,它接收来自用户的请求并处理它们。当一个 Pod 创建请求到达 API Server 时,它将检查用户的请求,创建一个 Pod 对象并将信息存储到etcd。
- 调度器:一旦 调度器监测到API Server 创建了 Pod 对象,会负责选择一个合适的节点,并把结果信息发送给API Server。
- kubelet:kubelet监测到由调度器绑定到本节点的Pod后,根据配置信息拉取 Pod 所需的镜像并调用运行时,并确保 Pod 按照用户的要求进行管理。
- 容器运行时:一旦 kubelet 确定可以在节点上启动 Pod,则容器运行时(例如 Docker)将被用于启动 Pod 中的容器。
- etcd:有关 Pod 配置、调度及状态的信息将存储在 etcd 中,以确保此状态仅为集群中的所有节点所共享。