配置应用生命周期的钩子和探针

在EDAS控制台可以配置PostStart和PreStop的生命周期钩子,使您在应用启动后和停止前都可以添加代码来自定义一些操作动作。同时在EDAS控制台可以配置Liveness和Readiness探针,探测容器的存活性和可读性。本文介绍如何配置应用的生命周期钩子,以及如何配置容器的存活探针和可读性探针。

背景信息

通常应用运行前后和停止前后都会有一些操作,例如运行前部署资源、停止前优雅下线应用或通知其他服务或应用。EDAS依托于K8s完美集成了配置生命周期钩子的功能,支持为容器的生命周期配置PostStart和PreStop钩子。

当您在K8s集群中部署应用时,需要读取Pod的存活状态并确定Pod是否准备好对外提供服务。EDAS依托于K8s完美集成了配置Pod探针的功能,通过配置Liveness探针确定何时重启容器,以及通过配置Readiness探针确定容器是否已经就绪可以接受流量。

在创建应用时配置应用生命周期的钩子和探针

  1. 登录EDAS控制台,在左侧导航栏,单击应用管理 > 应用列表,在顶部菜单栏选择地域并在页面上方选择所属微服务空间,然后在应用列表页面左上角,单击创建应用

  2. 应用基本信息页签,选择集群类型和应用运行环境,然后在页面最下方单击下一步

    配置项

    描述

    集群类型

    选择Kubernetes集群

    应用运行环境

    根据选择的托管应用类型选择应用运行环境。

    • Java:

      • Java:支持通用的JAR包部署,适用于Dubbo和Spring Boot应用。在选择后可更改Java环境。

      • Tomcat:支持通用的WAR包部署,适用于Dubbo和Spring应用。在选择后可更改Java环境和容器版本。

      • EDAS-Container(HSF):适用于使用WAR或者FatJar部署HSF应用。在选择后可更改Java环境、Pandora版本和Ali-Tomcat版本。

      • 自定义:适用于在K8s集群中使用自定义的镜像部署应用。

    • PHP:适用于运行在Apache HTTP Server中的PHP应用程序。

    • 多语言Node.js、C++、Go...:适用于在K8s集群中使用自定义的镜像部署应用。

  3. 应用配置页签,设置应用的环境信息、基本信息、部署方式和资源参数,设置完成后单击下一步

  4. 应用高级设置页签展开应用生命周期管理,设置以下参数。

    配置项

    描述

    PostStart配置

    一种容器钩子。该钩子在容器被创建后立刻触发,通知容器它已经被创建。该钩子不需要向其所对应的Hook Handler传入任何参数。如果该钩子对应的Hook Handler执行失败,则该容器会终止运行,并根据该容器的重启策略决定是否要重启该容器。更多信息,请参见Container Lifecycle Hooks

    PreStop配置

    一种容器钩子。该钩子在容器被删除前触发,其所对应的Hook Handler必须在删除该容器的请求发送给Docker Daemon之前完成。在该钩子对应的Hook Handler完成后不论执行的结果如何,Docker Daemon会发送一个SIGTERN信号给Docker Daemon来删除该容器。更多信息,请参见Container Lifecycle Hooks

    TerminationGracePeriod配置

    设置Pod优雅终止超时时间。请确保PreStop操作和应用处理SIGTERM的时间能够在该时间段内完成。您也可以通过调整该配置,控制Pod删除时长。

    Liveness配置

    一种探测容器状态的探针,探测应用是否处于健康状态。如果不健康,则删除并重建容器。更多信息,请参见Pod Lifecycle

    Readiness配置

    一种探测容器状态的探针,探测应用是否启动完成并且处于正常服务状态。如果不正常,则更新容器的状态。更多信息,请参见Pod Lifecycle

    Startup配置

    一种探测慢启动容器的存活性的探针,该启动探针可以避免慢启动容器在启动运行之前被杀掉。更多信息,请参见Pod Lifecycle

  5. 完成设置后单击创建应用

  6. 应用创建完成页签确认应用基本信息应用配置应用高级设置等信息,确认完毕后单击确定创建应用

    应用总览页面顶部提示信息中,单击查看详情,可在变更记录页面查看变更流程。应用部署需要几分钟,请您耐心等待。变更完成后在应用总览页面的基本信息区域查看实例的运行状态,如果显示为Pod运行中,说明应用部署成功。

在更新应用时配置应用生命周期钩子和探针

