0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎么实现一个容器编排系统呢?

jf_TEuU2tls 来源:阿里云云原生 2024-01-08 09:46 次阅读

1 故事开始

随着消费者购买力的不断提升,用户拥有越来越多的电子快消品。小李预计在未来五年内,二手电子快消品市场将会迅速扩张。小李觉得这是一个创业的好机会,于是找到了我和几个志同道合的小伙伴开始了创业,决定做一个叫“XX”的平台。

2 故事发展

旗鱼一开始是一个 all in one 的 Java 应用,部署在一台物理机上,随着业务的发展,发现机器已经快扛不住了,就赶紧对服务器的规格做了升级,从 64C256G 一路升到了 160C1920G,虽然成本高了点,但是系统至少没出问题。

业务发展了一年后,160C1920G 也扛不住了,不得不进行服务化拆分、分布式改造了。为了解决分布式改造过程中的各种问题,引入了一系列的中间件,类似 hsf、tddl、tair、diamond、metaq 这些,在艰难的业务架构改造后,我们成功的把 all in one 的 Java 应用拆分成了多个小应用,重走了一遍阿里当年中间件发展和去 IOE 的道路。

分布式改完了后,我们管理的服务器又多起来了,不同批次的服务器,硬件规格、操作系统版本等等都不尽相同,于是应用运行和运维的各种问题就出来了。

还好有虚拟机技术,把底层各种硬件和软件的差异,通过虚拟化技术都给屏蔽掉啦,虽然硬件不同,但是对于应用来说,看到的都是一样的啦,但是虚拟化又产生了很大的性能开销。

嗯,不如使用类似 docker 的技术,比如 podman,因为容器技术在屏蔽底层差异的同时,也没有明显的性能影响,真是一个好东西。而且基于容器镜像的业务交付,使得 CI/CD 的运作也非常的容易啦~

随着容器数量的增长,又不得不面对新的难题,就是大量的容器如何调度与通信?毕竟随着业务发展,公司规模日益增长,线上运行着几千个容器,并且按照现在的业务发展趋势,马上就要破万了。

不行,我们一定要做一个系统,这个系统能够自动的管理服务器(比如是不是健康啊,剩下多少内存和 CPU 可以使用啊等等)、然后根据容器声明所需的 CPU 和 memory 选择最优的服务器进行容器的创建,并且还要能够控制容器和容器之间的通信(比如说某个部门的内部服务,当然不希望其他部门的容器也能够访问)。

我们给这个系统取一个名字,就叫做容器编排系统吧。

3 容器编排系统

那么问题来了,面对一堆的服务器,我们要怎么实现一个容器编排系统呢?

先假设已经实现了这个编排系统,那么服务器就会有一部分会用来运行这个编排系统,剩下的服务器用来运行业务容器,我们将运行编排系统的服务器叫做 master 节点,把运行业务容器的服务器叫做 worker 节点。

既然 master 节点负责管理服务器集群,那它就必须要提供出相关的管理接口,一个是方便运维管理员对集群进行相关的操作,另一个就是负责和 worker 节点进行交互,比如进行资源的分配、网络的管理等。

我们把 master 上提供管理接口的组件称为 kube apiserver,对应的还需要两个用于和 api server 交互的客户端,一个是提供给集群的运维管理员使用的,我们称为 kubectl;一个是提供给 worker 节点使用的,我们称为 kubelet。

那 master 又是怎么知道各个 worker 上的资源消耗和容器的运行情况的呢?这个简单,我们可以通过 worker 上的 kubelet 周期性的主动上报节点资源和容器运行的情况,然后 master 将这个数据存储下来,后面就可以用来做调度和容器的管理使用了。

至于数据怎么存储,我们可以写文件、写 db 等等,不过有一个开源的存储系统叫 etcd,满足数据一致性和高可用的要求,同时安装简单、性能又好,我们就选 etcd 吧。

