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, "Can't connect to MySQL server on '127.0.0.1' ([Errno 111] Connection refused)")
[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”字段将包含有关遇到的错误的更多信息,包括(如果可用)异常详细信息。