Octavia API 健康监控

Octavia API 提供了一个健康监控端点,可供外部负载均衡器用于管理 Octavia API 池。配置得当的情况下,健康监控端点将反映 Octavia API 的完整运行状态。

Octavia API 健康监控端点扩展了 OpenStack Oslo 中间件健康检查 库,以测试 Octavia Pecan API 框架和相关服务。

Oslo 健康检查查询

Oslo 中间件健康检查支持 HTTP “GET”“HEAD” 方法。

可以通过指定请求的可接受响应类型来自定义 Oslo 中间件健康检查的响应。

Oslo 中间件健康检查当前支持以下类型

  • text/plain

  • text/html

  • application/json

如果请求的类型不是上述类型之一,则默认设置为 text/plain。

注意

响应“原因”的内容将根据在 Oslo 中间件健康检查中启用的后端插件而有所不同。 仅依赖 HTTP 状态码进行 Octavia API 健康监控是最佳实践。

示例响应

text/plain 格式的通过输出示例,详细 为 False

$ curl -i http://198.51.100.10/load-balancer/healthcheck

  HTTP/1.1 200 OK
  Date: Mon, 16 Mar 2020 18:10:27 GMT
  Server: Apache/2.4.29 (Ubuntu)
  Content-Type: text/plain; charset=UTF-8
  Content-Length: 2
  x-openstack-request-id: req-9c6f4303-63a7-4f30-8afc-39340658702f
  Connection: close
  Vary: Accept-Encoding

  OK

text/plain 格式的失败输出示例,详细 为 False

$ curl -i http://198.51.100.10/load-balancer/healthcheck

  HTTP/1.1 503 Service Unavailable
  Date: Mon, 16 Mar 2020 18:42:12 GMT
  Server: Apache/2.4.29 (Ubuntu)
  Content-Type: text/plain; charset=UTF-8
  Content-Length: 36
  x-openstack-request-id: req-84024269-2dfb-41ad-bfda-b3e1da138bba
  Connection: close

text/html 格式的通过输出示例,详细 为 False

$ curl -i -H "Accept: text/html" http://198.51.100.10/load-balancer/healthcheck

  HTTP/1.1 200 OK
  Date: Mon, 16 Mar 2020 18:25:11 GMT
  Server: Apache/2.4.29 (Ubuntu)
  Content-Type: text/html; charset=UTF-8
  Content-Length: 239
  x-openstack-request-id: req-b212d619-146f-4b50-91a3-5da16051badc
  Connection: close
  Vary: Accept-Encoding

  <HTML>
  <HEAD><TITLE>Healthcheck Status</TITLE></HEAD>
  <BODY>

  <H2>Result of 1 checks:</H2>
  <TABLE bgcolor="#ffffff" border="1">
  <TBODY>
  <TR>

  <TH>
  Reason
  </TH>
  </TR>
  <TR>

      <TD>OK</TD>

  </TR>
  </TBODY>
  </TABLE>
  <HR></HR>

  </BODY>
  </HTML>

text/html 格式的失败输出示例,详细 为 False

$ curl -i -H "Accept: text/html" http://198.51.100.10/load-balancer/healthcheck

  HTTP/1.1 503 Service Unavailable
  Date: Mon, 16 Mar 2020 18:42:22 GMT
  Server: Apache/2.4.29 (Ubuntu)
  Content-Type: text/html; charset=UTF-8
  Content-Length: 273
  x-openstack-request-id: req-c91dd214-85ca-4d33-9fa3-2db81566d9e5
  Connection: close

  <HTML>
  <HEAD><TITLE>Healthcheck Status</TITLE></HEAD>
  <BODY>

  <H2>Result of 1 checks:</H2>
  <TABLE bgcolor="#ffffff" border="1">
  <TBODY>
  <TR>

  <TH>
  Reason
  </TH>
  </TR>
  <TR>

      <TD>The Octavia database is unavailable.</TD>

  </TR>
  </TBODY>
  </TABLE>
  <HR></HR>

  </BODY>
  </HTML>

application/json 格式的通过输出示例,详细 为 False

$ curl -i -H "Accept: application/json" http://192.51.100.10/load-balancer/healthcheck

  HTTP/1.1 200 OK
  Date: Mon, 16 Mar 2020 18:34:42 GMT
  Server: Apache/2.4.29 (Ubuntu)
  Content-Type: application/json
  Content-Length: 62
  x-openstack-request-id: req-417dc85c-e64e-496e-a461-494a3e6a5479
  Connection: close

  {
      "detailed": false,
      "reasons": [
          "OK"
      ]
  }

