在EDAS控制台可以配置PostStart和PreStop的生命周期钩子,使您在应用启动后和停止前都可以添加代码来自定义一些操作动作。同时在EDAS控制台可以配置Liveness和Readiness探针,来探测容器的存活性和可读性。本文将展示如何配置应用的生命周期钩子,以及如何配置容器的存活探针和可读性探针。
背景信息
通常应用运行前后和停止前后都会有一些操作,例如运行前部署资源、停止前优雅下线应用或通知其他服务或应用。EDAS依托于K8s完美集成了配置生命周期钩子的功能,支持为容器的生命周期配置PostStart和PreStop钩子。
当您在K8s集群中部署应用的时候,需要读取Pod的存活状态并确定Pod是否准备好对外提供服务。EDAS依托于K8s完美集成了配置Pod探针的功能,支持配置Liveness探针来确定何时重启容器,以及配置Readiness探针来确定容器是否已经就绪可以接受流量。
在创建应用时配置应用生命周期的钩子和探针
- 登录EDAS控制台,在左侧导航栏,单击 ,在顶部菜单栏选择地域并在页面上方选择命名空间,然后在应用列表页面左上角,单击创建应用。
- 在应用基本信息页签,选择集群类型和应用运行环境,然后在页面最下方单击下一步。
配置项 描述 集群类型 选择Kubernetes集群。 应用运行环境 根据选择的托管应用类型选择应用运行环境。 - Java:
- 自定义:适用于在K8s集群中使用自定义的镜像部署应用。
- Java:支持通用的JAR包部署,适用于Dubbo和Spring Boot应用。在选择后可更改Java环境。
- Tomcat:支持通用的WAR包部署,适用于Dubbo和Spring应用。在选择后可更改Java环境和容器版本。
- EDAS-Container(HSF):适用于使用WAR或者FatJar部署HSF应用。在选择后可更改Java环境、Pandora版本和Ali-Tomcat版本。
- PHP:适用于运行在Apache HTTP Server中的PHP应用程序。
- 多语言Node.js、C++、Go...:适用于在K8s集群中使用自定义的镜像部署应用。更多信息,请参见在K8s环境中通过镜像部署多语言微服务应用。
- Java:
- 在应用配置页签,设置应用的环境信息、基本信息、部署方式和资源参数,设置完成后单击下一步。
- 在应用高级设置页签展开应用生命周期管理,设置以下参数。
参数 描述 PostStart配置 一种容器钩子。该钩子在容器被创建后立刻触发,通知容器它已经被创建。该钩子不需要向其所对应的Hook Handler传入任何参数。如果该钩子对应的Hook Handler执行失败,则该容器会终止运行,并根据该容器的重启策略决定是否要重启该容器。更多信息,请参见Container Lifecycle Hooks。 PreStop配置 一种容器钩子。该钩子在容器被删除前触发,其所对应的Hook Handler必须在删除该容器的请求发送给Docker Daemon之前完成。在该钩子对应的Hook Handler完成后不论执行的结果如何,Docker Daemon会发送一个SIGTERN信号给Docker Daemon来删除该容器。更多信息,请参见Container Lifecycle Hooks Liveness配置 一种探测容器状态的探针,探测应用是否处于健康状态。如果不健康,则删除并重建容器。更多信息,请参见Pod Lifecycle。 Readiness配置 一种探测容器状态的探针,探测应用是否启动完成并且处于正常服务状态。如果不正常,则更新容器的状态。更多信息,请参见Pod Lifecycle。 - 完成设置后单击创建应用。
- 在应用创建完成页签确认应用基本信息、应用配置和应用高级设置等信息,确认完毕后单击确定创建应用。在应用总览页面顶部提示信息中,单击查看详情,可在变更记录页面查看变更流程。应用部署需要几分钟,请您耐心等待。变更完成后在应用总览页面的基本信息区域查看实例的运行状态,如果显示为Pod运行中,说明应用部署成功。
在更新应用时配置应用生命周期钩子和探针
您除了在创建应用时可以配置应用生命周期钩子和探针,也可以在部署应用时配置或更新钩子和探针。
- 登录EDAS控制台。
- 在左侧导航栏,单击集群类型下拉列表,选择容器服务/Serverless K8s集群,然后在页面单击具体的应用名称。 ,在顶部菜单栏选择地域并在页面上方选择命名空间,在
- 在应用总览或基本信息页面的右上角,选择 。
- 在选择部署模式页面,选择具体的部署方式,然后在所选方式区域的右上角,单击开始部署。
- 设置应用的环境和部署包信息后展开应用生命周期管理,根据您的需求完成配置后单击确定。
参数 描述 PostStart配置 一种容器钩子。该钩子在容器被创建后立刻触发,通知容器它已经被创建。该钩子不需要向其所对应的Hook Handler传入任何参数。如果该钩子对应的Hook Handler执行失败,则该容器会终止运行,并根据该容器的重启策略决定是否要重启该容器。更多信息,请参见Container Lifecycle Hooks。 PreStop配置 一种容器钩子。该钩子在容器被删除前触发,其所对应的Hook Handler必须在删除该容器的请求发送给Docker Daemon之前完成。在该钩子对应的Hook Handler完成后不论执行的结果如何,Docker Daemon会发送一个SIGTERN信号给Docker Daemon来删除该容器。更多信息,请参见Container Lifecycle Hooks Liveness配置 一种探测容器状态的探针,探测应用是否处于健康状态。如果不健康,则删除并重建容器。更多信息,请参见Pod Lifecycle。 Readiness配置 一种探测容器状态的探针,探测应用是否启动完成并且处于正常服务状态。如果不正常,则更新容器的状态。更多信息,请参见Pod Lifecycle。 重要 单击确定后,该应用将会被重启,请在业务较少的时间段进行。
配置应用生命周期管理
PostStart和PreStop配置
Exec模式:在容器中执行指定的命令,如果命令退出时返回码为0则判定为执行成功。
- HttpGet模式:对容器上的指定端点执行HTTP GET请求,如果响应的状态码大于等于200且小于400,则判定为执行成功。
下面以PostStart的配置为例,讲解如何在EDAS中配置应用的PostStart和PreStop容器生命周期钩子。
Exec模式
以容器在创建成功后执行以下命令为例:
echo "container started"
在EDAS中有以下两种配置方式:方式一:将命令拆分为不同的参数。
这种方式适合命令比较短,参数比较少的情况。
方式二:启动一个Shell,在Shell中执行命令。
这种方式适合命令比较长,参数比较多的情况。
HttpGet模式
HttpGet模式支持以下配置参数:- Host:HTTP请求主机地址,不设置时默认为Pod的IP地址。
- Path:HTTP请求路径,默认值是"/"。
- Port:HTTP请求端口号。
- Scheme:协议类型,支持HTTP和HTTPS协议,默认是HTTP。
- HttpHeaders:自定义HTTP请求头。
以PostStart的HttpGet钩子为例,在容器启动后会向
http://example.com:8080/healthz
这个地址发送GET请求。说明如果PostStart或PreStop钩子执行失败,容器会被自动重启,在应用的变更记录中可以查询到PostStart或PreStop执行失败的信息。
Liveness和Readiness配置
LivenessProbe:用于检测容器是否存活。如果检测失败,K8s会自动杀死容器,然后根据重启策略重启容器。
ReadinessProbe:用于检测容器是否就绪可以接收流量。如果检测成功,K8s会将Pod添加到Pod所属的Service列表中,从而使Pod开始接收流量。
Exec:在容器中执行指定的命令,如果命令退出时返回码为0则认为诊断成功。
HttpGet:对容器上的特定端点执行HTTP GET请求,如果响应的状态码大于等于200且小于400,则认为探测成功的。
TcpSocket:检查容器的IP地址上的指定的TCP端口是否打开,如果打开则认为探测成功。
InitialDelaySeconds:容器启动后到探针第一次执行的延迟时间,以秒为单位,最小值为1秒,最大值为1000秒。
PeriodSeconds:探测周期,以秒为单位,最小值为1秒,最大值为1000秒。
SuccessThreshold:探针探测失败后,只有连续成功次数达到该阈值才被认为再次成功。最小值为1,最大值为1000,在Liveness探针中,该值固定为1。
TimeoutSeconds:探针超时时间,以秒为单位,最小值为1秒,最大值为1000秒。
FailureThreshold:探针探测成功后,只有连续失败次数达到该阈值才被认为探测失败。最小值为1,最大值为1000。
下图以Liveness配置为例,使用TcpSocket模式,探测的地址为空,因此默认目标地址是Pod的IP地址,探测端口是18081。在容器启动后60秒才开始进行首次探测,探测周期为10秒,只要有1次探测成功即认为Pod存活。每次探测的超时时间是5秒,出现连续3次探测失败,K8s就会终结容器,然后根据重启策略重启容器。

结果验证
当配置了应用生命周期钩子后,可通过以下示例步骤验证配置结果。
例如在启动应用前,配置了Hello from the postStart handler
的写入脚本。
Hello from the postStart handler
,如果存在,那么表示配置成功。
EDAS容器服务K8s和Serverless K8s交流群
如果您在EDAS中使用容器服务K8s集群和Serverless K8s集群过程中有任何疑问或建议,请使用钉钉搜索钉钉群号23197114加入钉钉群进行反馈。