pod创建过程
在 Kubernetes 中,Pod 是最小的部署单位,是容器的封装,可以包含一个或多个容器。Pod 的创建过程涉及多个步骤。
1. 用户发起 Pod 创建请求
用户可以通过 kubectl
命令行工具、Kubernetes API 或者 YAML 配置文件来创建 Pod。最常见的方式是通过定义一个 YAML 文件来描述 Pod 的配置。
例子:Pod 配置文件 (pod.yaml
)
1 | apiVersion: v1 |
用户运行 kubectl apply -f pod.yaml
或者 kubectl create -f pod.yaml
后,Kubernetes 会启动 Pod 创建过程。
2. API Server 接收创建请求
Kubernetes API Server 是所有管理请求的入口点。当用户提交 kubectl
命令时,API Server 接收到创建 Pod 的请求,并对请求进行验证和授权。
- 验证:检查 Pod 配置文件是否符合 Kubernetes API 规范。
- 授权:确认当前用户是否有权限创建该 Pod。
如果验证和授权通过,API Server 会将 Pod 的请求写入 Kubernetes 的 etcd 数据存储。
3. 调度器 (Scheduler) 选择节点
Pod 的创建请求存储在 etcd 中,接下来,Kubernetes 调度器(Scheduler)负责将 Pod 调度到合适的节点(Node)。
- 资源评估:调度器根据集群中的节点的资源情况(如 CPU、内存、磁盘等)以及 Pod 的需求来选择一个最合适的节点。
- Node Affinity、Taints & Tolerations:调度器会根据用户在 Pod 中设置的
affinity
和tolerations
策略来决定 Pod 应该调度到哪个节点。 - 调度决定:一旦调度器选择了目标节点,Pod 就会被标记为该节点上的一个任务。
4. Kubelet 在节点上创建容器
Kubelet 是运行在每个节点上的代理,负责确保 Pod 中的容器在该节点上正常运行。
- 获取 Pod 信息:Kubelet 会定期向 API Server 查询该节点上应该运行的 Pod,并检查是否有新的 Pod 需要启动。
- 拉取镜像:如果容器镜像在该节点上不存在,Kubelet 会拉取镜像。通常,Kubelet 会使用 Docker 或 containerd 等容器运行时来拉取镜像。
- 创建容器:Kubelet 使用容器运行时(如 Docker、containerd)来创建容器实例。每个容器会根据 Pod 的配置启动,并执行
spec.containers.command
中定义的命令。
5. 容器启动和 Pod 生命周期管理
容器启动后,Kubelet 会持续监控容器的状态,确保容器在 Pod 生命周期内始终处于健康状态。
- 容器状态检查:Kubelet 通过定期与容器运行时交互,检查容器是否正常运行。如果容器退出或崩溃,Kubelet 会尝试重新启动容器。
- 健康检查:Kubelet 会定期执行 liveness 和 readiness 探针,确保容器健康。如果容器无法通过探针检查,Kubelet 会根据配置重启容器或进行其他操作。
6. Pod 状态更新
Pod 和容器的状态会在 Kubernetes 集群中不断更新,并通过 API Server 保持同步。Pod 的状态包含以下几种:
- Pending:Pod 已被调度,但还未开始运行(例如,镜像正在拉取、资源还未准备好等)。
- Running:Pod 中的容器正在运行。
- Succeeded:Pod 中的所有容器都已成功完成并退出。
- Failed:Pod 中的容器退出且未成功。
- Unknown:Pod 状态无法确定,通常由于与 Node 通信失败导致。
这些状态信息会通过 Kubernetes API 更新到 API Server,并被存储在 etcd 中。
7. 访问与服务发现
一旦 Pod 启动并且运行正常,集群中的其他服务可以通过 DNS 或者 IP 地址或 服务名,来访问该 Pod。
- DNS 服务:Kubernetes 提供了内建的 DNS 服务,Pod 可以通过
pod-name.namespace.svc.cluster.local
的方式进行访问。 - Service:通常,Pod 会通过 Kubernetes Service 进行暴露,这样可以提供负载均衡和服务发现的功能。Service 会自动与一组 Pod 关联,并将请求转发到这些 Pod 上。
8. Pod 的终止和删除
当 Pod 的生命周期结束,或用户手动删除 Pod 时,Kubernetes 会执行清理操作:
- Pod Termination:Kubernetes 会向 Pod 中的所有容器发送终止信号,容器会开始进行优雅关闭。
- 资源释放:Kubernetes 会释放 Pod 占用的资源,如 CPU、内存等。
- 删除 Pod 记录:Pod 的状态会从 API Server 中删除,etcd 中的相关数据也会被清理。
总结:Pod 创建过程简述
- 用户提交创建请求:通过 YAML 文件或命令行工具(如
kubectl
)提交 Pod 创建请求。 - API Server 处理请求:API Server 进行验证、授权,并将请求存储到 etcd。
- 调度器选择节点:调度器根据资源需求和约束条件选择合适的节点。
- Kubelet 创建容器:Kubelet 在节点上拉取镜像并创建容器,启动 Pod。
- Pod 状态更新:Pod 和容器的状态通过 API Server 更新。
- 访问与服务发现:Pod 启动后可以通过 DNS 或 Kubernetes Service 进行访问。
- Pod 终止和删除:Pod 生命周期结束时,Kubernetes 会进行清理和删除操作。