最佳实践系列丨Docker EE 大规模部署指南(一)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 此参考架构将帮助您规划大规模 Docker 企业版部署。它涉及核心 Docker EE 平台、UCP 以及 DTR。请使用本指南来帮助确定 Docker EE 部署的硬件和基础架构规模,并确定针对您的具体工作负载的最佳配置。

screenshot

本文首发自“Docker公司”公众号(ID:docker-cn)
编译丨小东
每周一、三、五 与您不见不散!


此参考架构将帮助您规划大规模 Docker 企业版部署。它涉及核心 Docker EE 平台、Universal Control Plane 以及 Docker Trusted Registry。请使用本指南来帮助确定 Docker EE 部署的硬件和基础架构规模,并确定针对您的具体工作负载的最佳配置。


您将学到的知识

对于 Docker EE、Universal Control Plane (UCP)和 Docker Trusted Registry (DTR),本指南涵盖了:

  • 哪些应用场景参数很可能会影响规模要求;
  • 基于实际测试的已知规模限制;
  • 确保良好性能和未来增长余地的最佳实践;

Docker EE 与 Docker Universal Control Plane

本节论述实现优化性能和增长潜力的基础 Docker EE 平台和 Universal Control Plane 配置。


管理节点的数量

对于生产集群,建议的管理节点数量是 3 个或 5 个。3 管理节点集群可以容许损失 1 个管理节点,而 5 管理节点集群可以容许 2 个管理节点暂时故障。具有更多管理节点的集群可以容许更多管理节点发生故障,但是增加管理节点也会增加维护开销和按 Docker Swarm Raft 法定多数提交集群状态的开销。在某些情况下,拥有较多管理节点(例如 5 个或 7 个)的集群可能(在集群更新延迟和吞吐量方面)不如只有 3 个管理节点但其他规格类似的集群。

一般而言,增加管理节点数量不会加快集群操作速度(在某些情况下,反而会使速度变慢),不会增加集群最大更新操作吞吐量,也不会增强集群能够管理的工作节点总数。

即使在管理节点发生故障,失去法定多数的情况下,集群上的服务和任务也会继续运行,并且保持稳态稳定(只不过在没有法定多数的情况下,无法更新集群状态)。因此,Docker 建议将投资花在个别管理节点故障后快速恢复的能力上(例如用于快速添加替换管理节点的自动化/脚本),而不要规划具有大量管理节点的集群。

1 个管理节点的集群应该仅用于测试和试验,因为损失管理节点就会导致集群损失。

请查看文档来获取关于 Swarm 管理节点和工作节点配置的详细信息。


管理节点大小和类型

生产集群中的管理节点最好拥有至少 16GB 的 RAM 和 4 个 vCPU。Docker 进行的测试表明,拥有 16GB RAM 的管理节点即使用在有 100 个工作节点和众多服务、网络及其他元数据的集群中,也不会受限于内存大小。

生产集群中的管理节点应该_始终_对 /var/lib/docker/swarm 挂载点使用 SSD。Docker 在此目录中存储 swarm 集群状态,并且会在集群状态更新时进行众多小更新的读写。SSD 将确保以尽可能小的延迟提交更新。建议在用于测试和试验的集群中也使用 SSD 来确保良好性能。

提高 CPU 速度和数量,以及改善管理节点之间的网络延迟,也会提高集群性能。


工作节点大小和数量

对于工作节点而言,Docker 组件和代理程序的开销并不大 – 通常小于 1GB 内存。确定工作节点大小和数量的过程与您当前确定应用或 VM 环境大小的过程类似。例如,您可以确定负载下的应用内存工作集,并考虑每个应用需要多少从节点(确保任务失败时的耐用性和/或吞吐量)。这样一来,您对集群中各工作节点需要的总内存量就有了一个认识。

请记住,在工作节点发生故障时(或者您清空某个节点以进行升级或维修时),Docker Swarm 会自动重新调度任务,所以别忘了留出余地,使任务能够再平衡到其他节点。

