【问题标题】:Swarm healthcheck sets task to complete stateSwarm 健康检查将任务设置为完成状态
【发布时间】:2019-08-17 09:04:04
【问题描述】:

A 创建了一个 swarm 并在其上运行一个简单的 nodejs 应用程序。我本来想测试一下 healthcheck 在 swarm 环境中是如何工作的。我在撰写文件中设置了健康检查块,如下所示:

 healthcheck:
        test:  ["CMD", "curl", "-f", "http://localhost:3000/healthcheck"]
        interval: 1m
        timeout: 10s
        retries: 1
        start_period: 20s

nodejs源码很简单:

const express = require("express");
const os = require("os");

var fs = require('fs');
const app=express();
let health = "ok";

app.get("/", (req, res) => {
    var hostname = fs.readFileSync('/host/etc/hostname', 'utf8');

    var body =    " Hello from SwarmDemo (V1.0)" + "<br>";
    body = body + " container name: " + os.hostname()+ "<br>";
    body = body + " host name: " + hostname;

    res.send(body);
});

app.get("/healthcheck", (req, res) => {
    if (health == "ok") {
        res.send("OK")
    } else {
        res.status(503);
        res.send("");
    }
});

app.get("/kill", (req, res) => {
    var hostname = fs.readFileSync('/host/etc/hostname', 'utf8');

    health = "killed";
    res.send("Host " + hostname + " was killed!")
});

app.listen(3000, () => {
    console.log("Server is running on port 3000");
});

我希望 swarm 停止运行不正常的容器并启动一个新容器,但它没有。它会停止容器,但它只会将任务状态设置为完成并离开它,不会启动新的。

如果我检查停止的容器,它说 exitCode 为 0,这意味着据我所知,它已成功停止,但不是因为失败。我可以看到 healthchek 调用,它也返回了 503 HTTP 响应代码:

        "State": {
            "Status": "exited",
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2019-08-16T17:33:55.778937745Z",
            "FinishedAt": "2019-08-16T17:35:59.664281868Z",
            "Health": {
                "Status": "unhealthy",
                "FailingStreak": 1,
                "Log": [
                    {
                        "Start": "2019-08-16T19:34:55.779656075+02:00",
                        "End": "2019-08-16T19:34:56.648373763+02:00",
                        "ExitCode": 0,
                        "Output": "  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n\r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\r100     2  100     2    0     0     22      0 --:--:-- --:--:-- --:--:--    22\nOK"
                    },
                    {
                        "Start": "2019-08-16T19:35:56.658734507+02:00",
                        "End": "2019-08-16T19:35:57.549464299+02:00",
                        "ExitCode": 22,
                        "Output": "  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n\r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\ncurl: (22) The requested URL returned error: 503 Service Unavailable\n"
                    }
                ]
            }
        },

如果我将重启策略从 on-failure 修改为 any:

            restart_policy:
                condition: any
                delay: 5s
                max_attempts: 3
                window: 30s

它有效。它会停止容器并启动一个新容器。

我的问题是:当健康检查失败时,我如何强制 swarm 启动一个新容器。我应该发回 5xx HTTP 响应代码以外的其他内容吗?

我看过一些文章,其中 HTTP 调用被包装在一个脚本中。如果 HTTP 调用返回 200 以外的任何值,则返回 1,否则返回 0。

这会是唯一的解决方案吗?

【问题讨论】:

    标签: node.js docker swarm


    【解决方案1】:

    看来,如果 docker 没有问题地停止容器,状态将是一个完整的。这意味着,在这种情况下,它不关心健康状况。

    如果我在kill方法中停止节点进程:

    app.get("/kill", (req, res) => {
     process.exit(1);
    });
    

    或在健康检查中:

    app.get("/healthcheck", (req, res) => {
        if (health == "ok") {
            res.send("OK")
        } else {
            process.exit(1);
        }
    });
    

    它有效。状态将失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多