沒有 ELB 的 ECS 任務的運作狀況檢查

沒有 ELB 的 ECS 任務的運作狀況檢查

我們有一個在 ECS 叢集中運行的 Docker 容器(Spring Boot)。我們在沒有 Elastic Load Balancing 的情況下運行它。

我們希望在不停機的情況下更新服務,因此當新任務正常運作時,舊任務就會停止。我們一直在嘗試對任務定義添加健康檢查,但它拒絕工作。我已經嘗試過這些基本的健康檢查命令。

[ "CMD-SHELL","exit 0" ]
[ "CMD-SHELL","exit 1" ]

我希望前者會導致健康狀態為「健康」的任務,而後者則無法通過健康檢查。

這和我們不使用 ELB 有什麼關係嗎?文件不是很好,我的谷歌搜尋沒有返回任何有用的東西。

答案1

Raja 的答案和 Andrew 的 edite 的答案對於 ECS/FARGATE 來說略有偏差。它沒有括號和引號:

CMD-SHELL, curl -f http://localhost/ || exit 1

如果在 ECS 的任務定義中輸入運行狀況檢查訊息,則這是正確的格式。

有效文件https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#container_definition_healthcheck

ECS/FARGATE 的無效文檔 https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_HealthCheck.html

答案2

Give 指令在語法上無效。

它應該是

[ "CMD-SHELL", "curl -f http://localhost/ || exit 1" ]
  • CMDCMD-SHELL- 使用容器的預設 shell 運行命令
  • curl -f http://localhost/ - 需要在容器內執行以驗證運行狀況檢查的實際命令。
  • exit 1 - 如果curl指令失敗那麼它將退出shell

所以你應該像下面這樣改變你的命令。

[ "CMD-SHELL", "echo hi || exit 1" ]

echo hi 是我範例中的健康檢查命令,您可以執行任何命令而不是“echo hi”,如果在容器中成功運行,則該命令應返回退出狀態 0。

答案3

如果您使用 ecs-cli 部署 Fargate 服務,我發現您必須升級到支援任務定義中的執行狀況檢查的服務。我還發現不需要使用CMD-SHELL —— 事實上,當您添加它時,它會中斷,在生成的任務定義的結果json 中用另一個CMD-SHELL 包裝您的CMD-SHELL(如aws 控制台中所示) 。

所以對我有用的是將 ecs-cli 從 1.4.0 升級到 1.7.0,然後在服務下的 ecs-params.yml 檔案中新增 healthcheck:

task_definition:
  ecs_network_mode: awsvpc
  task_role_arn: arn:aws:iam::........
  task_execution_role: arn:aws:iam::........
  task_size:
    cpu_limit: 2048
    mem_limit: 4GB
  services:
    foo:
      healthcheck:
        command: ps cax | grep "[p]ython"
        interval: 30s
        timeout: 10s
        retries: 2
      essential: true

答案4

例如,如果您的“連接埠對映”適用8000:8000於“ECS EC2”或8000 tcp“ECS Fargate”,則“HEALTHCHECK”的“指令”為:

CMD-SHELL, curl -f http://localhost:8000/ || exit 1

在這種情況下,不要忘記8000之後。http://localhost:

相關內容