Kubernetes 中容器创建的全流程详解
1. 调度器选择节点
- 资源评估:Kubernetes 调度器评估所有候选节点的资源状态,包括 CPU、内存、存储空间等,确保节点有足够的资源支持 Pod 的运行。
- 调度策略:根据预设的调度策略(如节点亲和性、污点和容忍度、反亲和性等),选择一个最合适的节点。
- 存储考虑:确保所选节点能够支持 Pod 的存储需求,如是否有足够的存储空间或支持特定存储类。
2. Kubelet 接收请求
- 节点 Kubelet:选定节点上的 Kubelet 接收创建 Pod 的请求。
- 预检和准备:Kubelet 执行一系列预检,确保节点状态正常,资源可用,并为创建 Pod 做准备,包括获取 Pod 的详细配置和镜像信息。
3. CRI 请求处理
- CRI 接口调用:Kubelet 通过容器运行时接口(CRI)向容器运行时(如 containerd、Docker 等)发起创建 Pod 的请求。
- CRI 适配层:CRI 适配层(CRI shim)将标准化的 CRI 请求转换为具体容器运行时能够识别的指令,确保不同容器运行时之间的兼容性。
4. CSI 插件介入
- 插件发现:Kubelet 发现已注册的 CSI 插件,确定可用的存储卷类型和操作。
- 存储卷创建:根据 Pod 的存储需求,CSI 插件动态创建存储卷。如果 Pod 使用了 PersistentVolumeClaims(PVC),CSI 插件会根据存储类(StorageClass)创建相应的 PersistentVolumes(PV)。
- 卷绑定:CSI 插件将创建的存储卷绑定到目标节点,确保 Pod 可以访问该卷。
- 卷挂载:CSI 插件将存储卷挂载到 Pod 的文件系统中,确保存储资源可供 Pod 内的容器使用。
- 生命周期管理:CSI 插件管理存储卷的生命周期,包括创建、绑定、挂载、解绑和删除,确保存储资源的高效利用和安全回收。
5. Pod Sandbox 创建与网络命名空间处理
- 网络命名空间创建:容器运行时创建网络命名空间,确保 Pod 的网络隔离。每个 Pod 拥有独立的网络命名空间,包括自己的网络接口、路由表和防火墙规则。
- Pod Sandbox 创建:容器运行时根据指令创建 Pod Sandbox,为 Pod 内的所有容器提供一个共享的运行环境。在 Linux 环境下,这表现为一个命名空间;在 Hypervisor 环境下,则可能是一个虚拟机。Sandbox 的作用是隔离 Pod 的网络和文件系统,保证 Pod 内容器之间的独立运行。
6. CNI 插件执行网络配置
- 调用 CNI 插件:如果 Kubelet 配置了 CNI 插件,在 Pod Sandbox 的网络命名空间创建完成后,Kubelet 会调用对应的 CNI 插件进行网络配置。
- 网络设备配置:CNI 插件创建虚拟网卡(如 veth 对),并将这些虚拟网卡加入到相应的网络空间中。这包括设置网络设备的参数,如 MTU(最大传输单元)、MAC 地址等。
- IP 地址分配:CNI 插件调用 IP 地址管理(IPAM)插件为 Pod 分配 IP 地址。IPAM 插件根据预设的规则(如静态分配、DHCP 分配等)为 Pod 分配合适的 IP 地址,确保 Pod 能够与其他服务和节点进行通信。
- 网络连接:CNI 插件配置 Pod 的网络连接,包括设置默认网关、路由规则和防火墙策略,确保 Pod 能够访问集群内部和外部的网络资源。
7. Container Runtime 管理
- 生命周期管理:容器运行时负责 Pod Sandbox 的整个生命周期管理,包括创建、启动和停止。容器运行时确保 Pod Sandbox 在节点故障或维护时能够正确停止和恢复。
- 资源隔离与管理:容器运行时提供资源隔离和进程管理功能,限制 Pod 对系统资源(如 CPU、内存、磁盘 I/O 等)的使用,确保各个 Pod 之间不会相互干扰。例如,使用 Linux cgroup 进行资源限制和隔离。
- 日志和监控:容器运行时记录 Pod 的运行日志,提供实时监控数据,帮助用户了解 Pod 的运行状态和性能。
8. 启动 Pod 内其他容器
- 启动业务容器:在完成网络和存储配置后,容器运行时启动 Pod 内的业务容器。这些容器共享 Pause 容器创建的网络命名空间,实现 Pod 内容器间的通信。
- 存储卷挂载:确保所有业务容器能够访问 CSI 插件挂载的存储卷,确保存储资源在 Pod 内容器之间共享和隔离。
- 容器健康检查:容器运行时执行健康检查,确保所有容器正常启动并运行。健康检查包括存活探针(Liveness Probe)和就绪探针(Readiness Probe),帮助 Kubernetes 确定容器是否健康并准备好接受流量。
9. 结果反馈和状态更新
- 处理结果返回:容器运行时将整个处理结果(包括 Pod Sandbox 创建状态、网络配置结果、存储卷挂载状态、容器启动状态等)返回给 Kubelet。
- 状态更新:Kubelet 将 Pod 的创建状态更新到 Kubernetes API Server,确保集群状态的一致性。API Server 将状态变化通知其他组件,如调度器和控制器管理器,以便进行相应的资源管理和负载均衡调整。
- 错误处理和重试:如果在创建过程中出现错误(如存储卷挂载失败、网络配置异常等),Kubelet 会记录错误信息,并根据配置的重试策略进行重试或标记 Pod 为失败状态,触发故障恢复机制。
10. 故障恢复和自愈
- 错误检测:Kubernetes 监控组件(如 kubelet、kube-controller-manager)持续监控 Pod 的状态,检测是否出现故障。
- 自动重启和重调度:如果 Pod 运行失败或节点出现故障,Kubernetes 会自动重启 Pod 或将其重调度到其他健康的节点,确保服务的高可用性。
- 日志和监控分析:通过集成的日志和监控系统(如 ELK Stack、Prometheus、Grafana),用户可以分析 Pod 创建和运行过程中的日志和指标,快速定位和解决问题。