Kubernetes 完整工作流程描述
1. 用户请求的接收
- 用户访问:
- 用户通过CLI(如
kubectl
)或YAML文件(资源对象文件)定义期望的资源状态(如Pod),并发出请求。该请求通过集群的入口(通常是Master节点的IP)进入Kubernetes集群。
- 用户通过CLI(如
2. Master节点的处理
- 流量进入Master节点:
- 用户请求流量到达Master节点,Master节点包含多个关键组件:
- kube-apiserver:作为Kubernetes的控制平面和API入口,负责接收和处理用户请求。
- etcd:分布式键值存储,保存集群的所有状态数据。
- kube-scheduler:负责Pod的调度。
- kube-controller-manager:负责集群状态的管理和调整。
- kube-proxy:负责网络流量的管理。
- 用户请求流量到达Master节点,Master节点包含多个关键组件:
3. 处理请求并存储状态
- 请求处理:
kube-apiserver
接收到用户的请求后,会验证请求的合法性,并将用户定义的期望状态(如Pod的定义)存储到etcd
中。
4. Pod调度
- 调度过程:
kube-scheduler
监听kube-apiserver
的事件,检测到新的Pod请求后,从etcd
中获取所有节点的信息。- 调度过程包括:
- 预选:根据Pod的资源请求和节点的可用资源,筛选出符合条件的节点。
- 优选:对预选出的节点进行进一步的评估,选择最适合的节点。
- 绑定:将调度结果通过
kube-apiserver
通知被选中的节点的kubelet
。
5. Node节点的处理
- kubelet的角色:
- 每个Node节点上运行
kubelet
,它是Kubernetes的主要工作负载代理。kubelet
接收到来自kube-apiserver
的调度指令后,会通过CRI(Container Runtime Interface)与底层容器引擎(如Docker或containerd)进行通信。 - 在Kubernetes 1.24版本及之后,
kubelet
与Docker之间的连接需要通过cri-dockerd
进行。
- 每个Node节点上运行
6. 创建Pod
- Pod的创建过程:
kubelet
接收到调度指令后,通过CRI请求Docker创建Pod。Pod的创建过程如下:- 首先,
kubelet
会创建一个名为pause
的容器,这个容器作为Pod的网络命名空间的基础。 - 然后,基于用户定义的YAML文件,
kubelet
创建应用容器,并将其与pause
容器共享网络命名空间。此时,应用容器可以通过pause
容器访问网络。
- 首先,
7. 状态管理与反馈
- 状态信息的管理:
pause
容器的相关数据(如网络和存储信息)被kubelet
收集,并返回给kube-apiserver
。kube-apiserver
将这些状态信息存储到etcd
中。kube-controller-manager
监听kube-apiserver
的状态变化,确保集群中的实际状态与用户的期望状态保持一致。
8. 状态调整
- 实际状态与期望状态的对比:
kube-controller-manager
会对比实际状态与期望状态。如果发现实际状态与期望状态不一致,kube-controller-manager
将指挥kubelet
进行相应的调整。这可能包括重新启动Pod、迁移Pod到其他节点等操作,以确保Pod的状态符合预期。
9. 总结
- 在这个完整的流程中,用户的请求从入口流入Master节点,通过
kube-apiserver
进行处理,存储到etcd
,然后由kube-scheduler
进行调度,最终在Node节点上由kubelet
创建Pod。Pod的状态通过kube-controller-manager
进行监控和调整,确保实际状态与期望状态一致。