除在创建应用时可以配置应用生命周期钩子和探针,您也可以在部署应用时配置或更新钩子和探针。

  1. 登录EDAS控制台

  2. 在左侧导航栏,单击应用管理 > 应用列表,在顶部菜单栏选择地域并在页面上方选择所属微服务空间,在集群类型下拉列表,选择K8s集群,然后在页面单击具体的应用名称。

  3. 应用总览基本信息页面的右上角,选择部署 > 部署

  4. 选择部署模式页面,选择具体的部署方式,然后在所选方式区域的右上角,单击开始部署

  5. 设置应用的环境和部署包信息后展开应用生命周期管理,根据您的需求完成配置后单击确定

    配置项

    描述

    PostStart配置

    一种容器钩子。该钩子在容器被创建后立刻触发,通知容器它已经被创建。该钩子不需要向其所对应的Hook Handler传入任何参数。如果该钩子对应的Hook Handler执行失败,则该容器会终止运行,并根据该容器的重启策略决定是否要重启该容器。更多信息,请参见Container Lifecycle Hooks

    PreStop配置

    一种容器钩子。该钩子在容器被删除前触发,其所对应的Hook Handler必须在删除该容器的请求发送给Docker Daemon之前完成。在该钩子对应的Hook Handler完成后不论执行的结果如何,Docker Daemon会发送一个SIGTERN信号给Docker Daemon来删除该容器。更多信息,请参见Container Lifecycle Hooks

    TerminationGracePeriod配置

    设置Pod优雅终止超时时间。请确保PreStop操作和应用处理SIGTERM的时间能够在该时间段内完成。您也可以通过调整该配置,控制Pod删除时长。

    Liveness配置

    一种探测容器状态的探针,探测应用是否处于健康状态。如果不健康,则删除并重建容器。更多信息,请参见Pod Lifecycle

    Readiness配置

    一种探测容器状态的探针,探测应用是否启动完成并且处于正常服务状态。如果不正常,则更新容器的状态。更多信息,请参见Pod Lifecycle

    Startup配置

    一种探测慢启动容器的存活性的探针,该启动探针可以避免慢启动容器在启动运行之前被杀掉。更多信息,请参见Pod Lifecycle

    重要

    单击确定后,该应用将会被重启,请在业务较少的时间段进行。

配置应用生命周期管理

PostStart和PreStop配置

PostStart和PreStop的配置方式相同,均支持以下两种模式:

模式

描述

Exec

在容器中执行指定的命令。如果命令退出时返回码为0,判定为执行成功。

HttpGet

对容器上的指定端点执行HTTP GET请求,如果响应的状态码大于等于200且小于400,判定为执行成功。

HttpGet模式支持以下配置参数:

  • Host:HTTP请求主机地址,不设置时默认为Pod的IP地址。

  • Path:HTTP请求路径,默认值是/

  • Port:HTTP请求端口号。

  • Scheme:协议类型,支持HTTP和HTTPS协议,默认是HTTP。

  • HttpHeaders:自定义HTTP请求头。

下面以PostStart的配置为例,讲解如何在EDAS中配置应用的PostStart和PreStop容器生命周期钩子。

  • Exec模式

    例如,容器在创建成功后,执行以下命令。

    echo "container started"

    在EDAS中有以下两种配置方式:

    • 方式一:将命令拆分为不同的参数。该方式适合命令较短,参数较少的情况。

      FGHU

    • 方式二:启动一个Shell,在Shell中执行命令。该方式适合命令较长,参数较多的情况。

      srgd

  • HttpGet模式

    以PostStart的HttpGet钩子为例,在容器启动后会向http://example.com:8080/healthz地址发送GET请求。

    sregtd

    说明

    如果PostStart或PreStop钩子执行失败,容器会被自动重启,您可以在应用的变更记录中查询PostStart或PreStop执行失败的信息。

Liveness、Readiness和Startup配置

EDAS支持以下两种K8s容器探针:

容器探针

描述

LivenessProbe

用于检测容器是否存活。如果检测失败,K8s会自动杀死容器,然后根据重启策略重启容器。

ReadinessProbe

用于检测容器是否就绪可以接收流量。如果检测成功,K8s会将Pod添加到Pod所属的Service列表中,从而使Pod开始接收流量。

StartupProbe

用于检测慢启动容器是否存活。如果检测成功,将避免慢启动容器在启动之前被杀掉。

Liveness、Readiness和Startup探针支持以下三种模式:

模式

描述

Exec

在容器中执行指定的命令,如果命令退出时返回码为0则认为诊断成功。

HttpGet

对容器上的特定端点执行HTTP GET请求,如果响应的状态码大于等于200且小于400,则认为探测成功的。

TcpSocket

检查容器的IP地址上的指定的TCP端口是否打开,如果打开则认为探测成功。

Liveness、Readiness和Startup所有模式支持以下配置参数:

参数

描述

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就会终结容器,然后根据重启策略重启容器。

Livess

结果验证

配置应用生命周期钩子后,可通过以下示例步骤验证配置结果。

例如,在启动应用前,配置了Hello from the postStart handler的写入脚本。应用部署后,使用Webshell执行以下命令。

cat /usr/share/message

如果文件中存在Hello from the postStart handler,表示配置成功。

配置生命周期成功

EDAS容器服务K8s和Serverless K8s交流群

如果您在EDAS中使用容器服务K8s集群和Serverless K8s集群过程中有任何疑问或建议,请使用钉钉搜索钉钉群号23197114加入钉钉群进行反馈。