

# 使用容器运行状况检查确定 Amazon ECS 任务运行状况
<a name="healthcheck"></a>

创建任务定义时，您可以为容器配置运行状况检查。运行状况检查指的是在容器上本地运行的命令，可验证应用程序的运行状况和可用性。

Amazon ECS 容器代理仅监控和报告在任务定义中指定的运行状况检查。Amazon ECS 不监控嵌入到容器映像中和未在容器定义中指定的 Docker 运行状况检查。在容器定义中指定的运行状况检查参数覆盖容器映像中存在的任意 Docker 运行状况检查。

在任务定义中定义运行状况检查时，容器会在容器内部运行运行状况检查进程，然后评估退出代码以确定应用程序的运行状况。

运行状况检查包含以下参数：
+ 命令 – 容器运行的命令，用于确定其运行状况是否正常。字符串数组可以以 `CMD` 开头以直接运行命令参数，或者以 `CMD-SHELL` 开头以使用容器的默认 Shell 来运行命令。需要管道、重定向、命令链或环境变量扩展等 Shell 功能时请使用 `CMD-SHELL`。例如，`CMD-SHELL` 允许您使用类似于 `curl -f http://localhost/ || exit 1` 的命令，而 Shell 负责解释 `||` 运算符。`CMD` 用于不需要 Shell 来进行解释的简单命令。
+ 间隔 – 每次运行状况检查间隔的时间（以秒为单位）。
+ 超时 – 等待运行状况检查成功执行的时间长度（以秒为单位），超过该时间则视为失败。
+ 重试次数 – 重试失败的运行状况检查的次数，超过该次数将容器视为不正常。
+ 启动期 – 可选的宽限期，这让容器有时间来引导，不将失败的运行状况检查计数计入最大重试次数中。

  如果 `startPeriod` 中的运行状况检查成功，则容器将被视为运行状况良好，并且任何后续失败将计入最大重试次数。

有关如何在任务定义中指定运行状况检查的信息，请参阅[运行状况检查](task_definition_parameters.md#container_definition_healthcheck)。

下面介绍了容器的运行状况可能值：
+ `HEALTHY` – 容器运行状况检查已成功通过。
+ `UNHEALTHY` – 容器运行状况检查失败。
+ `UNKNOWN` – 正在评估容器运行状况检查，没有定义容器运行状况检查，或者 Amazon ECS 没有容器的运行状况。

运行状况检查命令在容器上运行。因此，您必须在容器映像中包含这些命令。

运行状况检查通过位于 `localhost` 或 `127.0.0.1` 的容器的环回接口连接到应用程序。退出代码 `0` 表示成功，非零退出代码表示失败。

使用容器运行状况检查时，请考虑以下几点：
+ 容器运行状况检查需要 Amazon ECS 容器代理版本 1.17.0 或更高版本。
+ 如果使用的是 Linux 平台版本 `1.1.0` 或更高版本或者 Windows 平台版本 `1.1.0` 或更高版本，则 Fargate 任务支持容器运行状况检查

## Amazon ECS 如何确定任务运行状况
<a name="task-determination"></a>

只有在任务定义中具有运行状况检查命令的必要容器才会被考虑用于确定任务运行状况。

以下规则按顺序评估：

1. 如果一个基本容器的状态为 `UNHEALTHY`，则任务状态为 `UNHEALTHY`。

1. 如果一个基本容器的状态为 `UNKNOWN`，则任务状态为 `UNKNOWN`。

1. 如果所有基本容器的状态都为 `HEALTHY`，则任务状态为 `HEALTHY`。

请考虑以下任务运行状况示例，其中包含 2 个基本容器。


| 容器 1 运行状况 | 容器 2 运行状况  | 任务运行状况 | 
| --- | --- | --- | 
| UNHEALTHY |  UNKNOWN | UNHEALTHY | 
| UNHEALTHY | HEALTHY | UNHEALTHY | 
| HEALTHY | UNKNOWN | UNKNOWN | 
| HEALTHY | HEALTHY | HEALTHY | 

考虑以下任务运行状况示例，其中包含 3 个容器。


| 容器 1 运行状况 | 容器 2 运行状况  | 容器 3 运行状况 | 任务运行状况 | 
| --- | --- | --- | --- | 
| UNHEALTHY |  UNKNOWN | UNKNOWN | UNHEALTHY | 
| UNHEALTHY | UNKNOWN | HEALTHY | UNHEALTHY | 
| UNHEALTHY | HEALTHY | HEALTHY | UNHEALTHY | 
| HEALTHY | UNKNOWN | HEALTHY | UNKNOWN | 
| HEALTHY | UNKNOWN | UNKNOWN | UNKNOWN | 
| HEALTHY | HEALTHY | HEALTHY | HEALTHY | 

## 代理断开连接如何影响运行状况检查
<a name="healthcheck-agent-disconnect"></a>

如果 Amazon ECS 容器代理与 Amazon ECS 服务断开连接，这不会导致容器转变为 `UNHEALTHY` 状态。这是设计使然，目的是确保容器在代理重启或暂时不可用时保持运行。运行状况检查状态是 Amazon ECS 代理的“最后一次收到位置”的响应，因此，如果在断开连接之前将容器视为 `HEALTHY`，则该状态将保持不变，直到代理重新连接并进行另一次运行状况检查。对容器运行状况检查的状态未做出任何假设。