写点什么

深入浅出 Kubernetes 理论篇 (一):理解控制器

  • 2020-03-30
  • 本文字数:2369 字

    阅读完需:约 8 分钟

深入浅出Kubernetes 理论篇 (一):理解控制器

简介:当我们尝试去理解 Kubernetes 集群工作原理的时候,控制器肯定是一个难点。这是因为控制器有很多,具体实现大相径庭;且控制器的实现用到了一些较为晦涩的机制,不易理解。但是,我们又不能绕过控制器,因为它是集群的“大脑”。


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

大图

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



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

控制器原理

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

简易的冰箱

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


统一入口

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


控制器

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


控制器管理器

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


SharedInformer

上边的控制器和控制器管理器,看起来已经相当不错了。但是当冰箱功能增加,势必有很多新的控制器加进来。这些控制器都需要通过冰箱入口,时刻监控自己关心的组件的状态变化。比如照明系统控制器就需要时刻监控冰箱门的状态。当大量控制器不断的和入口通信的时候,就会增加入口的压力。


这个时候,我们把监控冰箱组件状态变化这件事情,交给一个新的模块 SharedInformer 来实现。SharedInformer 作为控制器的代理,替控制器监控冰箱组件的状态变化,并根据控制器的喜好,把不同组件状态的变化,通知给对应的控制器。通过优化,这样的 SharedInformer 可以极大的缓解冰箱入口的压力。


ListWatcher


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


举例

以上我们从一个简易冰箱的进化过程中,了解了控制器产生的意义,扮演的角色,以及实现的方式。现在我们回到 Kubernetes 集群。Kubernetes 集群实现了大量的控制器,而且在可以预见的未来,新的功能的控制器会不断出现,而一些旧的控制器也会被逐渐淘汰。


目前来说,我们比较常用的控制器,如 pod 控制器、deployment 控制器、service 控制器、replicaset 控制器等。这些控制器一部分是由 kube controller manager 这个管理器实现和管理,而像 route 控制器和 service 控制器,则由 cloud controller manager 实现。


之所以会出现 cloud controller manager,是因为在不同的云环境中,一部分控制器的实现,会因为云厂商、云环境的不同,出现很大的差别。这类控制器被划分出来,由云厂商各自基于 cloud controller manager 分别实现。


这里我们以阿里云 Kubernetes 集群 cloud controller manager 实现的 route 控制器和 service 控制器为例,简单说明 Kubernetes 控制器的工作原理。

服务控制器

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


路由控制器

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


结束语

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


作者简介


罗建龙(花名声东),阿里云技术专家。多年操作系统和图形显卡驱动调试和开发经验。目前专注云原生领域,容器集群和服务网格。


2020-03-30 17:052891

评论

发布
暂无评论
发现更多内容

事业-最佳实践-编码-继承组合选择

南山

最佳实践 组合模式 设计原则 组合 继承

在 ASP.NET Core 引入 Autofac 增强容器

雄鹿 @

ASP.NET Core

C++ 用户输入与数据类型详解:建立基本计算器及变量类型

小万哥

程序人生 编程语言 软件工程 C/C++ 后端开发

火山引擎边缘云出席2024亚太内容分发大会,助推游戏体验全面升级

火山引擎边缘云

CDN 游戏 CDN加速 CDN带宽

《出海和跨境:明道云HAP支撑全球化业务的能力白皮书》正式发布

明道云

分享10个学习计划模板,让你的个人发展更上一层楼!

彭宏豪95

效率工具 在线白板 模板 办公软件 学习计划

有一个可以写到简历的项目,嘎嘎强!

冰河

分布式 微服务 高并发 聊天 IM即时通讯

ARM版Win10系统下载-Windows系统下载

Rose

win10 Windows系统 win 10镜像

Python中的datetime模块:轻松拿捏时间操作

霍格沃兹测试开发学社

数字化先行者,HAP大使招募中

明道云

编写的Snort规则不报警怎么办?

百度搜索:蓝易云

云计算 Linux 运维 云服务器 Snort

php所有函数总结

百度搜索:蓝易云

php 云计算 Linux 运维 云服务器

StarRocks 助力小红书离线数仓提效,提升百倍回刷性能!

StarRocks

数据库 大数据 数仓 湖仓一体

使用 Amazon Bedrock + Claude 3 打造个性化智能编程助手

亚马逊云科技 (Amazon Web Services)

人工智能

[自研开源] 数据集成之分批传输 v0.7

LIEN

开源 数据集成 业务融合 API对接 mydata

优秀电源工程师需要的必备技能

梦笔生花

工程师 电源 优秀

Acrobat Pro DC 2023中文直装版 PDF编辑软件

Rose

Acrobat Pro DC 2023下载 PDF编辑和管理

就是这么简单,Selenium StaleElementReferenceException 异常分析与解决

霍格沃兹测试开发学社

Django数据库类库MySQLdb使用详解

百度搜索:蓝易云

django Linux 运维 云服务器 mysqldb

Xliff Editor for Mac 编辑和管理XLIFF文件

Rose

Mac软件 Xliff Editor XLIFF文件

jprofiler安装使用教程 附jprofiler永久激活码 Mac/win

Rose

Java性能 JProfiler激活码 JProfiler 14下载

单体分层应用架构剖析

疯狂架构

架构 分层架构 单体应用架构

AlDente Pro电池寿命延长工具功能介绍 及 AlDente Pro使用教程

Rose

Mac软件 AlDente Pro破解版 AlDente Pro电池寿命延长

一口气搞懂分库分表 12 种分片算法,大厂都在用

程序员小富

Java 分库分表 spring-boot

Visual Studio 2022 内置 Git 异常

雄鹿 @

Visual Studio 2022

哪里有Mac SVN管理工具 cornerstone 4破解版?

Rose

SVN管理工具 cornerstone 4 破解版 cornerstone 4许可

深入理解HTTP请求的五个要点

百度搜索:蓝易云

云计算 Linux 运维 HTTP 云服务器

ASP.NET Core 依赖注入(Ioc)

雄鹿 @

ASP.NET Core

在 ASP.NET Core 引入 Scrutor 增强依赖注入

雄鹿 @

ASP.NET Core

STL算法大全

百度搜索:蓝易云

Linux 运维 云服务器 stl C+

YYDS,只用几条命令轻松搭建自己的项目管理平台jira

霍格沃兹测试开发学社

深入浅出Kubernetes 理论篇 (一):理解控制器_文化 & 方法_罗建龙(声东)_InfoQ精选文章