application/json 格式的失败输出示例,详细 为 False

$ curl -i -H "Accept: application/json" http://192.51.100.10/load-balancer/healthcheck

  HTTP/1.1 503 Service Unavailable
  Date: Mon, 16 Mar 2020 18:46:28 GMT
  Server: Apache/2.4.29 (Ubuntu)
  Content-Type: application/json
  Content-Length: 96
  x-openstack-request-id: req-de50b057-6105-4fca-a758-c872ef28bbfa
  Connection: close

  {
      "detailed": false,
      "reasons": [
          "The Octavia database is unavailable."
      ]
  }

详细示例响应

text/plain 格式的通过输出示例,详细 为 True

$ curl -i http://198.51.100.10/load-balancer/healthcheck

  HTTP/1.1 200 OK
  Date: Mon, 16 Mar 2020 18:10:27 GMT
  Server: Apache/2.4.29 (Ubuntu)
  Content-Type: text/plain; charset=UTF-8
  Content-Length: 2
  x-openstack-request-id: req-9c6f4303-63a7-4f30-8afc-39340658702f
  Connection: close
  Vary: Accept-Encoding

  OK

text/plain 格式的失败输出示例,详细 为 True

$ curl -i http://198.51.100.10/load-balancer/healthcheck

  HTTP/1.1 503 Service Unavailable
  Date: Mon, 16 Mar 2020 23:41:23 GMT
  Server: Apache/2.4.29 (Ubuntu)
  Content-Type: text/plain; charset=UTF-8
  Content-Length: 36
  x-openstack-request-id: req-2cd046cb-3a6c-45e3-921d-5f4a9e65c63e
  Connection: close

text/html 格式的通过输出示例,详细 为 True

$ curl -i -H "Accept: text/html" http://198.51.100.10/load-balancer/healthcheck

  HTTP/1.1 200 OK
  Date: Mon, 16 Mar 2020 22:11:54 GMT
  Server: Apache/2.4.29 (Ubuntu)
  Content-Type: text/html; charset=UTF-8
  Content-Length: 9927
  x-openstack-request-id: req-ae7404c9-b183-46dc-bb1b-e5f4e4984a57
  Connection: close
  Vary: Accept-Encoding

  <HTML>
  <HEAD><TITLE>Healthcheck Status</TITLE></HEAD>
  <BODY>
  <H1>Server status</H1>
  <B>Server hostname:</B><PRE>devstack2</PRE>
  <B>Current time:</B><PRE>2020-03-16 22:11:54.320529</PRE>
  <B>Python version:</B><PRE>3.6.9 (default, Nov  7 2019, 10:44:02)
  [GCC 8.3.0]</PRE>
  <B>Platform:</B><PRE>Linux-4.15.0-88-generic-x86_64-with-Ubuntu-18.04-bionic</PRE>
  <HR></HR>
  <H2>Garbage collector:</H2>
  <B>Counts:</B><PRE>(28, 10, 4)</PRE>
  <B>Thresholds:</B><PRE>(700, 10, 10)</PRE>
  <HR></HR>
  <H2>Result of 1 checks:</H2>
  <TABLE bgcolor="#ffffff" border="1">
  <TBODY>
  <TR>
  <TH>
  Kind
  </TH>
  <TH>
  Reason
  </TH>
  <TH>
  Details
  </TH>

  </TR>
  <TR>
  <TD>OctaviaDBCheckResult</TD>
      <TD>OK</TD>
  <TD></TD>
  </TR>
  </TBODY>
  </TABLE>
  <HR></HR>
  <H2>1 greenthread(s) active:</H2>
  <TABLE bgcolor="#ffffff" border="1">
  <TBODY>
  <TR>
      <TD><PRE> <...> </PRE></TD>
  </TR>
  </TBODY>
  </TABLE>
  <HR></HR>
  <H2>1 thread(s) active:</H2>
  <TABLE bgcolor="#ffffff" border="1">
  <TBODY>
  <TR>
      <TD><PRE> <...> </PRE></TD>
  </TR>
  </TBODY>
  </TABLE>
  </BODY>
  </HTML>

text/html 格式的失败输出示例,详细 为 True

