Pod的启动过程

在 Kubernetes (K8s) 中,启动一个 Pod 的过程涉及多个组件和步骤。以下是启动 Pod 的详细步骤:

1. 用户提交 Pod 配置

用户通过 kubectl 命令行工具或 Kubernetes API 提交一个 Pod 的配置文件(通常是 YAML 格式)。这个配置文件定义了 Pod 的属性,如容器镜像、环境变量、端口、资源限制等。

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

2. API Server 接收请求

  • 用户的请求被发送到 Kubernetes API Server。
  • API Server 负责处理所有的 REST 请求,并将请求存储在 etcd 中。

3. API Server 更新 etcd

  • API Server 将 Pod 的定义存储在 etcd 中,etcd 是一个分布式键值存储,用于保存 Kubernetes 集群的所有状态数据。

4. Scheduler 选择节点

  • Scheduler 组件监控 etcd 中的 Pod 状态,并找到一个合适的节点来运行这个 Pod。
  • Scheduler 会考虑节点的资源可用性、亲和性、反亲和性、污点和容忍等因素。

5. Pod 绑定到节点

  • 一旦 Scheduler 选择了一个节点,它会更新 Pod 的状态,将 Pod 绑定到选定的节点。
  • 这个更新同样会被存储在 etcd 中。

6. Kubelet 监控 Pod 状态

  • 每个节点上都有一个 Kubelet 进程,它负责管理该节点上的 Pod。
  • Kubelet 定期向 API Server 查询需要在其节点上运行的 Pod。

7. Kubelet 创建容器

  • Kubelet 收到 Pod 的定义后,会使用容器运行时(如 Docker、containerd 等)来创建和启动容器。
  • Kubelet 会根据 Pod 的定义拉取所需的容器镜像(如果镜像未在本地)。

8. 容器启动

  • 容器运行时启动容器,并将其与 Pod 关联。
  • Kubelet 会监控容器的状态,并定期向 API Server 更新 Pod 的状态。

9. Pod 状态更新

  • 一旦容器成功启动,Kubelet 会更新 Pod 的状态为 Running
  • 如果容器启动失败,Kubelet 会尝试重启容器(根据 Pod 的重启策略)。

10. 服务发现和网络配置

  • Kubernetes 会为 Pod 分配一个 IP 地址,并配置网络,使得 Pod 可以与其他 Pod 和服务进行通信。
  • 如果 Pod 定义了服务(Service),Kubernetes 会创建相应的服务对象,以便其他 Pod 可以通过服务名称访问该 Pod。

11. 监控和管理

  • Kubernetes 集群中的控制平面组件(如 API Server、Controller Manager 等)会持续监控 Pod 的状态。
  • 如果 Pod 发生故障,Kubernetes 会根据定义的策略(如重启策略)采取相应的措施。

Pod的启动过程
https://hawli.cn/2024/03/15/Pod的启动过程/
作者
krli
发布于
2024年3月15日
许可协议