我花了10个小时,写出了这篇K8S架构解析( 三 )

  • 同样的 etcd 会将创建 Pod 的信息通过事件发送给 APIServer 。
  • 由于 Scheduler 在监听(Watch)APIServer,并且它在系统中起到了“承上启下”的作用,“承上”是指它负责接收创建的 Pod 事件,为其安排 Node;“启下”是指安置工作完成后,Node 上的 kubelet 服务进程接管后继工作,负责 Pod 生命周期中的“下半生” 。
  • 换句话说,Scheduler 的作用是将待调度的 Pod 按照调度算法和策略绑定到集群中 Node 上,并将绑定信息写入 etcd 中 。
    • Scheduler 调度完毕以后会更新 Pod 的信息,此时的信息更加丰富了 。除了知道 Pod 的副本数量,副本内容 。还知道部署到哪个 Node 上面了 。
    • 同样,将上面的 Pod 信息更新到 etcd 中,保存起来 。
    • etcd 将更新成功的事件发送给 APIServer 。
    • 注意这里的 kubelet 是在 Node 上面运行的进程,它也通过 List-Watch 的方式监听(Watch)APIServer 发送的 Pod 更新的事件 。实际上,在第 9 步的时候创建 Pod 的工作就已经完成了 。
    为什么 kubelete 还要一直监听呢?原因很简单,假设这个时候 kubectl 发命令,需要把原来的 MySQL 的 1 个 RC 副本扩充成 2 个 。那么这个流程又会触发一遍 。
    作为 Node 的管理者 kubelet 也会根据最新的 Pod 的部署情况调整 Node 端的资源 。
    又或者 MySQL 应用的 RC 个数没有发生变化,但是其中的镜像文件升级了,kubelet 也会自动获取最新的镜像文件并且加载 。
    通过上面 List-Watch 的介绍大家发现了,除了之前引入的 kubectl 和 APIServer 以外又引入了 Controller Manager,Scheduler 和 kubelet 。
    这里给大家介绍一下他们的作用和原理:
    我花了10个小时,写出了这篇K8S架构解析

    文章插图
     
    聚焦 Scheduler,Controller Manager,kubelet
    Controller Manager
    Kubernetes 需要管理集群中的不同资源,所以针对不同的资源要建立不同的 Controller 。
    每个 Controller 通过监听机制获取 APIServer 中的事件(消息),它们通过 API Server 提供的(List-Watch)接口监控集群中的资源,并且调整资源的状态 。
    可以把它想象成一个尽职的管理者,随时管理和调整资源 。比如 MySQL 所在的 Node 意外宕机了,Controller Manager 中的 Node Controller 会及时发现故障,并执行修复流程 。
    在部署了成百上千微服务的系统中,这个功能极大地协助了运维人员 。从此可以看出,Controller Manager 是 Kubernetes 资源的管理者,是运维自动化的核心 。
    它分为 8 个 Controller,上面我们介绍了 Replication Controller,这里我们把其他几个都列出来,就不展开描述了 。
    我花了10个小时,写出了这篇K8S架构解析

    文章插图
     
    Controller Manager 中不同的 Controller 负责对不同资源的监控和管理
    Scheduler 与 kubelet
    Scheduler 的作用是,将待调度的 Pod 按照算法和策略绑定到 Node 上,同时将信息保存在 etcd 中 。
    如果把 Scheduler 比作调度室,那么这三件事就是它需要关注的,待调度的 Pod、可用的 Node,调度算法和策略 。
    简单地说,就是通过调度算法/策略把 Pod 放到合适的 Node 中去 。此时 Node 上的 kubelet 通过 APIServer 监听到 Scheduler 产生的 Pod 绑定事件,然后通过 Pod 的描述装载镜像文件,并且启动容器 。
    也就是说 Scheduler 负责思考,Pod 放在哪个 Node,然后将决策告诉 kubelet,kubelet 完成 Pod 在 Node 的加载工作 。
    说白了,Scheduler 是 boss,kubelet 是干活的工人,他们都通过 APIServer 进行信息交换 。
    我花了10个小时,写出了这篇K8S架构解析

    文章插图
     
    Scheduler 与 kubelet 协同工作图
    Service 和 kubelet
    经历上面一系列的过程,终于将 Pod 和容器部署到 Node 上了 。
    我花了10个小时,写出了这篇K8S架构解析

    文章插图
     
    MySQL 部署成功
    作为部署在 Kubernetes 中,Pod 如何访问其他的 Pod 呢?答案是通过 Kubernetes 的 Service 机制 。
    在 Kubernetes 中的 Service 定义了一个服务的访问入口地址(IP+Port) 。Pod 中的应用通过这个地址访问一个或者一组 Pod 副本 。
    Service 与后端 Pod 副本集群之间是通过 Label Selector 来实现连接的 。Service 所访问的这一组 Pod 都会有同样的 Label,通过这样的方法知道这些 Pod 属于同一个组 。
    我花了10个小时,写出了这篇K8S架构解析

    文章插图
     
    Pod 通过 Service 访问其他 Pod
    写 MySQL 服务的配置文件(mysql-svc.yaml)如下:


    推荐阅读