ELB가 없는 ECS 작업의 상태 점검

ELB가 없는 ECS 작업의 상태 점검

ECS 클러스터에서 실행되는 Docker 컨테이너(Spring Boot)가 있습니다. Elastic Load Balancing 없이 실행합니다.

가동 중지 시간 없이 서비스를 업데이트하려고 하므로 새 작업이 실행되고 정상 상태가 되면 이전 작업이 중지됩니다. 작업 정의에 상태 확인을 추가하려고 시도했지만 작동을 거부했습니다. 나는 이러한 기본 상태 확인 명령을 시도했습니다.

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

전자는 HEALTHY 상태의 작업이 발생하고 후자는 상태 확인에 실패할 것으로 예상됩니다. 두 경우 모두 UNKNOWN 상태로 새 작업이 정상적으로 시작됩니다.

이것이 ELB를 사용하지 않는 것과 관련이 있나요? 문서가 그다지 좋지 않으며 Google 검색에서 유용한 정보가 반환되지 않았습니다.

답변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

주어진 명령은 구문상 유효하지 않습니다.

그것은해야한다

[ "CMD-SHELL", "curl -f http://localhost/ || exit 1" ]
  • CMD또는 CMD-SHELL- 컨테이너의 기본 셸을 사용하여 명령을 실행합니다.
  • curl -f http://localhost/ - 상태 확인을 검증하기 위해 컨테이너 내부에서 실행해야 하는 실제 명령입니다.
  • exit 1 - 컬 명령이 실패하면 쉘이 종료됩니다.

따라서 아래와 같이 명령을 변경해야 합니다.

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

echo hi는 내 예에서 건강 검사 명령입니다. "echo hi" 대신 명령을 실행할 수 있습니다. 컨테이너에서 성공적으로 실행되면 종료 상태 0을 반환해야 합니다.

답변3

ecs-cli를 사용하여 Fargate 서비스를 배포하는 경우 작업 정의에서 상태 확인을 지원하는 것으로 업그레이드해야 한다는 것을 알았습니다. 또한 CMD-SHELL을 사용할 필요가 없다는 사실도 발견했습니다. 실제로 CMD-SHELL을 추가하면 생성된 작업 정의의 결과 json에서 CMD-SHELL을 다른 CMD-SHELL로 래핑하여 중단됩니다(aws 콘솔에서 볼 수 있음). .

그래서 나에게 도움이 된 방법은 ecs-cli를 1.4.0에서 1.7.0으로 업그레이드한 다음 서비스 아래의 ecs-params.yml 파일에 상태 확인을 추가하는 것이었습니다.

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:

관련 정보