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

背景信息

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

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

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

  1. 登录EDAS控制台
  2. 登录EDAS控制台,在左侧导航栏中单击应用管理 > 应用列表,在顶部菜单栏选择地域并在页面上方选择命名空间,然后在应用列表页面左上角单击创建应用
  3. 应用基本信息页签选择集群类型和应用运行环境,然后在页面最下方单击下一步
    参数 描述
    集群类型 选择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环境中通过镜像部署多语言微服务应用
  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
    Liveness配置 一种探测容器状态的探针,探测应用是否处于健康状态。如果不健康,则删除并重建容器。更多信息,请参见Pod Lifecycle
    Readiness配置 一种探测容器状态的探针,探测应用是否启动完成并且处于正常服务状态。如果不正常,则更新容器的状态。更多信息,请参见Pod Lifecycle
  6. 完成设置后单击创建应用
  7. 应用创建完成页签确认应用基本信息应用配置应用高级设置等信息,确认完毕后单击确定创建应用
    在应用应用总览页面顶部提示信息中,单击查看详情,可在变更记录页面查看变更流程。应用部署需要几分钟,请您耐心等待。变更完成后在应用总览页面的基本信息区域查看实例的运行状态,如果显示为Pod运行中,说明应用部署成功。

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

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

  1. 登录EDAS控制台
  2. 在左侧导航栏中单击应用管理 > 应用列表,在顶部菜单栏选择地域并在页面上方选择命名空间,在集群类型下拉列表中选择容器服务/Serverless 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
    Liveness配置 一种探测容器状态的探针,探测应用是否处于健康状态。如果不健康,则删除并重建容器。更多信息,请参见Pod Lifecycle
    Readiness配置 一种探测容器状态的探针,探测应用是否启动完成并且处于正常服务状态。如果不正常,则更新容器的状态。更多信息,请参见Pod Lifecycle
    注意 单击确定后,该应用将会被重启,请在业务较少的时间段进行。

配置应用生命周期管理

PostStart和PreStop配置

PostStart和PreStop的配置方式相同,均支持以下两种模式:
  • Exec模式:在容器中执行指定的命令,如果命令退出时返回码为0则判定为执行成功。

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

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

  • Exec模式

    以容器在创建成功后执行以下命令为例:

    echo "container started"
    在EDAS中有以下两种配置方式:
    • 方式一:将命令拆分为不同的参数。

      这种方式适合命令比较短,参数比较少的情况。

      FGHU
    • 方式二:启动一个Shell,在Shell中执行命令。

      这种方式适合命令比较长,参数比较多的情况。

      srgd
  • HttpGet模式

    HttpGet模式支持以下配置参数:
    • Host:HTTP请求主机地址,不设置时默认为Pod的IP地址。
    • Path:HTTP请求路径,默认值是"/"。
    • Port:HTTP请求端口号。
    • Scheme:协议类型,支持HTTP和HTTPS协议,默认是HTTP。
    • HttpHeaders:自定义HTTP请求头。

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

    sregtd
    说明

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

Liveness和Readiness配置

EDAS支持以下两种K8s容器探针:
  • LivenessProbe:用于检测容器是否存活。如果检测失败,K8s会自动杀死容器,然后根据重启策略重启容器。

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

Liveness和Readiness探针支持以下三种模式:
  • Exec:在容器中执行指定的命令,如果命令退出时返回码为0则认为诊断成功。

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

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

Liveness和Readiness所有模式支持以下配置参数:
  • 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查看文件中是否存在Hello from the postStart handler,如果存在,那么表示配置成功。配置生命周期成功

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

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