我們有一個在 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 的任務定義中輸入運行狀況檢查訊息,則這是正確的格式。
ECS/FARGATE 的無效文檔 https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_HealthCheck.html
答案2
Give 指令在語法上無效。
它應該是
[ "CMD-SHELL", "curl -f http://localhost/ || exit 1" ]
CMD
或CMD-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: