从 0.25 到 1.0,中小企业 Mesos 网络和存储的填坑实践

2023-10-24 19:40

本文主要是介绍从 0.25 到 1.0,中小企业 Mesos 网络和存储的填坑实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

从 0.25 到 1.0,中小企业 Mesos 网络和存储的填坑实践 博客分类: mesos

看完海外大型企业的 Mesos 容器技术实践,让我们视线回到国内。今天是 数人云容器三国演义 Meetup 嘉宾演讲实录第一弹。中小企业是如何解决 Mesos 使用过程中种种问题的? Acttao 技术总监何威威来告诉你答案——

今天与大家分享的是中小企业的 Mesos 实践中遇到的网络和存储方面的具体问题。

概述

首先介绍一下 Acttao 的实践情况。 Acttao 现在主要运行两个 Mesos 集群,一个用于测试环境,另一个用于生产环境。测试环境部署在 KVM 虚拟机里面,生产环境在阿里云。之前还有一个 OpenStack 的测试环境,后来撤掉了。有了 Mesos 集群以后,我们在开发过程中引入了 CI/CD , CI/CD 要求开发人员能很方便的管理无状态的 Web 服务,一个有状态类似于 MySQL 、 Redis 等的服务,还要求 Web 服务能够方便的找到数据库服务,这是要解决这三个问题。

要解决这些问题,需要我们在 Mesos 的容器里面实现一容器一 IP ,对于有状态的容器需要跨主机的 Volume 服务,以及服务发现。

Mesos 容器网络

说一下 Mesos 网络的方案。按照时间有三个阶段,第一个阶段在 Mesos 0.25 之前,在这之前 Docker 本身没有容器的扩展,第二个阶段是 Mesos0.25 到 1.0 之间,第三个阶段就是现在 1.0 版本之后。 Mesos 0.25 之前这个方案基本上是空白的,大部分都要手动运行脚本,以空网络起一个 Docker 容器,然后再运行一些比如创建网络设备、配置 IP 。那时有一个 Powerstrip 原型的工具,其原理是替代 Docker API 做一些扩展,使用这种工具给 Mesos 容器加 IP 基本不会有改动,通过 Mesos 的 API 就可以实现一容器一 IP 。

在 Mesos0.25 到 1.0 版本之间,这时 Docker 推出了网络扩展功能, Docker 容器有了原生的网络扩展支持。典型的第三方插件有 Weave 、 Calico 等。我们通过 MarathonAPI 可以直接实现创建的容器有一个 IP 。

1.0 之后 Mesos 原生支持了 CNI 网络,通过 Unified Container ,无论是 Mesos 的容器还是 Docker 的容器、 AppC 的容器,都很容易做到一个容器一个 IP 。

在 Mesos 支持 CNI 之前,为了实现 IP per container , Acttao 最后选择了 Weave 。没有使用 Docker 容器的扩展,而是选择 Weave Proxy ,类似于 0.25 之前的方案,因为它很容易集成。 Weave 的 Proxy 方式有 DNS 的服务发现,集成较简单, Weave 起一个 Router ,然后 Proxy 起开,起开以后在 Mesos 的 slave 设置 Docker socket 走 Weave Proxy 的 socket 就可以了。

当时没有选择 Docker Libnetwork 的扩展方式,因为那时需要为每一个 Docker 配一个外部存储,这也是刚才徐春明老师说他们现在 SwarmKit 里面不依赖于外部存储的原因。因为当时测试的 Docker 依赖于外部的存储,最后测试的性能问题比较严重。当时他们建议用 etcd ,而 Acttao 当时用的是 Zookeeper ,测试时起了网络有时候运行 docker network ls , Docker 就会卡掉,基本上是挂掉的状态。

在使用 Weave Proxy 时有两个问题一直困扰着我们。一个是 Weave 网络升级,有新版本发布时,我们可能会选择使用新版本,但是升级比较麻烦;另一个问题是网络的隔离性不好。升级时 Weave Proxy 要重启,重启了之后 Mesos 认为 Docker Engine 挂掉了,会把任务进行重新调度,但实际上在宿主机上的容器并没有挂掉。这个问题对无状态服务影响不大,相当于有多个实例,但是对于数据库服务来说,就会导致原先数据库服务运行着,又调度了一个新的任务,在 DNS 自动发现里一个域名会返回两个 IP ,导致了一个服务是可用的,另一个服务不可用。

由于这个原因,升级之前我们把 Mesos 的 Slave 停掉,把所有 Mesos 管理的容器也停掉,让 master 重新进行任务调度,接着把 Docker 也停掉了,然后安装新版本的 Weave ,之后把 Docker 和 slave 启动。在升级的中途如果宿主机里面有数据库服务,会有一段时间服务不可用。

Weave 基于子网的网络隔离灵活度不是很好。在 Mesos 考虑多租户,一个租户子网分配的太小,可能马上就不够用,后续扩大子网的过程非常麻烦,如果一开始分配的子网特别大,又会造成浪费。

针对升级网络组件时遇到的问题可以使用 CNI 来解决。网络隔离的问题可以在 CNI 的基础上使用 Calico 解决, Calico 基于 iptable 做了防火墙的规则。

在 Mesos 1.0 里配置 CNI 很简单。配置 network CNI 配置文件的目录以及 CNI 插件的目录, Mesos 就可以启用 CNI 的功能。 CNI 对第三方的配置也很简单,这张图是 Weave 的配置,只要一个名称和一个 type : weave-net 。 Calico 同样不复杂,基本上也是配置名称,支持 CNI 这个网络插件里面所需的配置。

使用 Marathon 启用的时候比较简单,在 APP 的 Json 文件里面配上 IP adress ,配一个 network 的 name ,这个名称就是之前配 CNI 里面的名称。然后配一些 label 标签,它与防火墙有关,再配一个 Discover 的端口,主要用作服务发现。通过这种方式,基本上就解决了前面提到的两个问题。

但是 Acttao 目前使用的仍然是 Weave CNI ,没有选择 Calico 方案的原因是它的安全策略现在必须得手动配置,不能自动地和 Mesos 集成。如果内部使用,自己配备也是可以的,但是后来考虑自己来写一个 marathon-calico ,根据 Marathon 中的 APP 自动创建网络安全方面的策略。

Mesos 容器存储

存储方案也和刚才的容器一样是分三个阶段的,中间阶段均是原生支持了扩展,容器 Volume 的扩展以后有一个阶段,以及 Mesos1.0 以后,直接支持 Docker 存储插件。之前 Acttao 基于 GlusterFS 做了 GlusterFS 集群,在每一个 S 节点把集群挂载上去,容器通过 Docker 直接挂宿主机上面目录的功能来实现。

当 Docker 原生支持 Volume 插件以后, Acttao 使用的是 EMC 的 REX-Ray ,这与其他 Volume 的插件功能类似,是我们目前了解到的插件中功能最全的,支持第三方存储,比如 OpenStack 和一些商业存储硬件,包括 EMC 。

Mesos1.0 以后原生提供了 Docker Volume 支持服务,通过 EMC 提供的 dvdcli 工具实现。最开始时 EMC 想利用这个功能为 Mesos 里面提供外部的存储,但是当时它基于 Mesos 的模块,只能支持 Mesos 容器,无法支持 Docker 容器。所以 Mesos1.0 以后直接把这个功能集成在 Mesos 核心。 Mesos1.0 以后,我们把它也配上了,提供 Mesos 原生支持。它的配置比较简单,在 slave 里面安装 dvdcli ,然后设置一个 Volume 的 check_point ,用作恢复,在隔离上面设置好 system/linux 和 docker/volume ,基本上就可以启用功能了。

在 Marathon 里面使用第三方外部存储时,需要把 external_volumes 的 feature 开启,真正使用时是在 APP 的 json 里面定义卷的时候,把 volume 里面的类型设置成外部的, provider 设置成 dvdi ,因为目前只支持这一种方式,后面使用 Docker Volume Plugin 的名称,基本上就可以使用了。

当前最新版本的 Marathon 的外部卷不能使用绝对路径,这个 BUG416 估计短期内也不会得到解决。我们把它里面 dvdi provider 的校验规则改一下,基本上就可以使用了。前端的校验规则里面是 Mesos 的容器,原先设置的时候不能使用相对路径,把它改掉就可以。

 

https://www.v2ex.com/t/315881

转载于:https://my.oschina.net/xiaominmin/blog/1598804

这篇关于从 0.25 到 1.0,中小企业 Mesos 网络和存储的填坑实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/277352

相关文章

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

Spring Boot 3 整合 Spring Cloud Gateway实践过程

《SpringBoot3整合SpringCloudGateway实践过程》本文介绍了如何使用SpringCloudAlibaba2023.0.0.0版本构建一个微服务网关,包括统一路由、限... 目录引子为什么需要微服务网关实践1.统一路由2.限流防刷3.登录鉴权小结引子当前微服务架构已成为中大型系统的标

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参