pod创建过程

在 Kubernetes 中,Pod 是最小的部署单位,是容器的封装,可以包含一个或多个容器。Pod 的创建过程涉及多个步骤。


1. 用户发起 Pod 创建请求

用户可以通过 kubectl 命令行工具、Kubernetes API 或者 YAML 配置文件来创建 Pod。最常见的方式是通过定义一个 YAML 文件来描述 Pod 的配置。

例子:Pod 配置文件 (pod.yaml)

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx:latest
ports:
- containerPort: 80

用户运行 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 中设置的 affinitytolerations 策略来决定 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 会定期执行 livenessreadiness 探针,确保容器健康。如果容器无法通过探针检查,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 创建过程简述

  1. 用户提交创建请求:通过 YAML 文件或命令行工具(如 kubectl)提交 Pod 创建请求。
  2. API Server 处理请求:API Server 进行验证、授权,并将请求存储到 etcd。
  3. 调度器选择节点:调度器根据资源需求和约束条件选择合适的节点。
  4. Kubelet 创建容器:Kubelet 在节点上拉取镜像并创建容器,启动 Pod。
  5. Pod 状态更新:Pod 和容器的状态通过 API Server 更新。
  6. 访问与服务发现:Pod 启动后可以通过 DNS 或 Kubernetes Service 进行访问。
  7. Pod 终止和删除:Pod 生命周期结束时,Kubernetes 会进行清理和删除操作。