K8S从懵圈到熟练 – 这么理解集群控制器,能行!

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

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

大图

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

控制器原理

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

简易的冰箱

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

统一入口

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

控制器

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

控制器管理器

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

SharedInformer

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

ListWatcher

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

举例

以上我们从一个简易冰箱的进化过程中,了解了控制器产生的意义,扮演的角色,以及实现的方式。现在我们回到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资源。
8

路由控制器

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

结束语

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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
7月前
|
存储 前端开发 JavaScript
潮玩宇宙大逃杀无聊猿卷轴模式系统开发详细规则丨步骤需求丨方案项目丨技术架构丨源码功能
确定游戏类型和规则:明确无聊猿卷轴模式游戏类型和游戏规则,包括敌人类型、地图设计、任务类型、战斗机制等。
|
8天前
|
存储 Web App开发 运维
发布、部署,傻傻分不清楚?从概念到实际场景,再到工具应用,一篇文章让你彻底搞清楚
部署和发布是软件工程中经常互换使用的两个术语,甚至感觉是等价的。然而,它们是不同的! • 部署是将软件从一个受控环境转移到另一个受控环境,它的目的是将软件从开发状态转化为生产状态,使得软件可以为用户提供服务。 • 发布是将软件推向用户的过程,应用程序需要多次更新、安全补丁和代码更改,跨平台和环境部署需要对版本进行适当的管理,有一定的计划性和管控因素。
180 1
控制系统的动态结构图笔记(害怕自己忘了)
控制系统的动态结构图笔记(害怕自己忘了)
165 0
|
域名解析 前端开发 程序员
一键托管程序员的做菜神器,隔离食用手册--5
一键托管程序员的做菜神器,隔离食用手册--5
126 0
|
程序员
一键托管程序员的做菜神器,隔离食用手册--3
一键托管程序员的做菜神器,隔离食用手册--3
206 0
|
域名解析 前端开发 程序员
一键托管程序员的做菜神器,隔离食用手册--4
一键托管程序员的做菜神器,隔离食用手册--4
83 0
|
程序员
一键托管程序员的做菜神器,隔离食用手册---2
一键托管程序员的做菜神器,隔离食用手册---2
111 0
|
运维 前端开发 Cloud Native
一键托管程序员的做菜神器,隔离食用手册---1
一键托管程序员的做菜神器,隔离食用手册---1
110 0
|
缓存 开发框架 JavaScript
解放双手!一键生成前后端代码的开源项目,收好了!
解放双手!一键生成前后端代码的开源项目,收好了!
276 0
解放双手!一键生成前后端代码的开源项目,收好了!
|
弹性计算 Kubernetes 前端开发
K8s 从懵圈到熟练-集群伸缩原理
阿里云 K8s 集群的一个重要特性,是集群的节点可以动态的增加或减少。有了这个特性,集群才能在计算资源不足的情况下扩容新的节点,同时也可以在资源利用率降低的时候,释放节点以节省费用。这篇文章,我们将讨论阿里云 K8s 集群扩容与缩容的实现原理。理解实现原理,在遇到问题的时候,我们就可以高效地排查并定位原因。
K8s 从懵圈到熟练-集群伸缩原理

热门文章

最新文章