现在我们已经有了所有 worker 节点和容器运行的数据,我们可以做的事情就非常多了。比如前面所说的,我们使用用户中心 2.0 版本的镜像创建了 1000 个容器,其中有5个容器都是运行在 A worker 节点上,如果 A 这个节点突然出现了硬件故障,导致节点不可用了,这个时候 master 就要将 A 从可用 worker 节点中摘除掉,并且还需要把原先运行在这个节点上的 5 个用户中心 2.0 的容器重新调度到其他可用的 worker 节点上,使得用户中心 2.0 的容器数量能够重新恢复到 1000 个,并且还需要对相关的容器进行网络通信配置的调整,使得容器间的通信还是正常的。

我们把这一系列的组件称为控制器,比如节点控制器、副本控制器、端点控制器等等,并且为这些控制器提供一个统一的运行组件,称为控制器管理器(kube-controller-manager)。

那 master 又该如何实现和管理容器间的网络通信呢?首先每个容器肯定需要有一个唯一的 ip 地址,通过这个 ip 地址就可以互相通信了,但是彼此通信的容器有可能运行在不同的 worker 节点上,这就涉及到 worker 节点间的网络通信,因此每个 worker 节点还需要有一个唯一的 ip 地址,但是容器间通信都是通过容器 ip 进行的,容器并不感知 worker 节点的 ip 地址,因此在 worker 节点上需要有容器 ip 的路由转发信息,我们可以通过 iptables、ipvs 等技术来实现。

那如果容器 ip 变化了,或者容器数量变化了,这个时候相关的 iptables、ipvs 的配置就需要跟着进行调整,所以在 worker 节点上我们需要一个专门负责监听并调整路由转发配置的组件,我们把这个组件称为 kube proxy(此处为了便于理解,就不展开引入 Service 的内容了)。

我们已经解决了容器间的网络通信,但是在我们编码的时候,我们希望的是通过域名或者 vip 等方式来调用一个服务,而不是通过一个可能随时会变化的容器 ip。因此我们需要在容器 ip 之上在封装出一个 Service 的概念,这个 Service 可以是一个集群的 vip,也可以是一个集群的域名,为此我们还需要一个集群内部的 DNS 域名解析服务。

另外虽然我们已经有了 kubectl,可以很愉快的和 master 进行交互了,但是如果有一个 web 的管理界面,这肯定是一个更好的事情。此处之外,我们可能还希望看到容器的资源信息、整个集群相关组件的运行日志等等。

像 DNS、web 管理界面、容器资源信息、集群日志,这些可以改善我们使用体验的组件,我们统称为插件。

至此,我们已经成功构建了一个容器编排系统,我们来简单总结下上面提到的各个组成部分:

Master 组件:kube-apiserver、kube-scheduler、etcd、kube-controller-manager

Node 组件:kubelet、kube-proxy

插件:DNS、用户界面 Web UI、容器资源监控、集群日志

审核编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    16064

    浏览量

    176916
  • DNS
    DNS
    +关注

    关注

    0

    文章

    215

    浏览量

    19761
  • 网络通信
    +关注

    关注

    4

    文章

    777

    浏览量

    29737
  • 容器
    +关注

    关注

    0

    文章

    492

    浏览量

    22025

原文标题:【老司机略过】这是我见过的最容易理解的K8S知识了~

