共用方式為

Service Fabric 探测

继续阅读本文之前,请熟悉 Service Fabric 应用程序模型Service Fabric 托管模型。 本文概述了如何使用清单文件定义运行情况探测和就绪情况探测。

运行情况探测

从版本 7.1 开始,Azure Service Fabric 支持容器化和非容器化应用程序的运行状态探测机制。 运行情况探测可帮助报告代码包的运行情况,如果代码包未快速响应,将重启。

就绪情况探测

从 8.2 开始,还支持就绪情况探测。 就绪情况探测用于确定代码包是否已准备好接受流量。 例如,如果容器需要很长时间来处理请求,或者请求队列已满,则代码包将无法再接受流量,因此将删除访问代码包的终结点。

就绪情况探测的行为如下:

  1. 容器/代码包实例启动
  2. 立即发布终结点
  3. 就绪情况探测开始运行
  4. 就绪情况探测最终达到失败阈值,并删除终结点使其不可用
  5. 实例最终准备就绪
  6. 就绪情况探测通知实例已准备就绪,并再次发布终结点
  7. 请求再次路由并成功,因为实例已准备好处理请求

注释

对于就绪情况探测,不会重启代码包,只是不发布终结点,因此副本/分区设置不受影响。

语义学

只能为每个代码包指定一个运行情况探测和一个就绪情况探测,并可以使用以下字段控制其行为:

  • type:用于指定探测类型是“运行情况”还是“就绪情况”。 支持的值为“Liveness”或“Readiness”

  • initialDelaySeconds:容器启动后开始执行探测的初始延迟秒数。 支持的值为 int。默认值为 0,最小值为 0。

  • timeoutSeconds:一个时间段(秒)。在此时间段过后,如果探测未成功完成,则会将其视为失败。 支持的值为 int。默认值为 1,最小值为 1。

  • periodSeconds:用于指定探测频率的时间段(秒)。 支持的值为 int。默认值为 10,最小值为 1。

  • failureThreshold:当达到此值时,容器将重启。 支持的值为 int。默认值为 3,最小值为 1。

  • successThreshold:失败后,若要将探测视为成功,则必须在使用此值时成功运行探测。 支持的值为 int。默认值为 1,最小值为 1。

在任何时刻,最多只能有对一个容器的一个探测。 如果探测未在“timeoutSeconds”中设置的时间内完成,请等待并计算到达“failureThreshold”的时间

此外,Service Fabric 还会引发有关“DeployedServicePackage”的以下探测运行状况报告

  • OK:对于“successThreshold”中设置的值,探测成功。

  • Error:容器重启之前,探测“failureCount”“failureThreshold”。 ==

  • Warning:

    • 探测失败,“failureCount”“failureThreshold”<。 此运行状况报告会一直进行下去,直至“failureCount”达到在“failureThreshold”或“successThreshold”中设置的值
    • 如果失败后成功,警告仍然存在,但会包含更新的续成功。

指定探测

可以在 ApplicationManifest.xml 文件中的“ServiceManifestImport”下指定探测。

探测可用于以下任一情况:

  • HTTP
  • TCP
  • Exec

HTTP 探测器

对于 HTTP 探测,Service Fabric 会向指定的端口和路径发送 HTTP 请求。 返回代码大于或等于 200 且小于 400 表示成功。

以下示例演示了如何指定 HTTP 运行情况探测:

  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Stateless1Pkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    <Policies>
      <CodePackagePolicy CodePackageRef="Code">
        <Probes>
          <Probe Type="Liveness" FailureThreshold="5" SuccessThreshold="2" InitialDelaySeconds="10" PeriodSeconds="30" TimeoutSeconds="20">
            <HttpGet Path="/" Port="8081" Scheme="http">
              <HttpHeader Name="Foo" Value="Val"/>
              <HttpHeader Name="Bar" Value="val1"/>
            </HttpGet>
          </Probe>
        </Probes>
      </CodePackagePolicy>
    </Policies>
  </ServiceManifestImport>

HTTP 探测有其他可设置的属性:

  • path:要在 HTTP 请求中使用的路径。

  • port:用于探测的端口。 此属性是必需的。 范围为 1 到 65535。

  • scheme:用于连接到代码包的方案。 如果将此属性设置为 HTTPS,则会跳过证书验证。 默认设置为 HTTP。

  • httpHeader:要在请求中设置的标头。 可以指定多个标头。

  • host:要连接到的主机 IP 地址。

注释

非容器化应用程序不支持端口。 对于此场景,请使用 EndpointRef="EndpointName" 属性。 将“EndpointName”替换为 ServiceManifest.xml 中定义的终结点的名称。

如果 EndpointRef 与 HTTP 终结点一起使用,则 scheme 属性是可选的,因为 HTTP 是默认值。 如果与 EndpointRef HTTPS 终结点一起使用,则必须将属性显式设置为 scheme “https”。 此外, CertificateRef 必须为 HTTPS 定义该属性,以保护与要探测的终结点的连接。

  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Stateless1Pkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    <Policies>
      <EndpointBindingPolicy EndpointRef="ServiceEndpoint" CertificateRef="your.cert.name" />
      <CodePackagePolicy CodePackageRef="Code">
        <Probes>
          <Probe Type="Readiness" FailureThreshold="10" SuccessThreshold="2" InitialDelaySeconds="600" PeriodSeconds="60" TimeoutSeconds="20">
            <HttpGet Path="/" EndpointRef="ServiceEndpoint" Scheme="https">
            </HttpGet>
          </Probe>
        </Probes>
      </CodePackagePolicy>
    </Policies>
  </ServiceManifestImport>

  <Certificates>
    <EndpointCertificate X509FindType="FindBySubjectName" X509FindValue="your.cert.name" Name="your.cert.name" />
  </Certificates>

TCP 探测器

对于 TCP 探测,Service Fabric 会尝试使用指定的端口在容器上打开一个套接字。 如果它可以建立连接,则探测会被视为成功。 下面的示例展示了如何指定使用 TCP 套接字的探测:

  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Stateless1Pkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    <Policies>
      <CodePackagePolicy CodePackageRef="Code">
        <Probes>
          <Probe Type="Liveness" FailureThreshold="5" SuccessThreshold="2" InitialDelaySeconds="10" PeriodSeconds="30" TimeoutSeconds="20">
            <TcpSocket Port="8081"/>
          </Probe>
        </Probes>
      </CodePackagePolicy>
    </Policies>
  </ServiceManifestImport>

Exec 探测

此探测将向容器发出一个 exec 命令,并等待命令完成。

注释

Exec 命令接受以逗号分隔的字符串。 以下示例中的命令适用于 Linux 容器。 如果要探测 Windows 容器,请使用“cmd”

  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Stateless1Pkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    <Policies>
      <CodePackagePolicy CodePackageRef="Code">
        <Probes>
          <Probe Type="Liveness" FailureThreshold="5" SuccessThreshold="2" InitialDelaySeconds="10" PeriodSeconds="30" TimeoutSeconds="20">
            <Exec>
              <Command>ping,-c,2,localhost</Command>
            </Exec>
          </Probe>        
       </Probes>
      </CodePackagePolicy>
    </Policies>
  </ServiceManifestImport>

后续步骤

请参阅以下文章,了解相关信息: