Azure 容器应用中的运行状况探测
Azure 容器应用运行状况探测可让容器应用运行时定期检查容器应用的状态。
你可以以独占方式使用 TCP 或 HTTP(S) 设置探测器。
容器应用支持以下探测:
探测 | 说明 |
---|---|
启动 | 检查应用程序是否已成功启动。 此检查独立于运行情况探测,并在应用程序的初始启动阶段执行。 |
运行情况 | 检查应用程序是否仍在运行且有响应。 |
就绪 | 检查以确定副本是否已准备好处理传入请求。 |
有关 Azure 容器应用中支持的探测规范的完整列表,请参阅 Azure REST API 规范。
HTTP 探测器
HTTP 探测器允许你实现自定义逻辑,以便在报告正常状态之前检查应用程序依赖项的状态。
将运行状况探测终结点配置为使用大于或等于 200
和小于 400
的 HTTP 状态代码进行响应,以指示成功。 超出此范围的任何其他响应代码都表示失败。
下面的示例演示如何在 JavaScript 中实现活跃度终结点。
const express = require('express');
const app = express();
app.get('/liveness', (req, res) => {
let isSystemStable = false;
// check for database availability
// check filesystem structure
// etc.
// set isSystemStable to true if all checks pass
if (isSystemStable) {
res.status(200); // Success
} else {
res.status(503); // Service unavailable
}
})
TCP 探测器
TCP 探测等待与服务器建立连接以指示成功。 如果探测无法与应用程序建立连接,则探测将失败。
限制
- 每个容器只能添加每种探测器类型中的一个。
- 不支持
exec
探测器。 - 端口值必须是整数;不支持命名端口。
- 不支持 gRPC。
示例
以下代码列表显示了如何为容器定义运行状况探测。
...
占位符表示省略的代码。 有关完整的 ARM 模板详细信息,请参阅容器应用 ARM 模板 API 规范。
{
...
"containers":[
{
"image":"nginx",
"name":"web",
"probes": [
{
"type": "liveness",
"httpGet": {
"path": "/health",
"port": 8080,
"httpHeaders": [
{
"name": "Custom-Header",
"value": "liveness probe"
}]
},
"initialDelaySeconds": 7,
"periodSeconds": 3
},
{
"type": "readiness",
"tcpSocket": {
"port": 8081
},
"initialDelaySeconds": 10,
"periodSeconds": 3
},
{
"type": "startup",
"httpGet": {
"path": "/startup",
"port": 8080,
"httpHeaders": [
{
"name": "Custom-Header",
"value": "startup probe"
}]
},
"initialDelaySeconds": 3,
"periodSeconds": 3
}]
}]
...
}
可选的 failureThreshold
设置定义在执行失败的情况下,容器应用尝试执行探测的次数。 尝试次数超过 failureThreshold
会导致每个探测类型产生不同的结果。
默认配置
如果启用了入口,则以下默认探测会自动添加到主应用容器(如果未为每个类型定义任何探测)。
探测类型 | 默认值 |
---|---|
启动 | 协议:TCP 端口:入口目标端口 超时:3 秒 时间段:1 秒 初始延迟:1 秒 成功阈值:1 故障阈值:240 |
就绪 | 协议:TCP 端口:入口目标端口 超时:5 秒 时间段:5 秒 初始延迟:3 秒 成功阈值:1 故障阈值:48 |
运行情况 | 协议:TCP 端口:入口目标端口 |
如果应用需要较长的时间才能启动(这在 Java 中很常见),则通常需要自定义探测,以便容器不会崩溃。
下面的示例演示如何配置运行情况和就绪情况探测以延长启动时间。
"probes": [
{
"type": "liveness",
"failureThreshold": 3,
"periodSeconds": 10,
"successThreshold": 1,
"tcpSocket": {
"port": 80
},
"timeoutSeconds": 1
},
{
"type": "readiness",
"failureThreshold": 48,
"initialDelaySeconds": 3,
"periodSeconds": 5,
"successThreshold": 1,
"tcpSocket": {
"port": 80
},
"timeoutSeconds": 5
}]