文章出处:【微信号:浩道linux,微信公众号:浩道linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    数据编排支持人工智能(AI)的下步发展

    深度学习的快速发展给大规模实现该技术所需的硬件架构带来了巨大压力。尽管由于意识到性能是绝对要求,因此业界高度关注峰值TOPS分数,但智能数据编排和管理策略提供了
    发表于 09-24 16:14 4029次阅读
    数据<b class='flag-5'>编排</b>支持人工智能(AI)的下<b class='flag-5'>一</b>步发展

    100容器周边项目,点亮你的容器集群技能树

    摘要: 大规模的容器技术运用从来不是项独立工程,而是汇集虚拟化技术、容器编排、任务调度、操
    发表于 05-22 18:39

    K8S容器编排的互通测试

    K8S容器编排之NetWorkPolicy官方实例
    发表于 06-06 11:28

    kubernetes系统基本概念

    文带你看透kubernetes 容器编排系统
    发表于 11-05 08:26

    LCD汉字编排软件

    LCD汉字编排软件LCD汉字编排软件LCD汉字编排软件LCD汉字编排软件
    发表于 12-28 14:31 7次下载

    基于DOCKER容器的ELK日志收集系统分析

    针对Docker容器集群中日志的收集和集中处理的问题。本文采用Docker Swarm和Etcd实现容器的管理、服务发现以及调度,并为分布式系统提供支撑。使用主流的开源日志收集
    发表于 11-06 14:15 3次下载
    基于DOCKER<b class='flag-5'>容器</b>的ELK日志收集<b class='flag-5'>系统</b>分析

    平台式惯导系统的力学编排详细资料说明

    平台式惯导系统的力学编排是指实现正确控制惯性平台和解算导航参数的方案和方程,包括平台指令角速度的计算公式、速度和位置的解算方程。
    发表于 03-30 08:00 0次下载
    平台式惯导<b class='flag-5'>系统</b>的力学<b class='flag-5'>编排</b>详细资料说明

    异构容器云应用迁移系统研究综述

    和 Docker Swarm的应用编排调度策略,给出两者之间编排信息转换的可行方法,并提出基于镜像预同步的应用迁移技术。实验结果表明,A- Migrator异构容器云应用迁移系统
    发表于 06-09 14:15 8次下载

    如何实现秒杀系统

    实现秒杀系统,采用spring boot 2.x + mybatis+ redis + swagger2 + lombok实现
    的头像 发表于 09-15 09:56 2108次阅读

    什么是流程/规则编排

    以上两种基本代表了传统的编排思想,在简单的例子下,看起来也是非常直观,但,当变动发生时,尤其是需要灵活调整的场景,他们的表现又如何
    的头像 发表于 09-21 10:04 1902次阅读

    为什么薄膜电容器可以自愈

    薄膜电容器通用的优点,那就是可以自愈,别的电子元器件内部如果损坏,可能就无法正常使用,但薄膜电容器却可以自动修复内部的瑕疵点,它具体是怎么实现
    的头像 发表于 06-08 17:13 785次阅读

    Jenkins pipeline是如何连接Kubernetes的

    Kubernetes 是开源的容器编排平台,可以帮助开发团队管理和部署容器化的应用程序。
    的头像 发表于 10-23 11:13 1761次阅读
    Jenkins pipeline是如何连接Kubernetes的<b class='flag-5'>呢</b>?

    并联电容器可以改变线路潮流吗?

    在电力系统中,如何调节电路潮流直是关键的问题,而并联电容器的应用可以很好地解决这个问题。那么,究竟什么是并联电
    的头像 发表于 11-13 14:42 676次阅读
    并联电<b class='flag-5'>容器</b>可以改变线路潮流吗?

    iSulad Sandbox API简化容器调用链

    沙箱隔离技术是种将进程隔离到独立环境中运行的技术,可以有效地隔离进程间的相互影响,提高系统的安全性。随着容器技术的兴起,沙箱隔离技术也在云原生领域中得到了广泛的应用。例如容器
    的头像 发表于 11-20 17:08 581次阅读
    iSulad Sandbox API简化<b class='flag-5'>容器</b>调用链

    Docker容器实现开机自动启动策略

    如果你的容器依赖于其他服务(例如数据库或其他容器),你需要确保这些服务在你的容器启动之前就已经可用。这可以通过编排工具如Docker Compose来管理,或者通过编写自定义的启动脚本
    的头像 发表于 03-11 10:33 2642次阅读