容器编排器们的自我介绍

news2025/1/2 3:43:30

哈喽大家好,我是咸鱼

咸鱼在《一文带你了解容器技术的前世今生》有介绍过容器技术的由来以及Docker项目的发展

我们知道,Docker 及其他容器技术能够极大地简化应用程序的部署,做到了”开箱即用“

俗话说:”凡是具有两面性“。容器技术给我们带来便利的同时,一些问题也随之出现了

随着企业规模或者说业务规模的不断扩大,应用程序越来越多、而每个应用程序往往又由多个容器组成

例如想要实现一个简单的数据库 web 界面也可能需要为数据库服务器和应用程序运行单独的容器

于是容器的管理便成为了一个棘手的难题。工程师们为了解决这个问题,开发了一系列的容器编排器(container orchestrator),其中最有名的当属 kubernetes

容器编排器可以将一组容器作为一个基本单元去进行管理(例如 K8s 里的 pod),而且容器编排器可以在集群之间自动分配容器工作负载

那么今天,咸鱼将以自我介绍的形式来带大家了解三个容器编排器——Docker Compose、Swarm、Kubernetes

Docker Compose

大家好,我叫 Docker Compose 。我的爸爸是一个名叫 Docker 的公司

我的前身是一个叫 Fig 的项目,Fig 项目可是大有来头——因为它第一次提出了容器编排的概念

你只需要执行一条命令 fig up 就能够依次创建一系列容器,并且容器之间的关系及依赖性,都会自动帮你解决

当时它在 Github 上的热度可是比肩 Docker 的,后来我的爸爸秉承”打不过就加入“的理念,把 Fig 项目收购了

收购之后将名字改成了 Compose,于是我诞生了

我是根据一个 yaml 格式的配置文件来工作的,通常命名为 Docker-compose.yml

  • 首先我会去读取这个文件,然后通过 Docker API 创建这个文件声明的资源
  • 我还会为这些资源打上标签,方便我创建之后将它们分组管理

实际上我并不能够称得上是一个容器编排器,因为我实际上是通过 Docker 命令行接口(Docker command-line interface )去操作一组组容器的

举个例子,比如说在配置文件里有这三种类型的资源:

  • service:包含了要启动的容器的声明。里面的每一个条目都相当于一个 Docker run 命令
  • networks:包含了可以访问到容器的网络。里面的每个条目都相当于一个 Docker network create 命令
  • volumes:包含了可以访问到容器内部的容器卷(容器卷即能够挂载到容器内部的持久存储)。里面的每一个条目都相当于一个 Docker vloume create 命令

尽管如此,我依旧能够较好地管理容器之间的依赖关系,我还能够为容器创建一个共享网络和卷,使它们可以相互通信和共享数据

但是我不能够实现容器的高可用性,如果容器出现故障,需要手动进行恢复

Swarm

哈喽大家好,我叫 Swarm
在这里插入图片描述
Docker Compose 虽然为大家提供了一种方便的方式去管理容器,但他在一开始的时候只能在单台主机上工作

也就是说他创建的所有容器都在同一台机器上面运行,抛开性能不谈,如果所有应用都在一台服务器上,要是这台服务器宕了,后果可是不堪设想的