还要记住的是,Docker 容器与虚拟机不同,与在容器外运行相比,在容器中运行应用所增加的内存或 CPU 开销极小或为零。如果将应用从各个 VM 移动到容器中,或者将许多应用合并到一个 Docker EE 集群中,那么您为此使用的资源将比当前使用的少得多。


任务分割和限制资源使用

在生产集群中,切勿在管理节点上运行工作负载。这是 Docker Universal Control Plane (UCP) 中的一种可配置的管理节点设置。

如果在集群上部署的任务和服务具有差异很大的资源概要,而且您希望对不同的任务(例如具有不同的磁盘、内存或 CPU 特征)使用不同的节点类型,可以使用节点标记和服务约束来控制 Swarm 对特定服务的任务调度。

您还可以将节点加入集合以及基于用户帐户和团队控制访问。如果某些团队或个人经常要部署的应用会消耗许多资源,或者具有对其他团队运行的任务产生不利影响的扰邻特征,用这种方法可以有效隔离他们所管理的任务。请参见 RBAC 知识库文章了解关于如何使用 Docker 企业版设计团队和项目结构的示例。


资源约束

Docker EE 支持对容器和服务任务应用资源限制。Docker 建议在创建服务时使用 --reserve-memory=和 --limit-memory=参数。这些参数让 Docker EE 可以根据预期的内存消耗,更好地在工作节点上打包任务。

此外,分配一个全局(每节点 1 个实例)“幽灵”服务也许是个好主意,它可以在每个节点上保留一部分(例如 2GB)内存,供非 Docker 系统服务使用。因为 Docker Swarm 当前不会考虑非 Docker 管理的工作负载所消耗的工作节点内存,所以这个方法很有意义:

docker service create --name system-reservation --reserve-memory 2G --limit-memory 2G --reserve-cpu 1 --mode global nginx:latest

(nginx 在此服务中实际上不执行任何工作。)(可以使用任何不会消耗大量内存或 CPU 的小镜像取代 nginx)。

请查看关于容器资源约束和为服务保留内存或 CPU 的文档。


磁盘空间

对于生产集群,您需要关注几个影响工作节点磁盘空间使用的因素:

  • 工作节点上使用中的 Docker 容器镜像;
  • 为容器创建的本地 Docker 存储卷;
  • 工作节点上存储的容器日志;
  • 工作节点上存储的 Docker 引擎日志;
  • 容器写入的临时数据;

工作节点上的容器镜像

要确定该为使用中的镜像分配多少空间,请尝试将一些应用放入容器,然后查看产生的镜像有多大。请注意,Docker 镜像包括多个层,如果有多个容器使用同一个层(对于 ubuntu 之类的 OS 层或 openjdk 之类的语言框架层来说很常见),在任何一个节点或 Docker Trusted Registry 上只会存储和使用该层的一个副本。层共享也意味着部署应用的新版本通常只会使节点上被占用的空间增加相对较小的幅度(因为只有容纳应用的最上数层发生更改)。

请注意,Docker Windows 容器镜像往往会变得比 Linux 容器镜像大。

为了持续监视使用中的容器镜像存储,应该尽量确保应用镜像从通用的基础镜像衍生。还可考虑运行定期脚本或 Cron 作业来修剪不使用的镜像,特别是在节点要处理许多镜像更新的情况下(例如比较频繁地发生部署的构建服务器或测试系统)。请参见关于镜像修剪的文档获取详细信息。


日志

对于生产集群,Docker 建议使用日志记录驱动或其他第三方服务聚合容器日志。只有 json-file(可能还包括 journald)日志驱动会导致容器日志在节点上累积,在这种情况下,要注意轮替或删除旧的容器日志。请参见日志记录设计与最佳实践获取详细信息。

Docker 引擎日志存储在工作节点和管理节点上。产生的引擎日志数量根据工作负载和引擎设置而变。例如,debug 日志级别会导致系统写入更多日志。应该使用 logrotate 之类的实用程序管理引擎日志(压缩并最终删除)。


Overlay 网络和网格路由

Docker EE 附带受支持的内置 Overlay 网络驱动,用于实现配合 Docker Swarm 使用的多主机网络。Overlay 网络会造成与封装网络流量和管理 IP 地址及其他跟踪网络任务和服务的元数据有关的开销。