$ curl -i -H "Accept: text/html" http://198.51.100.10/load-balancer/healthcheck

  HTTP/1.1 503 Service Unavailable
  Date: Mon, 16 Mar 2020 23:43:52 GMT
  Server: Apache/2.4.29 (Ubuntu)
  Content-Type: text/html; charset=UTF-8
  Content-Length: 10211
  x-openstack-request-id: req-39b65058-6dc3-4069-a2d5-8a9714dba61d
  Connection: close

  <HTML>
  <HEAD><TITLE>Healthcheck Status</TITLE></HEAD>
  <BODY>
  <H1>Server status</H1>
  <B>Server hostname:</B><PRE>devstack2</PRE>
  <B>Current time:</B><PRE>2020-03-16 23:43:52.411127</PRE>
  <B>Python version:</B><PRE>3.6.9 (default, Nov  7 2019, 10:44:02)
  [GCC 8.3.0]</PRE>
  <B>Platform:</B><PRE>Linux-4.15.0-88-generic-x86_64-with-Ubuntu-18.04-bionic</PRE>
  <HR></HR>
  <H2>Garbage collector:</H2>
  <B>Counts:</B><PRE>(578, 10, 4)</PRE>
  <B>Thresholds:</B><PRE>(700, 10, 10)</PRE>
  <HR></HR>
  <H2>Result of 1 checks:</H2>
  <TABLE bgcolor="#ffffff" border="1">
  <TBODY>
  <TR>
  <TH>
  Kind
  </TH>
  <TH>
  Reason
  </TH>
  <TH>
  Details
  </TH>

  </TR>
  <TR>
  <TD>OctaviaDBCheckResult</TD>
      <TD>The Octavia database is unavailable.</TD>
  <TD>Database health check failed due to: (pymysql.err.OperationalError) (2003, &#34;Can&#39;t connect to MySQL server on &#39;127.0.0.1&#39; ([Errno 111] Connection refused)&#34;)
  [SQL: SELECT 1]
  (Background on this error at: http://sqlalche.me/e/e3q8).</TD>
  </TR>
  </TBODY>
  </TABLE>
  <HR></HR>
  <H2>1 greenthread(s) active:</H2>
  <TABLE bgcolor="#ffffff" border="1">
  <TBODY>
  <TR>
      <TD><PRE> <...> </PRE></TD>
  </TR>
  </TBODY>
  </TABLE>
  <HR></HR>
  <H2>1 thread(s) active:</H2>
  <TABLE bgcolor="#ffffff" border="1">
  <TBODY>
  <TR>
      <TD><PRE> <...> </PRE></TD>
  </TR>
  </TBODY>
  </TABLE>
  </BODY>
  </HTML>

application/json 格式的通过输出示例,详细 为 True

$ curl -i -H "Accept: application/json" http://192.51.100.10/load-balancer/healthcheck

  HTTP/1.1 200 OK
  Date: Mon, 16 Mar 2020 22:05:26 GMT
  Server: Apache/2.4.29 (Ubuntu)
  Content-Type: application/json
  Content-Length: 9298
  x-openstack-request-id: req-d3913655-6e3f-4086-a252-8bb297ea5fd6
  Connection: close

  {
      "detailed": true,
      "gc": {
          "counts": [
              27,
              10,
              4
          ],
          "threshold": [
              700,
              10,
              10
          ]
      },
      "greenthreads": [
          <...>
      ],
      "now": "2020-03-16 22:05:26.431429",
      "platform": "Linux-4.15.0-88-generic-x86_64-with-Ubuntu-18.04-bionic",
      "python_version": "3.6.9 (default, Nov  7 2019, 10:44:02) \n[GCC 8.3.0]",
      "reasons": [
          {
              "class": "OctaviaDBCheckResult",
              "details": "",
              "reason": "OK"
          }
      ],
      "threads": [
          <...>
      ]
  }

application/json 格式的失败输出示例,详细 为 True

$ curl -i -H "Accept: application/json" http://192.51.100.10/load-balancer/healthcheck

  HTTP/1.1 503 Service Unavailable
  Date: Mon, 16 Mar 2020 23:56:43 GMT
  Server: Apache/2.4.29 (Ubuntu)
  Content-Type: application/json
  Content-Length: 9510
  x-openstack-request-id: req-3d62ea04-9bdb-4e19-b218-1a81ff7d7337
  Connection: close

  {
      "detailed": true,
      "gc": {
          "counts": [
              178,
              0,
              5
          ],
          "threshold": [
              700,
              10,
              10
          ]
      },
      "greenthreads": [
          <...>
      ],
      "now": "2020-03-16 23:58:23.361209",
      "platform": "Linux-4.15.0-88-generic-x86_64-with-Ubuntu-18.04-bionic",
      "python_version": "3.6.9 (default, Nov  7 2019, 10:44:02) \n[GCC 8.3.0]",
      "reasons": [
          {
              "class": "OctaviaDBCheckResult",
              "details": "(pymysql.err.OperationalError) (2003, \"Can't connect to MySQL server on '127.0.0.1' ([Errno 111] Connection refused)\")\n(Background on this error at: http://sqlalche.me/e/e3q8)",
              "reason": "The Octavia database is unavailable."
          }
      ],
      "threads": [
          <...>
      ]
  }

Oslo 健康检查插件

使用 Oslo 中间件健康检查实现的 Octavia API 健康监控端点,可以使用可选的后端插件进行扩展。 目前,Oslo 中间件库和 Octavia 都提供了插件。

Oslo 中间件提供的插件

Octavia 提供的插件

警告

某些插件可能有较长的超时时间。 配置健康检查查询以具有连接、读取和/或数据超时是最佳实践。 适当的值将取决于每个部署的云性能、插件数量等,因此各不相同。

启用 Octavia API 健康监控

要启用 Octavia API 健康监控端点,需要更新适当的配置文件设置并重新启动 Octavia API 进程。

首先启用端点

[api_settings]
healthcheck_enabled = True

当 healthcheck_enabled 设置为 False 时,对 /healthcheck 的查询将收到 HTTP 404 Not Found 响应。

然后,您需要选择所需的监控后端插件

[healthcheck]
backends = octavia_db_check

注意

如果未配置任何插件,Oslo 中间件健康检查的行为将发生变化。 它不仅不会运行任何测试,还会返回 204 结果而不是 200。

Octavia API 健康监控端点不需要 Keystone 令牌即可访问,允许外部负载均衡器查询该端点。 因此,我们建议您在外部负载均衡器上限制对其访问,以防止滥用。

作为额外的保护措施,API 会在可配置的时间段内缓存结果。 这意味着对健康监控端点的查询将返回缓存的结果,直到刷新间隔过期,此时健康检查插件将重新运行检查。

默认情况下,刷新间隔为五秒。 可以通过调整 Octavia 配置文件中的 healthcheck_refresh_interval 设置来配置此间隔

[api_settings]
healthcheck_refresh_interval = 5

您可以选择在 Oslo 中间件健康检查中启用“详细”模式。 这将导致 Oslo 中间件健康检查返回有关 API 实例的其他信息。 如果在健康检查期间引发了异常,它还将提供异常详细信息。 此设置在 Octavia API 中默认为 False 并禁用。

[healthcheck]
detailed = True

警告

启用“详细”设置将暴露有关 API 进程的敏感详细信息。 除非您确定它不会对您的 API 实例构成 安全风险,否则请勿启用此设置。 我们强烈建议您不要启用此设置。

使用 Octavia API 健康监控

可以通过 Octavia API 端点 上的 /healthmonitor 路径访问 Octavia API 健康监控端点。

例如,如果您的 Octavia(负载均衡器)端点在 Keystone 中是

https://10.21.21.78/load-balancer

您可以通过以下方式访问 Octavia API 健康监控端点

https://10.21.21.78/load-balancer/healthcheck

不需要 Keystone 令牌即可访问此端点。

Octavia 插件

octavia_db_check

octavia_db_check 插件验证 API 实例是否与 Octavia 数据库建立了有效连接。 它对数据库执行 SQL 无操作查询,‘SELECT 1;’。

注意

许多 OpenStack 服务和库,例如 oslo.db 和 sqlalchemy,也使用无操作查询 ‘SELECT 1;’ 进行健康检查。

octavia_db_check 的可能结果是

请求

结果

状态码

“原因”消息

GET

通过

200

OK

HEAD

通过

204

GET

失败

503

Octavia 数据库不可用。

HEAD

失败

503

在 Oslo 中间件健康检查以“详细”模式运行时,“details”字段将包含有关遇到的错误的更多信息,包括(如果可用)异常详细信息。