Compose 部署规范

Deploy 是 Compose 规范的可选部分。它提供了一组部署规范,用于管理容器在不同环境中的行为。

属性

endpoint_mode

endpoint_mode 指定了外部客户端连接到服务的一种服务发现方法。Compose Deploy Specification 定义了两个规范值:

  • endpoint_mode: vip: 为服务分配一个虚拟 IP (VIP),该 IP 充当客户端在网络上访问服务的前端。平台在客户端和运行服务的节点之间路由请求,客户端无需知道有多少节点参与服务或其 IP 地址或端口。

  • endpoint_mode: dnsrr: 平台为服务设置 DNS 条目,使得对该服务名称的 DNS 查询返回一个 IP 地址列表(DNS 轮询),客户端直接连接到其中一个地址。

services:
  frontend:
    image: example/webapp
    ports:
      - "8080:80"
    deploy:
      mode: replicated
      replicas: 2
      endpoint_mode: vip

标签

labels 指定了服务的元数据。这些标签仅设置在服务上,而不会设置在该服务的任何容器上。 这假设平台具有一些原生的“服务”概念,能够与 Compose 应用模型相匹配。

services:
  frontend:
    image: example/webapp
    deploy:
      labels:
        com.example.description: "This label will appear on the web service"

模式

mode 定义了在平台上运行服务的复制模型。可以是 global,即每个物理节点恰好一个容器,或者是 replicated,即指定数量的容器。默认值为 replicated

services:
  frontend:
    image: example/webapp
    deploy:
      mode: global

放置

placement 指定了平台选择物理节点以运行服务容器的约束和偏好。

约束

constraints 定义了平台节点运行服务容器必须满足的必要属性。更多示例,请参阅 CLI 参考文档

deploy:
  placement:
    constraints:
      - disktype=ssd

首选项

preferences 定义了一种策略(目前 spread 是唯一支持的策略),用于根据数据中心节点标签的值均匀分布任务。有关更多示例,请参阅 CLI 参考文档

deploy:
  placement:
    preferences:
      - spread: node.labels.zone

副本

如果服务值为 replicated (默认值), replicas 指定了在任何给定时间应该运行的容器数量。

services:
  frontend:
    image: example/webapp
    deploy:
      mode: replicated
      replicas: 6

资源

resources 配置容器在平台上运行的物理资源限制。这些限制可以配置为:

  • limits: 平台必须防止容器分配更多资源。
  • reservations: 平台必须保证容器能够分配到至少配置的数量。
services:
  frontend:
    image: example/webapp
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
          pids: 1
        reservations:
          cpus: '0.25'
          memory: 20M

cpus

cpus 配置容器可以使用的可用 CPU 资源(以核心数为单位)的限制或预留。

内存

memory 配置容器可分配内存量的限制或预留,设置为表示字节值的字符串。

pids

pids 调整容器的 PIDs 限制,设置为整数。

设备

devices 配置容器可以使用的设备预留。它包含一个预留列表,每个预留都设置为一个具有以下参数的对象:capabilitiesdrivercountdevice_idsoptions

设备通过一组能力列表进行预留,其中 capabilities 是唯一必需的字段。设备必须满足所有请求的能力才能成功预留。

功能

capabilities 被设置为字符串列表,表示通用能力和驱动特定能力。 目前识别的通用能力如下:

  • gpu: 图形加速器
  • tpu: AI 加速器

为了避免名称冲突,驱动特定的能力必须以驱动名称为前缀。 例如,预留一个启用 nVidia CUDA 的加速器可能如下所示:

deploy:
  resources:
    reservations:
      devices:
        - capabilities: ["nvidia-compute"]
驱动程序

可以使用 driver 字段为保留设备请求不同的驱动程序。该值以字符串形式指定。

deploy:
  resources:
    reservations:
      devices:
        - capabilities: ["nvidia-compute"]
          driver: nvidia
计数

如果 count 设置为 all 或未指定,Compose 会预留所有满足请求能力的设备。否则,Compose 至少预留指定数量的设备。该值以整数形式指定。

deploy:
  resources:
    reservations:
      devices:
        - capabilities: ["tpu"]
          count: 2

countdevice_ids 字段互斥。如果同时指定这两个字段,Compose 将返回错误。

device_ids

如果设置了 device_ids,Compose 会预留具有指定 ID 的设备,前提是这些设备满足请求的功能。该值指定为字符串列表。

deploy:
  resources:
    reservations:
      devices:
        - capabilities: ["gpu"]
          device_ids: ["GPU-f123d1c9-26bb-df9b-1c23-4a731f61d8c7"]

countdevice_ids 字段互斥。如果同时指定这两个字段,Compose 将返回错误。

选项

可以使用 options 作为键值对来设置驱动程序特定的选项。

deploy:
  resources:
    reservations:
      devices:
        - capabilities: ["gpu"]
          driver: gpuvendor
          options:
            virtualization: false

restart_policy

restart_policy 配置容器退出时是否以及如何重启。如果未设置 restart_policy,Compose 将考虑服务配置设置的 restart 字段。

  • condition. 设置为:
    • none,无论退出状态如何,容器都不会自动重启。
    • on-failure,如果容器因错误退出(表现为非零退出代码),则会重启容器。
    • any(默认),无论退出状态如何,容器都会重启。
  • delay: 两次重启尝试之间的等待时间,指定为一个 duration。默认值为 0,意味着重启尝试可以立即发生。
  • max_attempts: 在放弃之前尝试重启容器的次数(默认值:永不放弃)。如果重启在配置的 window 内未成功,则该次尝试不计入配置的 max_attempts 值。 例如,如果 max_attempts 设置为 '2',并且第一次尝试重启失败,则必须尝试超过两次重启。
  • window: 在判定重启是否成功之前需要等待的时间,指定为 持续时间(默认值: 立即判定)。
deploy:
  restart_policy:
    condition: on-failure
    delay: 5s
    max_attempts: 3
    window: 120s

rollback_config

rollback_config 配置在更新失败时服务应如何回滚。

  • parallelism: 每次回滚的容器数量。如果设置为 0,则所有容器同时回滚。
  • delay: 每个容器组回滚之间等待的时间(默认 0s)。
  • failure_action: 回滚失败时应采取的措施。可选值为 continuepause 之一(默认为 pause
  • monitor: 每次任务更新后监视失败的时间 (ns|us|ms|s|m|h) (默认 0s)。
  • max_failure_ratio: 回滚期间允许的失败率(默认为 0)。
  • order: 回滚期间的操作顺序。取值为 stop-first(在启动新任务之前停止旧任务), 或 start-first(先启动新任务,运行中的任务短暂重叠)(默认值为 stop-first)。

update_config

update_config 配置服务应如何更新。适用于配置滚动更新。

  • parallelism: 一次更新的容器数量。
  • delay: 更新一组容器之间等待的时间。
  • failure_action: 更新失败时该怎么办。取值为 continuerollbackpause 之一(默认值:pause)。
  • monitor: 每次任务更新后监视失败的时间 (ns|us|ms|s|m|h) (默认 0s)。
  • max_failure_ratio: 更新期间允许的故障率。
  • order: 更新期间的执行顺序。可选值为 stop-first (在启动新任务之前停止旧任务), 或 start-first (首先启动新任务, 正在运行的任务会有短暂重叠) (默认 stop-first)。
deploy:
  update_config:
    parallelism: 2
    delay: 10s
    order: stop-first