健康检查针对的是App下的每一个Task,Marathon框架通过健康检查来实现应用的故障恢复,健康检查实现了对Task的生命周期的管理。
Marathon将应用的可恢复性与监控检查结合在一起,在状态发现变化时,触发scale操作,保证原有的可用服务的数量,如图3-10所示是Marathon健康检查的状态机。
Task有三种活动状态:健康,非健康和扩展中,状态变化根据逻辑运算进行判定,三个参数主要是:请求实例数i,健康实例数h,运行实例数r。当h=r !=i时,即健康实例数等于运行实例数但不等于请求实例数,运行状态将变为scaling,启动i-r个实例。
Marathon 在健康检查中设置了相关选项,健康检查主要有三种方式:HTTP、TCP、COMMAND,主要选项有以下几种:其中 gracePeriodSeconds、intervalSeconds、MaxConsecutiveFailures、timeoutSeconds 适用于所有检查方式,portIndex、port适用于TCP与HTTP,path、ignoreHttp1xx只适用于HTTP。
1)intervalSeconds:健康检查周期,默认为60s
2)timeoutSeconds:健康检查等待的超时失败时间,默认为20s
3)path:健康检查的请求访问路径,支持HTTP,默认为/
4)gracePeriodSeconds:允许忽略的检查失败最长时间,默认为300s。
5)MaxConsecutiveFailures:规定在多少次健康检查失败后为unhealthy服务,默认为3s
6)protocol:健康检查采用的协议,对于COMMAND,欲使其有效,需要在Marathon启动时设置”--executor health_checks”选项,其表明未明确executor时的默认选择为HTTP
7)portIndex:对服务进行健康检查时,访问的目的端口是host port,在Marathon中是随机分配的,并且一个服务可以存在多个端口,因此使用portIndex定义健康检查的端口的索引值,默认为0。
8)ignoreHttp1xx:忽略返回状态码100-199,默认为false,健康检查获取的返回码在此范围内,查询结果无效,状态保持不变。
9)command:Marathon 的健康检查基于最初的端口资源规则,对于Docker容器,服务端口即监听端口地址都与此规则不同,例如Docker容器要求像虚机一样有主机的IP,并 且每个服务端口都是特定的,那么这样的情况就需要使用command方式,使用外部命令行实现。下述三个实例分别使用HTTP、TCP和COMMAND实 现健康检查。
应用之间存在依赖关系,依赖关系可以是应用级别的依赖,也可以是应用组级别的依赖,如果是应用组级别的依赖,那么组内的子分组、应用都会等待依赖服务对象可用后才会启动。依赖定义可以表述为相对路径或者绝对路径。
应用实例
1)Docker实例
{
"id": "simple-docker",
"container":
{
"docker":
{
"image": "busybox"
}
},
"cmd": "echo hello from docker",
"cpus": 0.2,
"mem": 32.0,
"instances": 2
}
2) entry point的docker实例
{
"id": "simple-docker",
"container":
{
"docker":
{
"image": "mesosphere/inky"
}
},
"args": ["hello", "from", "docker"],
"cpus": 0.2,
"mem": 32.0,
"instances": 2
}
Docker 镜像“mesosphere/inky”的Dockerfile定义如下:
FROM busybox
MAINTAINER support@mesosphere.io
CMD ["inky"]
ENTRYPOINT ["echo"]
3)启动一个docker registry,并持久化数据到本地volume
{
"id": "/docker/registry",
"instances": 1,
"cpus": 0.5,
"mem": 1024.0,
"disk": 128,
"container":
{
"docker":
{
"type": "DOCKER",
"image": "registry:latest",
"network": "BRIDGE",
"parameters": [],
"portMappings":
[
{
"containerPort": 5000,
"hostPort": 0,
"protocol": "tcp",
"servicePort": 5000
}
]
},
"volumes":
[
{
"hostPath": "/local/path/to/store/packages",
"containerPath": "/storage", "mode": "RW"
}
]
},
"env": { "SETTINGS_FLAVOR": "local", "STORAGE_PATH": "/storage" },
"ports": [ 0 ]
}
4) Marathon 0.8.2与Mesos 0.22.0支持在启动task前强制docker 先拉取镜像
{
"type": "DOCKER",
"docker":
{
"image": "group/image",
"forcePullImage": true
}
}
结束语
关于DCOS应用相关的文章后续会继续推出,本周即将推出的内容主要包括容器持久化方案、容器存储驱动等存储文章,敬请期待!感谢您对苏研DCOS的关注与支持,努力一直在路上!