# Compose規范 - 部署
[TOC]
*注意:*部署是Compose規范的可選部分
## 介紹
Compose規范是定義多容器應用程序的一種與平臺無關的方法。支持Compose應用程序模型部署的Compose實現可能需要一些額外的元數據,因為Compose應用程序模型過于抽象,無法反映每個服務的實際基礎架構需求或生命周期約束。
Compose Specification Deployment允許用戶在服務上聲明其他元數據,因此Compose實現可獲取相關數據以在平臺上分配足夠的資源并對其進行配置以滿足用戶的需求。
## 定義
擴展了Compose Specification,以支持`deploy`關于服務的OPTIONAL小節。本部分定義服務的運行時要求。
### endpoint_mode
`endpoint_mode`為連接到服務的外部客戶端指定服務發現方法。默認值和可用值是特定于平臺的,無論如何Compose規范定義了兩個規范值:
* `endpoint_mode: vip`:為服務分配一個虛擬IP(VIP),該虛擬IP充當客戶端訪問網絡上服務的前端。平臺在客戶端和運行服務的節點之間路由請求,而無需客戶端知道有多少節點正在參與服務或其IP地址或端口。
* `endpoint_mode: dnsrr`:平臺為服務設置DNS條目,以便對服務名稱的DNS查詢返回IP地址列表(DNS輪詢),并且客戶端直接連接到其中之一。
~~~yaml
services:
frontend:
image: awesome/webapp
ports:
- "8080:80"
deploy:
mode: replicated
replicas: 2
endpoint_mode: vip
~~~
### labels
`labels`指定服務的元數據。這些標簽*只能*在服務上設置,而*不能*在服務的任何容器上設置。這假定平臺是可以與Compose應用程序模型匹配的“服務”的某些本地概念。
~~~yaml
services:
frontend:
image: awesome/webapp
deploy:
labels:
com.example.description: "This label will appear on the web service"
~~~
### mode
`mode`定義用于在平臺上運行服務的復制模型。任一`global`(正好一個每個物理節點容器)或`replicated`(容器的指定數量)。默認值為`replicated`。
~~~yaml
services:
frontend:
image: awesome/webapp
deploy:
mode: global
~~~
### placement
`placement`為平臺選擇約束和首選項,以選擇一個物理節點來運行服務容器。
#### constraints
`constraints`定義平臺節點必須滿足才能運行服務容器的REQUIRED屬性。可以通過列表或帶有字符串值的映射進行設置。
~~~yaml
deploy:
placement:
constraints:
- disktype=ssd
~~~
~~~yaml
deploy:
placement:
constraints:
disktype: ssd
~~~
#### preferences
`preferences`定義平臺節點應滿足以運行服務容器的屬性。可以通過列表或帶有字符串值的映射進行設置。
~~~yaml
deploy:
placement:
preferences:
- datacenter=us-east
~~~
~~~yaml
deploy:
placement:
preferences:
datacenter: us-east
~~~
### replicas
如果服務是`replicated`(默認)服務,請`replicas`指定在任何給定時間應運行的容器數
~~~yaml
services:
fronted:
image: awesome/webapp
deploy:
mode: replicated
replicas: 6
~~~
### resources
`resources`配置容器在平臺上運行的物理資源限制。這些約束可以配置為:
* `limits`:平臺必須阻止容器分配更多
* `reservations`:平臺務必保證容器可以分配至少已配置的數量
~~~yaml
services:
frontend:
image: awesome/webapp
deploy:
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
~~~
#### cpus
`cpus`配置容器可以使用的可用CPU資源量(作為內核數)的限制或預留。
#### memory
`memory`配置容器可以分配的內存量的限制或保留,設置為表示[字節值](spec.md)(specifying-byte-values)的字符串
#### devices
`devices`配置容器可以使用的設備的預留。它包含保留的列表,每個組具有下列參數的對象:`capabilities`,`driver`,`count`,`device_ids`和`options`。
使用功能列表保留設備,這`capabilities`是必填字段。設備必須滿足所有請求的功能才能成功預訂。
##### capabilities
`capabilities`被設置為字符串列表,表示通用和特定于驅動程序的功能。今天公認以下通用功能:
* `gpu`:圖形加速器
* `tpu`:AI加速器
為避免名稱沖突,驅動程序特定功能必須以驅動程序名稱為前綴。例如,保留啟用nVidia CUDA的加速器可能如下所示
~~~yaml
deploy:
resources:
reservations:
devices:
- capabilities: ["nvidia-compute"]
~~~
##### driver
可以使用`driver`字段請求用于保留設備的其他驅動程序。該值指定為字符串。
~~~yaml
deploy:
resources:
reservations:
devices:
- capabilities: ["nvidia-compute"]
driver: nvidia
~~~
##### count
如果`count`設置為`all`或未指定,則Compose實現必須保留所有滿足請求功能的設備。否則,Compose實現必須至少保留指定數量的設備。該值指定為整數。
~~~yaml
deploy:
resources:
reservations:
devices:
- capabilities: ["tpu"]
count: 2
~~~
`count`和`device_ids`字段是排他的。如果同時指定了組合實現,則必須返回一個錯誤。
##### device_ids
如果`device_ids`設置為,則Compose實現必須保留具有指定ID的設備,前提是它們滿足請求的功能。該值被指定為字符串列表。
~~~yaml
deploy:
resources:
reservations:
devices:
- capabilities: ["gpu"]
device_ids: ["GPU-f123d1c9-26bb-df9b-1c23-4a731f61d8c7"]
~~~
`count`和`device_ids`字段是排他的。如果同時指定了組合實現,則必須返回一個錯誤。
##### options
可以將特定于驅動程序的選項設置`options`為鍵值對。
~~~yaml
deploy:
resources:
reservations:
devices:
- capabilities: ["gpu"]
driver: gpuvendor
options:
virtualization: false
~~~
### restart_policy
`restart_policy`配置是否以及如何在退出容器時重新啟動容器。如果`restart_policy`未設置,則撰寫實現必須考慮`restart`由服務配置設置的字段。
* `condition`:其一`none`,`on-failure`或者`any`(默認值:`any`)。
* `delay`:兩次重啟嘗試之間等待的[時間](spec.md)(specifying-durations),指定為[持續時間](spec.md)(specifying-durations)(默認值:0)。
* `max_attempts`:放棄之前嘗試重新啟動容器的次數(默認值:永不放棄)。如果重新啟動未在configure內成功完成`window`,則此嘗試不會計入配置`max_attempts`值。例如,如果`max_attempts`設置為“ 2”,并且第一次嘗試重啟失敗,則必須嘗試兩次以上的重啟。
* `window`:決定重新啟動是否成功之前要等待的[時間](spec.md)(specifying-durations),指定為[持續時間](spec.md)(specifying-durations)(默認值:立即決定)。
~~~yaml
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
~~~
### rollback_config
`rollback_config`配置在更新失敗的情況下應如何回滾服務。
* `parallelism`:一次要回滾的容器數。如果設置為0,則所有容器將同時回滾。
* `delay`:每個容器組回滾之間等待的時間(默認為0s)。
* `failure_action`:如果回滾失敗,該怎么辦。其中一個`continue`或者`pause`(默認`pause`)
* `monitor`:更新每個任務以監視失敗后的持續時間`(ns|us|ms|s|m|h)`(默認0s)。
* `max_failure_ratio`:在回滾期間可以容忍的故障率(默認為0)。
* `order`:回滾期間的操作順序。其中一個`stop-first`(舊任務,開始新的一個前停止),或者`start-first`(新的任務首先啟動,并且正在運行的任務簡單地重疊)(默認`stop-first`)。
### updatec_onfig
`update_config`配置應如何更新服務。對于配置滾動更新很有用。
* `parallelism`:一次更新的容器數。
* `delay`:在更新一組容器之間等待的時間。
* `failure_action`:如果更新失敗,該怎么辦。其中一個`continue`,`rollback`或者`pause`(默認:`pause`)。
* `monitor`:更新每個任務以監視失敗后的持續時間`(ns|us|ms|s|m|h)`(默認0s)。
* `max_failure_ratio`:更新期間可以容忍的故障率。
* `order`:更新期間的操作順序。其中一個`stop-first`(舊任務,開始新的一個前停止),或者`start-first`(新的任務首先啟動,并且正在運行的任務簡單地重疊)(默認`stop-first`)。
~~~yaml
deploy:
update_config:
parallelism: 2
delay: 10s
order: stop-first
~~~