Author | 王润泽 |
---|---|
Date | 2022-09-19 |
Emial | wangrunze13@huawei.com |
为了从业务层面检查容器状态, 确定容器内运行的服务状态是否正常,需要从容器内部执行健康检查。在isulad中,可以配置单个容器健康检查的命令,方式,周期等, health check模块会依照这些配置在容器内部执行检查并处理检查结果。
这里是Health Check模块整体的流程图:
health check模块主要做以下几件事:
Container Module和Restore Module使用了Health Check模块来给新创建/恢复的容器对象绑定一个monitor。 health check模块的提供的API很少,大部分的逻辑在内部完成,其中两个API负责monitor的创建和销毁。monitor的生命周期依赖于容器,容器启动/恢复的时候创建monitor,容器销毁的时候负责销毁monitor。
// 1.释放动态分配的health_check结构体
void health_check_manager_free(health_check_manager_t *health_check);
// 2.初始化monitor, 动态分配health_check结构体
void container_init_health_monitor(const char *id)
// 3.停止health check
void container_stop_health_checks(container_t *cont)
health check monitor状态转换图:
先说明这几个状态的含义:
IDLE
是初始状态,当处于这个状态的时候,说明monitor只需要睡眠等待。INTERVAL
是check周期到达的状态,当处于这个状态的时候,说明monitor需要执行health check。STOP
是停止状态, 当处于这个状态,monitor需要执行一些清理工作并退出monitor thread exit
并不属于monitor的状态,它代表着monitor thread的退出。接着讨论状态如何转换,其中实线是monitor这个线程里面执行的状态转换,虚线是外部线程调用函数完成的状态转换,具体分析如下:
static void close_health_check_monitor(container_t *cont)
来停止monitor thread。void container_stop_health_checks(container_t *cont)
实现的。这个函数只是close_health_check_monitor
的封装,供外部模块调用。stop container和pause container的时候都会进行这个状态切换。另外,monitor thread内部并不会进行IDLE和INTERVAL状态到STOP状态的转换,因为可以直接执行清理工作并退出线程。当IDLE和INTERVAL状态下调用应该执行的操作出错的时候会直接退出monitor thread。
在INTERVAL状态下,会根据config的cmd执行health check并产生result, 具体流程如下:
准备的exec的output buffer是一个定长的buffer,当输出过多的时候会使用“...”的方式省略输出。
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )