作者 | 阿里云售后技术专家 声东

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

K8s 集群核心组件大图

下图是 K8s 集群的核心组件,包括数据库 etcd,调度器 Scheduler,集群入口 API Server,控制器 Controller,服务代理 kube-proxy 以及直接管理具体业务容器的 kubelet。

这些组件逻辑上可以被分为三个部分:

  • 核心组件 etc 数据库;
  • 对 etcd 进行直接操作的入口组件 API Server;
  • 其他组件, 这里的“其他组件”之所以可以被划分为一类,是因为它们都可以被看做是集群的控制器。

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

控制器原理

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

简易的冰箱

这个冰箱包括五个组件:箱体、制冷系统、照明系统、温控器以及门。

冰箱只有两个功能:

  • 当有人打开冰箱门的时候,冰箱内的灯会自动开启;
  • 当有人按下温控器的时候,制冷系统会根据温度设置,调节冰箱内温度。

统一入口

对于上边的冰箱,我们可以简单抽象成两个部分:统一的操作入口和冰箱的所有组件。

在这里,用户只有通过入口,才能操作冰箱。这个入口提供给用户两个接口:开关门和调节温控器。用户执行这两个接口的时候,入口会分别调整冰箱门和温控器的状态。

但是这里有一个问题,就是用户通过这两个接口,既不能让冰箱内部的灯打开,也不能调节冰箱的温度。

控制器

控制器就是为了解决上边的问题产生的。控制器就是用户的操作,和冰箱各个组件的正确状态之间的一座桥梁:

  • 当用户打开门的时候,控制器观察到了门的变化,它替用户打开冰箱内的灯;
  • 当用户按下温控器的时候,控制器观察到了用户设置的温度,它替用户管理制冷系统,调节冰箱内温度。

控制器管理器

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

SharedInformer

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

这个时候,我们把监控冰箱组件状态变化这件事情,交给一个新的模块 SharedInformer 来实现。

SharedInformer 作为控制器的代理,替控制器监控冰箱组件的状态变化,并根据控制器的喜好,把不同组件状态的变化,通知给对应的控制器。通过优化,这样的 SharedInformer 可以极大的缓解冰箱入口的压力。

ListWatcher

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

还不会用 K8s 集群控制器?那你会用冰箱吗?(多图详解)的更多相关文章

  1. Memcached集群/分布式/高可用 及 Magent缓存代理搭建过程 详解

    当网站访问量达到一定时,如何做Memcached集群,又如何高可用,是接下来要讨论的问题. 有这么一段文字来描述“Memcached集群” Memcached如何处理容错的? 不处理!:) 在memc ...

  2. Hadoop集群安装指南(CHD5.9.1)(分布式+图文详解)

    centos7.1,CDH5.9.1,3台机器,终极指导安装 下载链接如下: 安装文件下载链接如下: 链接:https://pan.baidu.com/s/1RQYNiWn9a-T8GXcCsoDBs ...

  3. Elasticsearch之marvel(集群管理、监控)插件安装之后的浏览详解

    前提 Elasticsearch之插件介绍及安装 https://i.cnblogs.com/posts?categoryid=950999&page=2  (强烈建议,从头开始看) 比如,我 ...

  4. 基于prometheus监控k8s集群

    本文建立在你已经会安装prometheus服务的基础之上,如果你还不会安装,请参考:prometheus多维度监控容器 如果你还没有安装库k8s集群,情参考: 从零开始搭建基于calico的kuben ...

  5. 企业运维实践-还不会部署高可用的kubernetes集群?使用kubeadm方式安装高可用k8s集群v1.23.7

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 文章目录: 0x00 前言简述 ...

  6. 1.还不会部署高可用的kubernetes集群?看我手把手教你使用二进制部署v1.23.6的K8S集群实践(上)

    公众号关注「WeiyiGeek」 设为「特别关注」,每天带你玩转网络安全运维.应用开发.物联网IOT学习! 本章目录: 0x00 前言简述 0x01 环境准备 主机规划 软件版本 网络规划 0x02 ...

  7. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之集群部署环境规划(一)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.环境规划 软件 版本 ...

  8. k8s集群启动了上万个容器(一个pod里放上百个容器,起百个pod就模拟出上万个容器)服务器超时,无法操作的解决办法

    问题说明: 一个POD里放了百个容器,然后让K8S集群部署上百个POD,得到可运行上万个容器的实验目的. 实验环境:3台DELL裸机服务器,16核+64G,硬盘容量忽略吧,上T了,肯定够. 1.一开始 ...

  9. K8s集群部署(二)------ Master节点部署

    Master节点要部署三个服务:API Server.Scheduler.Controller Manager. apiserver提供集群管理的REST API接口,包括认证授权.数据校验以 及集群 ...

随机推荐

  1. 【Java例题】7.1 线程题1-时间显示线程

    1.时间显示线程.设计一个示线程子类,每秒钟显示一次当前时间:然后编写主类,在主函数中定义一个线程对象,并启动这个线程 package chapter7; import java.text.Simpl ...

  2. 喜大普奔 | 微信小程序支持PC端打开了

    微信小程序可以在PC端打开啦 微信PC版发布了v2.7.0测试版,其中一个重磅的功能就是:支持打开聊天中分享的小程序 咖啡君这么喜欢尝鲜的人自然是在第一时间下载进行了体验 安装成功,会有功能更新说明 ...

  3. 两个 github 账号混用,一个帐号提交错误

    问题是这样,之前有一个github帐号,因为注册邮箱的原因,不打算继续使用了,换了一个新的邮箱注册了一个新的邮箱帐号.新账号提交 就会出现下图的问题,但是原来帐号的库还是能正常提交.   方法1:添加 ...

  4. azure k8s netcore 程序初次部署

    以下都是我在2018年12月份做的实验,今天才发布出来. 念想 首先是了解一些关于K8s的一些基础概念,推荐查看一下这个链接,非常适合入门k8s.是因为K8S的环境搭建比较复杂(最主要是懒),其实也有 ...

  5. 容易上手搭建vue2.0开发环境

    第一步:安装node 前端开发框架和环境都是需要 Node.js ,先安装node.js开发环境,vue的运行是要依赖于node的npm的管理工具来实现,下载https://nodejs.org/en ...

  6. jsp和servlet开发过程中参数传递乱码问题总结

    1.前言 相信很多初学者在学习javaWeb基础知识时,总会遇到各种各样的乱码问题,我也是从那个时候过来的.当时遇到各种乱码问题,只能通过面向百度的方式,解决各种乱码问题,乱码虽然问题能解决,但是总是 ...

  7. 记录一则clear重做日志文件的案例

    1.官方文档描述 2.故障报错信息 3.分析解决问题 1.官方文档描述 关于Clearing a Redo Log File的官方文档描述: A redo log file might become ...

  8. 安装Python及各种包/库——没有网络的电脑上

    我们做项目时可能会遇到,一些电脑只能联内网或者无法联网,这种情况怎样在电脑上安装Python及各种第三方包/库呢? 1.首先,在有网络的电脑上在python官网下载好python安装包,地址:http ...

  9. Delphi - Windows自动计划任务与ParamStr详解

    Windows自动计划任务与ParamStr详解 ParamStr函数: ParamStr(1),..ParamStr(N) ParamStr(1)代表程序入口的第一个参数,同理,ParamStr(N ...

  10. 一 安装docker(详解)

    一.安装docker 1 Docker 要求 CentOS 系统的内核版本高于 3.10 执行命令:uname -r 2 添加yum源: yum-config-manager --add-repo h ...