前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >kubernetes从懵圈到熟练 – 理解集群控制器

kubernetes从懵圈到熟练 – 理解集群控制器

作者头像
kubernetes中文社区
发布2019-06-24 16:20:08
6410
发布2019-06-24 16:20:08
举报

当我们尝试去理解K8S集群工作原理的时候,控制器肯定是一个难点。这是因为控制器有很多,具体实现大相径庭;且控制器的实现用到了一些较为晦涩的机制,不易理解。但是,我们又不能绕过控制器,因为它是集群的“大脑”。今天这篇文章,我们通过分析一个简易冰箱的设计过程,来深入理解集群控制器的产生,功能以及实现方法。

大图

下图是K8S集群的核心组件,包括数据库etcd,调度器scheduler,集群入口API Server,控制器Controller,服务代理kube-proxy以及直接管理具体业务容器的kubelet。这些组件逻辑上可以被分为三个部分:核心组件etc数据库,对etcd进行直接操作的入口组件API Server,以及其他组件。这里的“其他组件”之所以可以被划分为一类,是因为它们都可以被看做是集群的控制器。

今天我们要讲的就是集群控制器原理。

控制器原理

虽然控制器是K8S集群中比较复杂的组件,但控制器本身对我们来说并不陌生的。我们每天使用的洗衣机、冰箱、空调等,都是依靠控制器才能正常工作。在控制器原理这一节,我们通过思考一个简易冰箱的设计过程,来理解K8S集群控制器的原理。

简易的冰箱

这个冰箱包括五个组件:箱体、制冷系统、照明系统、温控器以及门。冰箱只有两个功能:当有人打开冰箱门的时候,冰箱内的灯会自动开启;当有人按下温控器的时候,制冷系统会根据温度设置,调节冰箱内温度

统一入口

对于上边的冰箱,我们可以简单抽象成两个部分:统一的操作入口和冰箱的所有组件。在这里,用户只有通过入口,才能操作冰箱。这个入口提供给用户两个接口:开关门和调节温控器。用户执行这两个接口的时候,入口会分别调整冰箱门和温控器的状态

控制器

控制器就是为了解决上边的问题产生的。控制器就是用户的操作,和冰箱各个组件的正确状态之间的一座桥梁:当用户打开门的时候,控制器观察到了门的变化,它替用户打开冰箱内的灯;当用户按下温控器的时候,控制器观察到了用户设置的温度,它替用户管理制冷系统,调节冰箱内温度

控制器管理器

冰箱有照明系统和制冷系统,显然相比一个控制器管理着两个组件,我们替每个组件分别实现一个控制器是更为合理的选择。同时我们实现一个控制器管理器来统一维护所有这些控制器,来保证这些控制器在正常工作

SharedInformer

上边的控制器和控制器管理器,看起来已经相当不错了。但是当冰箱功能增加,势必有很多新的控制器加进来。这些控制器都需要通过冰箱入口,时刻监控自己关心的组件的状态变化。比如照明系统控制器就需要时刻监控冰箱门的状态。当大量控制器不断的和入口通信的时候,就会增加入口的压力。 这个时候,我们把监控冰箱组件状态变化这件事情,交给一个新的模块SharedInformer来实现。SharedInformer作为控制器的代理,替控制器监控冰箱组件的状态变化,并根据控制器的喜好,把不同组件状态的变化,通知给对应的控制器。通过优化,这样的SharedInformer可以极大的缓解冰箱入口的压力

ListWatcher

假设SharedInformer和冰箱入口通过http协议通信的话,那么http分块编码(chunked transfer encoding)就是实现ListWatcher的一个好的选择。控制器通过ListWatcher给冰箱入口发送一个查询然后等待,当冰箱组件有变化的时候,入口通过分块的http响应通知控制器。控制器看到chunked响应,会认为响应数据还没有发送完成,所以会持续等待

举例

以上我们从一个简易冰箱的进化过程中,了解了控制器产生的意义,扮演的角色,以及实现的方式。现在我们回到K8S集群。K8S集群实现了大量的控制器,而且在可以预见的未来,新的功能的控制器会不断出现,而一些旧的控制器也会被逐渐淘汰。 目前来说,我们比较常用的控制器,如pod控制器、deployment控制器、service控制器、replicaset控制器等。这些控制器一部分是由kube controller manager这个管理器实现和管理,而像route控制器和service控制器,则由cloud controller manager实现。 之所以会出现cloud controller manager,是因为在不同的云环境中,一部分控制器的实现,会因为云厂商、云环境的不同,出现很大的差别。这类控制器被划分出来,由云厂商各自基于cloud controller manager分别实现。 这里我们以阿里云K8S集群cloud controller manager实现的route控制器和service控制器为例,简单说明K8S控制器的工作原理。

服务控制器

首先,用户请求API Server创建一个LoadBalancer类型的服务,API Server收到请求并把这个服务的详细信息写入etcd数据库。而这个变化,被服务控制器观察到了。服务控制器理解LoadBalancer类型的服务,除了包括存放在etcd内部的服务记录之外,还需要一个SLB作为服务入口,以及若干endpoints作为服务后端。所以服务控制器分别请求SLB的云openapi和API Server,来创建云上SLB资源,和集群内endpoints资源

路由控制器

在集群网络一章中,我们提到过,当一个节点加入一个K8S集群的时候,集群需要在VPC路由表里增加一条路由,来搭建这个新加入节点到pod网络的主干道。而这件事情,就是路由控制器来做的。路由控制器完成这件事情的流程,与上边服务控制器的处理流程非常类似,这里不再赘述

结束语

基本上来说,K8S集群的控制器,其实扮演着集群大脑的角色。有了控制器,K8S集群才有机会摆脱机械和被动,变成一个自动、智能、有大用的系统。

作者:shengdong

原文地址:https://yq.aliyun.com/articles/705343

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 kubernetes中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 大图
  • 控制器原理
    • 简易的冰箱
      • 统一入口
        • 控制器
          • 控制器管理器
            • SharedInformer
              • ListWatcher
              • 举例
                • 服务控制器
                  • 路由控制器
                  • 结束语
                  相关产品与服务
                  容器服务
                  腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档