【问题标题】:How to integrate healthcheck with docker swarm?如何将健康检查与 docker swarm 集成?
【发布时间】:2019-08-13 08:19:28
【问题描述】:

我正在尝试将 healthcheck 与 docker swarm 集成。我创建了自己的自定义健康检查 API 来监控容器的健康状况。 我在 yaml 文件中使用以下标签进行健康检查:

healthcheck:
      test: curl -X GET -sf https://${HOSTNAME}:port/module_name/health || exit 0
      interval: 30s
      timeout: 3s
      retries: 25 

在这里,我尝试了不同的 API 响应,例如 json 对象、200 响应、500 响应,还尝试了 0 和 1 返回值。但在每种情况下,docker 都无法理解我的健康 API 的响应。容器的行为完全取决于我在测试标签的退出代码中提到的任何值,如果我设置出口 0 容器总是健康的,或者设置出口 1 容器总是不健康的。

运行状况检查将如何理解我的自定义 API 响应? 例如:如果我的自定义 API 返回 500 或 1,那么 healthcheck 应该认为这是有问题的,需要将容器标记为不健康。

谁能帮助我了解如何在 docker-swarm 中使用 healthcheck?

【问题讨论】:

    标签: docker docker-swarm


    【解决方案1】:

    可以在一个脚本中包含所有的东西并使用它来调用它

    healthcheck:
        test: ["CMD", "python", "/path/script.py" , "YOUR_HOSTNAME" ]
    

    示例脚本:

    import requests
    import sys
    
    if len(sys.argv) < 2:
         print("Please supply the hostname")
         sys.exit(1)
    
    hostname = sys.argv[1]
    url = "http://%s/healthcheck" % hostname
    try:
        get_url = requests.get(url)
        response = get_url.text
        if response == "1":
            print("expect to get 0 but get 1 with response code %s" % get_url.status_code)
            sys.exit(1)
    except Exception as e:
        print(str(e))
        sys.exit(1)
    

    【讨论】:

    • 我使用的是 yaml 配置而不是 docker 文件。
    • 是的,这也应该有效,你的问题在哪里? ` 只需使用test: ["CMD", "python", "/path/script.py" ]
    • 每个模块有 10 到 12 个模块我无法创建脚本文件,因为主机名会发生变化,所以我不想成为硬编码主机名,所以我唯一的选择是 curl
    • 脚本应该有一个主机名作为参数,我仍然没有看到你遇到的问题。你可以做那个测试: ["CMD", "python", "/path/script.py" , "YOUR_HOSTNAME" ]
    • 如果我想运行 sh 文件,那么我需要在测试的第二个参数中提到你提到 python 的地方。
    猜你喜欢
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多