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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
日志服务 SLS,月写入数据量 50GB 1个月
简介: 此参考架构将帮助您规划大规模 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 网络即可获得最佳性能。

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
23天前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
14天前
|
人工智能 API 数据安全/隐私保护
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
NextChat 是一个可以在 GitHub 上一键免费部署的私人 ChatGPT 网页应用,支持 GPT3、GPT4 和 Gemini Pro 模型。该项目在 GitHub 上获得了 63.8k 的 star 数。部署简单,只需拉取 Docker 镜像并运行容器,设置 API Key 后即可使用。此外,NextChat 还提供了预设角色的面具功能,方便用户快速创建对话。
81 22
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
|
25天前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
85 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
15天前
|
运维 开发者 Docker
Docker Compose:简化容器化应用的部署与管理
Docker Compose:简化容器化应用的部署与管理
|
15天前
|
Docker 微服务 容器
使用Docker Compose实现微服务架构的快速部署
使用Docker Compose实现微服务架构的快速部署
34 1
|
1月前
|
Web App开发 前端开发 测试技术
【Docker项目实战】使用docker部署tabler后台模版
【10月更文挑战第10天】使用docker部署tabler后台模版
42 1
【Docker项目实战】使用docker部署tabler后台模版
|
1月前
|
JSON JavaScript 测试技术
【Docker项目实战】使用Docker部署PPTist在线演示文稿应用
【10月更文挑战第9天】使用Docker部署PPTist在线演示文稿应用
42 1
【Docker项目实战】使用Docker部署PPTist在线演示文稿应用
|
1月前
|
消息中间件 编解码 Docker
【Docker项目实战】Docker部署RabbitMQ消息中间件
【10月更文挑战第8天】Docker部署RabbitMQ消息中间件
98 1
【Docker项目实战】Docker部署RabbitMQ消息中间件
|
28天前
|
消息中间件 Linux RocketMQ
在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
通过以上步骤,你可以在Red Hat Enterprise Linux 9上使用Docker快速安装并部署RocketMQ。这种方法不仅简化了安装过程,还提供了一个灵活的环境来管理和扩展消息队列系统。RocketMQ作为一款高性能的分布式消息系统,通过Docker可以实现快速部署和高效管理。
56 2
|
29天前
|
消息中间件 Linux RocketMQ
在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
通过以上步骤,你可以在Red Hat Enterprise Linux 9上使用Docker快速安装并部署RocketMQ。这种方法不仅简化了安装过程,还提供了一个灵活的环境来管理和扩展消息队列系统。RocketMQ作为一款高性能的分布式消息系统,通过Docker可以实现快速部署和高效管理。
34 3
下一篇
无影云桌面