为了解决这个问题,早在 2014 年我的哥哥 Classic Swarm (https://github.com/Docker-archive/classicswarm)就已经开始提供跨主机运行容器的解决方案了,但不久之后我的爸爸就不管他了,在社区上不再维护

时间来到 2016 年,我诞生了

与我的哥哥 Classic Swarm 相比,我是直接被内置到了 Docker 当中

不但如此,我能够提供更强大的功能和更好的性能,支持服务发现、负载均衡、滚动更新等特性

创建集群的时候,我只需要在初始节点上执行 Docker swarm init 命令,然后在每个要添加进集群的其他节点上面执行 Docker swarm join 命令就可以了

怎么样,是不是非常方便

小伙伴们可能对我怎么管理集群比较关心,首先我会将集群中的节点分成两类:

  • 管理节点(Manager nodes)

管理节点提供了一个 API ,可以通过这个 API 来启动容器

而且管理节点之间使用基于 Raft 共识算法的协议相互通信,便于同步集群的状态,实现了高可用性和数据一致性

  • 工作节点(Worker nodes)

工作节点,顾名思义就是就负责干活的节点啦。它们负责执行实际的容器工作

而且我的爸爸跟我说管理节点最多只能设置七个,但工作节点数量不限制

别看我这么能干,其实我也有一些缺点,毕竟器无完器嘛

缺点一:集群里面不能够实现跨节点共享存储

虽然我支持集群里面跨节点网络通信(使用桥接方法),但是我不能够支持跨节点的共享存储。我必须依赖第三方的卷插件才能实现

缺点二:stack file 和 compose file 难以区分

自从我被集成到 Docker Engine 后,我发现我能够通过 compose 文件来部署服务了(部署 services、volumes等资源)

而你们也知道的,compose 文件一开始是给 Docker Compose 用的

我们来看下对比,可以看到用法是很相似的

Docker-compose -f Docker-compose up

Docker stack deploy -c Docker-compose.yml somestackname

但实际上我是通过 stack file 来进行集群部署的,stack file 也是 YML 格式的文件,它跟 compose file 极其相似

这样就会导致一些初学者在学习的时候不知道该用 stack file 还是 compose file ,可以看下下面这个 issue

https://stackoverflow.com/questions/43099408/whats-the-difference-between-a-stack-file-and-a-compose-file

PS:一般来讲,Stack file 和Compose file 的语法和功能非常相似,都可以用来定义和部署多个服务或容器

但是,Stack file 更加适合用来管理生产环境中的服务,而Compose file 更加适合用来管理开发和测试环境中的容器

此外,Stack file 还支持一些 Compose file 不支持的功能,如服务发现、负载均衡、滚动更新等

我的器生并非一帆风顺,我曾经可是 Docker Cloud 的支柱,但是 Docker Cloud 在 2018 年的时候就被关闭了

不但如此,随着对手 Kubernetes 的发展,我的地位不断地受到威胁。直到 2019 年,我的爸爸宣布停止对我的开发和维护,将重心转向 Kubernetes

可谓是:”跻攀分寸不可上,失势一落千丈强“

Kubernetes

哈喽大家好,我叫 Kubernetes。为了方便,你们可以叫我 K8s

想必大家都听说过我,作为迄今为止最受欢迎的容器编排器,我能够在多达数千个节点的集群上管理和分配资源

请允许我骄傲一下,我在容器编排器中地位相当于谷歌在搜素引擎中的地位,可以说是我主导了容器编排

但我能有今天,一方面归功于我的爸爸是谷歌,另一方面我得到了云原生计算基金会(Cloud Native Computing Foundation,CNCF)的支持

在 2014~2015 年间,整个容器社区可谓热闹非凡。但是热闹非凡的景象背后则是许多人的担忧和不满

那时候 Docker 项目已经成为 Docker 公司一个商业产品,当时我的爸爸找到了 Docker 公司,希望能够跟 Docker 合作,但是强硬的 Docker 觉得这会消弱自己的地位,拒绝掉了这个请求

而且 Docker 公司在 Docker 开源项目的发展上,始终保持着绝对的权威和发言权,并在多个场合用实际行动挑战到了其他玩家(比如,CoreOS、RedHat,甚至我爸爸和微软)的切身利益

于是这些开源基础设施领域巨头们联合我爸爸发起了一个名为CNCF(Cloud Native Computing Foundation)的基金会

这个基金会的目的就是希望以 Kubernetes 项目为基础,建立一个由开源基础设施领域厂商主导的、按照独立基金会方式运营的平台级社区,来对抗以 Docker 公司为核心的容器商业生态

于是在那个时候,我诞生了。我的前身是 Borg (一个谷歌内部工具)

如果你看过 Kubernetes 项目早期的 GitHub Issue 和 Feature 的话,就会发现它们大多来自于 Borg 和 Omega 系统的内部特性,这些特性落到 Kubernetes 项目上,就是 Pod、Sidecar 等功能和设计模式

我刚出生那会,因为操作太过复杂被很多人抱怨

如果你们想要配置集群,除了我本身,你们还需要选择和配置一些第三方组件。这就跟 Linux 内核需要跟 GNU 相结合才能构成一个完整的操作系统一样,我只是一个编排器,我需要跟其他软件结合才能构成一个完整的集群

还记得上面说过的 CNCF 基金会不,RedHat 也在里面,它把它的那一套玩法搬到了我的身上

跟 Linux 发行版本一样,我跟安装程序和其他精心挑选的第三方组件捆绑在一起,摇身一变就成了 K8s 发行版

有了 K8s 发行版,你们对我的抱怨就少了很多

不但如此,我的爸爸开始在 K8s 社区上大力推行”民主化“变革,即从 API 到容器运行时的每一层,Kubernetes 项目都为开发者暴露出了可以扩展的插件机制,鼓励用户通过代码的方式介入 Kubernetes 项目的每一个阶段

这个民主化变革带来的效果是巨大的,很快在整个容器社区中催生出了大量的、基于 Kubernetes API 和扩展接口的二次创新工作

随着我不断崛起不断扩大,Docker 公司也不得不面对自己即将失败的现实,从 2017 年开始,Docker 公司先是将 Docker 项目的容器运行时部分 Containerd 捐赠给 CNCF 社区

接着 10 月份的时候,Docker 公司出人意料地宣布,将我内置到它们的主打产品 Docker 企业版中,这标志着这场轰轰烈烈的”编排器之争“至此落下帷幕

如果当初 Docker 公司选择了跟我爸爸合作,那么如今的容器生态又会是一番怎样的景象呢?

本文参考链接:https://lwn.net/Articles/905164/#t

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/566717.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OSPF 5种报文、状态机、邻居建立的过程

OSPF 5种报文、状态机、邻居建立的过程 一、OSPF的5种报文二、OSPF状态机三、OSPF建立的过程 一、OSPF的5种报文 Hello 用于发现邻居,维持邻居的状态 DD DD报文有确定设备主从,同步DD序列号 包含着LSA的头部信息,有同步LSDB数据库的作用 LSA…

云原生|Kubernetes Operator测试实例

目录 一、主要代码介绍 (一)变量定义: (二)测试程序入口 (三)before函数 (四)after函数 二、实际测试 (一)块划分 (二&#x…

【数据分享】1997-2017 年中国市县级能耗与能效数据集

能源既关乎国家经济命脉,又影响人民生活水平!能源相关的研究是各个行业的热门研究话题,能源相关的数据也是经常使用的数据! 我们发现在figshare平台上分享有1997-2017 年我国市县级的能耗与能效数据,数据格式为Excel&…

CMake常用命令总结与练习

CMake常用命令总结 前言cmake_minimum_required (VERSION XX):CMake最低版本project (demo):CMake工程名add_executable(main main.c):生成可执行文件aux_source_directory(dir var):指定源文件放入变量set(val src):指定源文件放入变量include_director…

js闭包的简单应用

闭包的概念:有权访问其他函数的内部变量的函数 闭包是作用域运用的特殊场景。 注:js中自由变量的查找是在函数定义的地方向上级作用域查找,不是在执行的地方。 闭包的使用场景概况为两种,一种是函数作为参数被传递,一种…

面试官:MySQL自增主键一定是连续的吗?

测试环境: MySQL版本:8.0 数据库表:T (主键id,唯一索引c,普通字段d) 如果你的业务设计依赖于自增主键的连续性,这个设计假设自增主键是连续的。但实际上,这样的假设是错的…

还在用System.out+System.currentTimeMillis打印耗时?Arthas是你不可或缺的神器!

如何分析一下自己的web项目的性能消耗,一般我们会在开始与结束加时间相减打印出消耗时间。这种方法侵入率太高了,如果想利用arthas整体调优一下自己web项目的性能点的话,可以使用以下的步骤或思路。(当然xrebel也是一个不错的选择…

进程的创建和回收

一、进程概念:程序运行的状态 程序: 1.存放在磁盘上的指令和数据的有序集合(文件) 2.静态的 进程: 1.执行一个程序所分配的资源的总称 2.动态的 进程和程序内容区别 进程包含的内容: BSS段&#xf…

Buffer Pool

Buffer Pool Innodb 存储引擎设计了一个缓冲池,来提升读写的性能。 在 MySQL 启动的时候,InnoDB 会为 Buffer Pool 申请一片连续的内存空间,然后按照默认的16KB的大小划分出一个个的页, Buffer Pool 中的页就叫做缓存页。此时这些…

java 社区人口管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 社区人口管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0…

Linux安装Zookeeper、Hadoop、Hive、Hbase全家桶系列

目录 Linux安装配置Zookeeper Linux安装配置Hadoop Linux安装Hbase Linux安装配置Zookeeper 新建文件夹 mkdir /home/zookeeper 下载到指定文件夹 官网 Apache ZooKeeper wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.1/apache-zookeeper-3.8.1-bin.tar.gz…

Jmeter的JSON断言

JSON断言是测试工作中经常用到的一种断言方法,一般用于断言某个字段值是否等于我们指定的值。所以JSON断言只能针对响应结果为applicaton/json格式的进行断言操作。 如果是其他类型(如:Test、html),则无法使用这种方式…

【神经网络】tenorflow实验11--人工神经网络(2)

1. 实验目的 ①掌握梯度下降法的优化算法; ②能够使用tf.keras构建Sequential模型,完成多分类任务。 2. 实验内容 ①下载MNIST数据集,建立神经网络模型,实现对MNIST手写数字数据集的识别,调整超参数和训练参数&…

公网对讲SDK——对讲应用场景

anyRTC 公网对讲 SDK的发布,解决了开发者想做公网对讲应用但没有技术的困境;SDK全平台支持的特性,让开发者可以在任何平台接入对讲能力;同时因为包体积小、对业务零入侵等特性被运用到各行各业中,下面咱们就来聊一聊公…

ansible——利用主机模式选择主机

一:主机模式:对目标主机的一种选择方式 1.以student用户身份并使用student作为密码登录workstations ssh studentworkstation 2.创建projects-host项目文件,并下载ansible配置文件 lab projects-host start 3.在 workstation上更改到/home…

恭喜星球又一名小伙伴上岸大厂

大家好,我是冰河~~ 星球里有不少小伙伴经过自己的努力,认真学习和总结,最终拿到了自己心仪的大厂Offer!本来想给大家分享下的,但是,过去挺长一段时间冰河都处于“全天候工作状态”,经常加班到晚…

业务连续性管理的重要性体现在哪里?

业务连续性管理的重要性体现在哪里?随着全球化、信息化和市场竞争加剧,企业面临的风险越来越多样化、复杂化。突发事件如自然灾害、供应链中断、网络攻击等都有可能对企业生产经营带来巨大影响,甚至导致公司破产倒闭。因此,保证业…

day14 - 提取图像信息

本期主要介绍图像的礼帽运算和黑帽运算,礼帽运算常用于获取原始图像的噪声信息,或者得到比原始图像的边缘更亮的边缘信息;黑帽运算常用来检测图像中的波谷结构,分离比邻近点暗一些的斑块,比如得到轮廓效果图。 完成本…

数据结构——实现单向链表

文章目录 :cow:前言:banana:单链表与顺序表的对比:orange:单链表的初始操作及结构体:watermelon:申请一个节点:carrot:打印:strawberry:销毁:apple:尾插:pear:尾删:grapes:头插:peach:头删:pineapple:数据的查找:lemon:数据的修改:tomato:在pos位置之后插入节点:potato:在pos位…

编辑距离算法

给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1: 输入:word1 "horse", word2 "ros&quo…