Docker EE 客户如果有网络吞吐量要求非常高或者工作负载动态性极高(集群或服务的更新频率很高)的应用,应该考虑尽量降低对开箱即用的 Docker Overlay 网络和网格路由的依赖。要达到这一目的,有多种方法:

  • 使用主机模式发布取代网格路由;
  • 使用 macvlan 驱动,它的性能可能好于默认驱动;
  • 使用非 Docker 服务发现机制(例如 Consul);
  • 考虑使用 dnsrr 取代 vip 服务端点;

如果 Overlay 网络由使用基于 VIP 的端点模式创建(默认)的服务所使用,则网络大小不应该超过 /24 个含 256 个 IP 地址的区块(默认)。用户不应该通过增加 IP 区块大小来绕过此限制,而应该使用 dnsrr 端点模式或使用多个较小的 Overlay 网络。

还应注意的是,如果对一个 Overlay 网络分配了大量任务,例如有许多任务关联到该网络或者网络上的服务扩展到许多从节点,那么 Docker EE 可能会遇到 IP 枯竭的问题。在因为节点故障而重新调度任务时,也可能出现该问题。当前如果发生节点故障,Docker 会等待 24 小时以释放 Overlay IP 地址。可通过在 Docker 守护进程日志中查找 failed to allocate network IP for task 消息来诊断该问题。


HTTP 网格路由

含有 Universal Control Plane 的 Docker 企业版附带内置的 HTTP 网格路由功能。HTTP 网格路由因为增加了网络跳数和路由控制,会增加一些开销,应该仅用于管理对外部暴露的服务的网络。对于在 Docker 上托管的服务之间的网络和路由,只须使用标准的内置 Docker Overlay 网络即可获得最佳性能。

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
791 108
kde
|
1月前
|
应用服务中间件 网络安全 nginx
手把手教你使用 Docker 部署 Nginx 教程
本文详解Nginx核心功能与Docker部署优势,涵盖镜像拉取、容器化部署(快速、挂载、Compose)、HTTPS配置及常见问题处理,助力高效搭建稳定Web服务。
kde
760 4
|
3月前
|
运维 Devops 持续交付
揭秘 Docker 自动部署神器 Websoft9:热门开源软件一键部署
在企业IT建设中,软件部署常面临效率低、易出错等问题。通过Docker与自动化工具,可实现高效、标准化和可追溯的部署流程,提升企业应用交付效率,降低运维门槛,助力中小企业实现自动化部署。
274 5
揭秘 Docker 自动部署神器 Websoft9:热门开源软件一键部署
|
2月前
|
JavaScript 算法 前端开发
【Docker项目实战】使用Docker部署paopao-ce微社区
【Docker项目实战】使用Docker部署paopao-ce微社区
352 84
【Docker项目实战】使用Docker部署paopao-ce微社区
|
3月前
|
运维 Cloud Native 开发者
Docker:现代化应用开发与部署的神器
Docker:现代化应用开发与部署的神器
232 101
|
3月前
|
设计模式 Linux 开发工具
Docker部署会吗?
本段内容主要介绍了Docker常用命令、Linux基础指令及日志查看方法,还涉及SpringMVC的执行流程、设计模式与注解,适合用于面试中技术能力的展示。
140 0
|
1月前
|
应用服务中间件 Linux nginx
在虚拟机Docker环境下部署Nginx的步骤。
以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
113 5
|
2月前
|
存储 Docker Python
docker 部署 sftp
本文介绍SFTP服务的部署与配置,包括users.conf用户配置规则、Docker容器运行命令及上传目录权限说明,重点解析atmoz/sftp镜像的chroot机制与子目录映射,确保用户登录后正确访问/upload目录,并提供Python脚本实现文件上传示例。
225 12
docker 部署 sftp
|
2月前
|
运维 Linux 数据库
基于 Docker 部署 n8n 指南,新手一看就会
本教程详解如何通过 Docker 快速部署开源自动化工具 n8n,适合新手快速上手。内容涵盖官方部署步骤、常见难点及第三方一键部署方案,助你高效搭建自动化工作流平台。
1051 6