k8s 有两种节点,master 节点和 worker-node 节点。master 节点组件包括 apiserver,scheduler,controller-manager;node 节点组件包括 kubelet,kube-proxy,容器 engine;另外,除了这两个,还有一个 etcd 存储。
整个 k8s 的工作过程是一个 list-watch 机制。有 3 个 list watch 分别是 controller manager,scheduler,kubelet。
k8s 工作过程:
- 客户端的请求通过 Kubectl 发送请求给集群的唯一入口 API Server。API Server 先将相关的元信息写入到 etcd 存储中。
- etcd 写完信息后,会给予反馈给客户端,还会发送 created 事件给 apiserver,apiserver 把 created 事件发送给监听着 apiserver 的 Controller manager。
- Controller manager 会调用控制器来保证 pod 副本数量,维持集群处于预期状态。然后 Controller Manager 将创建 pod 的相关信息发送给 apiserver ,apiserver 将相关的信息写入到 etcd 中(pod 的模板,如什么镜像,多少实例,健康检查等)。
- etcd 将信息记录完毕,会将创建 pod 的信息发送给 apiserver。apiserver 再将创建 pod 的信息发送给 scheduler。Scheduler 通过 API Server 在 etcd 存储中读取 node 节点的资源信息(信息由 kubelet 发送到 master),通过预算策略和优选策略,从 node 节点中挑选最优的,并把 pod 调度到这个节点运行。
- Scheduler 将调度信息反馈给 apiserver,apiserver 再将信息发送给 etcd,写入到 etcd 中进行保存。
- etcd 记录完毕后,将更新 pod 的信息发送给 apiserver。apiserver 再将更新信息反应给相应 node 节点的 kubelet 上。
- kubelet 接受到更新 pod 的信息后,根据相关的要求,调用容器引擎,创建 pod ,启动容器。同时 kubelet 还会将容器和 pod 的运行状态反馈给 apiserver,由 apiserver 将这些信息写入到 etcd 中。
- etcd 写入信息完毕,会把相关的确认信息发送给 apiserver,由 apiserver 发送给相关的 kubelet。
- kube-proxy 创建网络规则,制定转发规则。创建 service 作为负载均衡的访问入口(有 cluster-ip、nodepode 类型等),把用户的请求通过负载均衡转发到关联的 pod 上,从而发布 pod 里的业务。
PS:
预算策略:将所有 node 节点的剩余资源和 pod 所需的资源对比,找出符合 pod 资源需求的 node 节点。
优选策略:预算策略筛选后的 node 节点被交给优选策略。通过 cpu 负载,内存剩余等因素,找出最合适的 node 节点。把 pod 调度到这个节点运行。