# 容器健康状态检查

- [容器健康状态检查](#容器健康状态检查)
    - [场景说明](#场景说明)
    - [配置方法](#配置方法)
    - [检查规则](#检查规则)
    - [使用限制](#使用限制)

## 场景说明

在实际的生产环境中，开发者提供的应用程序或者平台提供的服务难免存在bug，因此，一套管理系统对运行的应用程序进行周期性的健康检查和修复就是不可或缺的。容器健康检查机制便添加了用户定义的对容器进行健康检查的功能。在容器创建时配置\--health-cmd选项，在容器内部周期性地执行命令，通过命令的返回值来监测容器的健康状态。

## 配置方法

在容器启动时的配置：

```
isula run -itd --health-cmd "echo iSulad >> /tmp/health_check_file || exit 1" --health-interval 5m --health-timeout 3s --health-exit-on-unhealthy  busybox bash
```

可配置的选项：

-   \--health-cmd，必选，在容器内执行的命令。返回值为0表示成功，非0表示失败。
-   \--health-interval，默认 30s，最大为int64上限（纳秒），自定义配置最小值1s，相邻两次命令执行的间隔时间（注：入参0s时视为default）。
-   \--health-timeout，默认 30s，最大为int64上限（纳秒），自定义配置最小值1s，单次检查命令执行的时间上限，超时则任务命令执行失败（注：入参0s时视为default），仅支持runtime类型为lcr的容器。
-   \--health-start-period，默认 0s，最大为int64上限（纳秒），自定义配置最小值1s，容器初始化时间。
-   \--health-retries，默认 3，最大为int32上限，健康检查失败最大的重试次数。
-   \--health-exit-on-unhealthy，默认false，检测到容器非健康时是否杀死容器。

## 检查规则

1.  容器启动后，容器状态中显示health:starting。
2.  经过start-period时间后开始，以interval为间隔周期性在容器中执行CMD。即：当一次命令执行完毕后，经过interval时间，执行下一次命令。
3.  若CMD命令在timeout限制的时间内执行完毕，并且返回值为0，则视为一次检查成功。否则视为一次检查失败。检查成功后，容器状态变为health:healthy。
4.  若CMD命令连续retries次检查失败，则容器状态变为health:unhealthy。失败后容器也会继续进行健康检查。
5.  容器状态为health:unhealthy时，任意一次检查成功会使得容器状态变为health:healthy。
6.  设置\--exit-on-unhealthy的情况下，如果容器因为非被杀死退出（退出返回值137）后，健康检查只有容器在重新启动后才会继续生效。
7.  CMD执行完毕或超时时，docker daemon会将这次检查的起始时间、返回值和标准输出记录到容器的配置文件中。最多记录5条。此外，容器的配置文件中还存储着健康检查的相关参数。
8.  运行中的容器的健康检查状态也会被写入容器配置中。通过isula inspect可以看到。

```
"Health": {
    "Status": "healthy",
    "FailingStreak": 0,
    "Log": [
        {
            "Start": "2018-03-07T07:44:15.481414707-05:00",
            "End": "2018-03-07T07:44:15.556908311-05:00",
            "ExitCode": 0,
            "Output": ""
        },
        {
            "Start": "2018-03-07T07:44:18.557297462-05:00",
            "End": "2018-03-07T07:44:18.63035891-05:00",
            "ExitCode": 0,
            "Output": ""
        },
        ......
}
```

## 使用限制

-   容器内健康检查的状态信息最多保存5条。会保存最后得到的5条记录。
-   容器启动时若健康检查相关参数配置为0，则按照默认值处理。
-   带有健康检查配置的容器启动后，若iSulad daemon退出，则健康检查不会执行。iSulad daemon再次启动后，正在运行且带有健康检查配置的容器其健康状态会变为starting。之后检查规则同上。
-   如果健康检查从第一次开始便一直失败，其状态保持与之前一致（starting）,直到达到指定失败次数（--health-retries）后变为unhealthy，或者检查成功后变为healthy。
-   对于OCI类型的runtime的容器，健康检查功能待完善。目前仅完整支持lcr类型的容器。
