Azure 容器应用运行状况探测允许容器应用运行时定期检查容器应用的状态。
您可以仅使用 TCP 或 HTTP(S) 来设置探针。
Azure 容器应用支持以下探测:
| 探测 | 说明 |
|---|---|
| 启动 | 检查应用程序是否已成功启动。 此检查独立于存活探测,并在应用程序的初始启动阶段运行。 |
| 运行情况 | 检查应用程序是否仍在运行且有响应。 |
| 就绪 | 检查副本是否已准备好处理传入请求。 |
有关 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 会导致每个探测类型产生不同的结果。
默认配置
如果您启用入口,而您未定义每种类型的探测,则门户会自动将以下默认探测添加到主应用容器中,但不包括 GPU 负载配置文件(专用和消耗)。 门户不会自动将默认探测添加到 Sidecar 容器。
| 探测类型 | 默认值 |
|---|---|
| 启动 | 协议:TCP 端口:入口目标端口 超时:3 秒 时间段:1 秒 初始延迟:1 秒 成功阈值:一个 故障阈值:240 |
| 运行情况 | 协议:TCP 端口:入口目标端口 |
| 就绪 | 协议:TCP 端口:入口目标端口 超时:5 秒 时间段:5 秒 初始延迟:3 秒 成功阈值:一个 故障阈值:48 |
如果在 多个修订模式下运行容器应用,则在部署修订后,请等待就绪情况探测指示成功,然后再将流量转移到该修订。 在单一修订模式下,一旦就绪情况探测返回成功状态,流量就会自动转移。
如果有任何副本未通过就绪情况探测检查,则修订状态将显示为运行不正常,即便修订中的所有其他副本都正常也是如此。 容器应用将重启相关副本,直到副本再次正常或超出失败阈值。 如果超出失败阈值,请尝试重启修订,但可能意味着未正确配置修订。
如果应用需要较长的启动时间,请调整探测设置,以防止容器在准备就绪之前重新启动(或标记为不正常)。 自定义探测配置有助于确保应用有足够的时间启动,而无需触发不必要的重启。
以下示例演示如何配置实时性和就绪性探测以延长启动时间。
"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
}]