一、什么是Kubernetes?
Kubernetes(常简称为K8s)是用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。该系统由Google设计并捐赠给Cloud Native Computing Foundation(今属Linux基金会)来使用。它旨在提供“跨主机集群的自动部署、扩展以及运行应用程序容器的平台”。它支持一系列容器工具,包括Docker等。
二、Pod创建过程
Kubernetes 中的 Pod 是最小的调度单元,通常用于运行一个或多个容器。Pod 的创建和销毁是 Kubernetes 集群中重要的操作,涉及到多个组件的交互和状态变更。下面是对 Pod 创建 和 Pod 销毁 过程的详细描述。
-
用户提交请求(通过
kubectl或API)- 用户通过 kubectl 或者直接通过 Kubernetes API 提交创建 Pod 的请求。这通常是通过 kubectl run、kubectl apply 等命令,或者通过编写一个 YAML 文件描述 Pod 的配置并将其提交到集群。
- 请求包含 Pod 的配置,通常包括容器的镜像、资源限制、环境变量、卷、端口等信息。
-
APIServer处理请求
- Kubernetes 的 API Server 是整个集群的接口,处理所有的 HTTP 请求。收到 Pod 创建请求后,API Server 会对请求进行验证和授权(基于 RBAC 和其他策略):
- 验证:检查请求是否符合 Kubernetes 的 API 规范(例如,Pod 配置的语法、字段是否正确等);
- 授权:确保发起请求的用户有足够的权限来创建 Pod。
- 如果请求通过验证和授权,API Server 会将 Pod 配置保存到 Etcd 中。Etcd 是一个强一致性的数据库,用于存储 Kubernetes 集群的所有状态信息。
- Kubernetes 的 API Server 是整个集群的接口,处理所有的 HTTP 请求。收到 Pod 创建请求后,API Server 会对请求进行验证和授权(基于 RBAC 和其他策略):
-
调度器选择节点(Scheduler)
- Kubernetes Scheduler 会监控 Etcd 中的 Pod 状态,并选择适合的节点来运行该 Pod。调度器会根据以下因素做出决策:
- 资源请求:Pod 请求的 CPU 和内存资源。
- 节点资源:节点的当前负载和可用资源。
- 亲和性/反亲和性:Pod 对节点的亲和性或反亲和性规则(例如:某些 Pod 必须一起运行,或者不能与其他 Pod 一起运行)。
- 污点和容忍:节点是否有污点,并且 Pod 是否容忍这些污点。
- 调度器选择的节点会更新 Pod 的配置,指定该 Pod 将运行在选定的节点上。
- Kubernetes Scheduler 会监控 Etcd 中的 Pod 状态,并选择适合的节点来运行该 Pod。调度器会根据以下因素做出决策:
-
Kubelet启动容器- Kubelet 是每个节点上的代理,它负责确保容器在节点上运行。当调度器确定 Pod 将运行在某个节点上时,Kubelet 会接收到该节点上 Pod 的信息。
- Kubelet 会根据 Pod 配置启动容器,确保容器按预期启动。它会:
- 下载所需的容器镜像(如果镜像不存在于节点上)。
- 根据 Pod 配置启动容器。
- 如果使用了卷,Kubelet 会挂载相应的存储资源到容器中。
- Kubelet 启动容器后,容器运行的状态会定期报告给 API Server,确保 Pod 的状态是健康的。
-
服务发现和网络配置
- Kube Proxy 会为 Pod 配置网络规则,确保服务能够找到这个 Pod。如果 Pod 是通过 Service 暴露的,Kube Proxy 会更新 Service 的后端列表,包含新创建的 Pod。
- Kubernetes 的 DNS 服务会为 Pod 分配一个 DNS 名称,使其可以通过 DNS 解析访问。
-
Pod 状态更新
- 在 Pod 被成功调度并启动后,Kubernetes API Server 会将 Pod 的状态更新为 Running,并将状态信息保存在 Etcd 中。Pod 的 IP 地址和其他元数据也会在这个阶段更新。
三、Pod 销毁过程
-
用户或控制器发起删除请求
- Pod 的销毁通常由用户通过
kubectl delete pod <pod_name>命令,或者由控制器(如 Deployment、StatefulSet 等)发起。 - 当控制器的期望状态与实际状态不一致时,控制器会发起删除 Pod 的请求。比如,Deployment 中的 Pod 副本数发生变化时,控制器会删除不需要的 Pod。
- Pod 的销毁通常由用户通过
-
APIServer处理删除请求
- API Server 接收到删除请求后,首先会验证请求的合法性。
- API Server 会将删除请求的状态保存到 Etcd 中,更新 Pod 的状态为 Terminating。
-
Kubelet停止容器
- Kubelet 发现 Pod 被标记为 Terminating 后,会启动容器的终止过程。Kubelet 会:
- 发送终止信号(如 SIGTERM)给 Pod 中的容器。
- 等待一定的时间(Grace Period),允许容器优雅地关闭。
- 如果容器没有在规定时间内退出,Kubelet 会发送强制终止信号(如 SIGKILL)。
- Kubelet 发现 Pod 被标记为 Terminating 后,会启动容器的终止过程。Kubelet 会:
-
清理容器资源
- Kubelet 会清理容器和与 Pod 相关的资源,例如:
- 删除容器的运行时资源。
- 如果 Pod 使用了卷,Kubelet 会释放和卸载卷资源。
- 删除容器网络设置。
- Kubelet 会清理容器和与 Pod 相关的资源,例如:
-
Kubernetes 集群状态更新
- Kubernetes API Server 会更新 Pod 的状态为 Deleted,并从 Etcd 中删除 Pod 的相关数据。
- 如果 Pod 是由控制器(如 Deployment)管理的,控制器会根据新的状态启动新的 Pod,以维持期望的副本数。
-
清理网络资源
- Kube Proxy 会更新服务的后端列表,移除已删除 Pod 的 IP 地址,确保流量不再路由到该 Pod。
四、总结
- Pod 创建过程:从用户提交请求到 API Server,再到调度器选择节点,Kubelet 启动容器,最后更新状态并暴露服务。
- Pod 销毁过程:从用户或控制器发起删除请求,到 API Server 标记 Pod 为 Terminating,Kubelet 优雅地终止容器,最终清理资源并更新状态。
整个过程依赖 Kubernetes 的多个组件(如 API Server、Scheduler、Kubelet、Kube Proxy 等)协同工作,确保 Pod 的创建和销毁是自动化、高效且一致的。