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集群才有机会摆脱机械和被动,变成一个自动、智能、有大用的系统。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
JSON 算法 Go
Golang语言使用 jwt-go 库生成和解析 token
Golang语言使用 jwt-go 库生成和解析 token
983 0
|
边缘计算 Kubernetes 自动驾驶
重磅新书 丨 一文带你读懂《CDN技术架构》
CDN技术架构,阿里云CDN技术团队出品,文末有电子链接~
3085 0
重磅新书 丨 一文带你读懂《CDN技术架构》
|
6月前
|
设计模式 存储 人工智能
LLM全新智能体架构:核心组件、工作流程与设计模式全解析
随着生成式AI迈向生产力工具,智能体(Agent)架构成为关键。本文系统拆解其四大核心组件:大脑(LLM)、规划、记忆与工具,详解“感知-思考-行动”闭环流程及主流设计模式,助力开发者构建工业级AI应用。(238字)
1004 1
|
Kubernetes Cloud Native 容器
开放下载!《深入浅出Kubernetes》
一次搞懂6个核心原理吃透基础理论,一次学会6个典型问题的华丽操作
开放下载!《深入浅出Kubernetes》
|
机器学习/深度学习 人工智能 算法
如何像 Manus 交付业务需求-- OneAgent + MCPs 范式
本文探讨了从单一LLM调用到复杂Agent系统的发展历程,重点介绍了OneAgent + MCPs范式。该范式通过结合强大的基础Agent和领域特定的MCP(Microservice Capability Provider)来解决复杂业务需求。文章分析了其在保险科技领域的实践,展示了如何通过Loop框架执行任务,并讨论了当前面临的挑战如to-do质量依赖、状态管理和知识整合深度等问题。同时,提出了包括标准化交互生态、提升系统鲁棒性、优化MCP调用管理及应用强化学习等发展方向。最终展望了这一范式在更多行业落地的潜力,强调了快速搭建领域Agent的重要性,而非追求全知全能的GodAgent模式。
如何像 Manus 交付业务需求-- OneAgent + MCPs 范式
|
JSON Go 网络架构
langchain 入门指南 - 自动选择不同的大模型
langchain 入门指南 - 自动选择不同的大模型
1103 0
|
Kubernetes API Docker
kubernetes Operator 【2】实战CRD编程
kubernetes Operator 【2】实战CRD编程
kubernetes Operator 【2】实战CRD编程
|
人工智能 JavaScript Go
介绍 Agency: 使AI与Go语言无缝对接
介绍 Agency: 使AI与Go语言无缝对接
|
机器学习/深度学习 运维 算法
python时间序列异常检测ADTK
`adtk`是Python中用于无监督时间序列异常检测的工具包,包含简单算法、特征加工和流程控制。安装使用`pip install adtk`。数据要求为`DatetimeIndex`格式。异常检测包括滑动窗口统计特征、季节性拆解、降维和重构。提供了ThresholdAD、QuantileAD、InterQuartileRangeAD、GeneralizedESDTestAD等离群点检测算法,以及PersistAD和LevelShiftAD检测突变。此外,SeasonalAD用于季节性异常检测,Pipeline可组合多种算法。5月更文挑战第16天
954 5
python时间序列异常检测ADTK
|
网络协议 Docker 容器
docker 运行指定内存
-m,--memory 内存限制,格式是数字加单位,单位可以为 b,k,m,g。最小为 4M --memory-swap 内存+交换分区大小总限制。
8000 0

热门文章

最新文章