Amazon EKS에서 HTTP 504 오류를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 2월 17일

Amazon Elastic Kubernetes Service(Amazon EKS)의 Classic Load Balancer 또는 Application Load Balancer를 통해 Kubernetes 서비스에 연결할 때 HTTP 504 오류가 발생합니다.

간략한 설명

HTTP 504 오류는 다음과 같은 원인일 수 있습니다.

  • 로드 밸런서가 대상에 연결을 설정했지만 유휴 제한 시간이 경과하기 전에 대상이 응답하지 않았습니다. 기본적으로 Classic Load Balancer 및 Application Load Balancer의 유휴 제한 시간은 60초입니다.
  • 연결 제한 시간(10초)이 만료되기 전에 로드 밸런서가 백엔드 대상에 연결을 설정하지 못했습니다.
  • 서브넷에 대한 네트워크 ACL(액세스 제어 목록)은 대상에서 휘발성 포트(1024-65535)의 로드 밸런서 노드로의 트래픽을 허용하지 않습니다.

​해결 방법

로드 밸런서의 유휴 제한 시간이 올바르게 설정되었는지 확인

1.    Classic Load Balancer 또는 Application Load Balancer에 대한 Amazon CloudWatch 지표를 검토합니다.

지연 시간 데이터 포인트가 현재 구성된 로드 밸런서 제한 시간 값과 동일하고 HTTPCode_ELB_5XX 지표에 데이터 포인트가 있는 경우 하나 이상의 요청이 시간 초과된 것입니다.

2.    HTTP 요청이 유휴 제한 시간 내에 완료될 수 있도록 로드 밸런서에 대한 유휴 제한 시간을 수정하거나 애플리케이션이 더 빠르게 응답하도록 구성합니다.

Classic Load Balancer에 대한 유휴 제한 시간을 수정하려면 service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout 주석을 포함하도록 서비스 정의를 업데이트합니다. 예제는 기타 ELB 주석을 참조하십시오.

Application Load Balancer에 대한 유휴 제한 시간을 수정하려면 alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds 주석을 포함하도록 인그레스 정의를 업데이트합니다. 예제는 인그레스 주석을 참조하십시오.

백엔드 인스턴스에 백엔드 연결 오류가 없는지 확인

로드 밸런서가 유휴 제한 시간 값에 도달하기 전에 백엔드 인스턴스가 로드 밸런서에 대한 TCP 연결을 닫으면 로드 밸런서가 요청을 이행하지 못할 수 있습니다.

1.    Classic Load Balancer에 대한 CloudWatch BackendConnectionErrors 지표와 Application Load Balancer에 대한 대상 그룹의 TargetConnectionErrorCount를 검토합니다.

2.    백엔드 작업자 노드 또는 Pod에서연결 유지 설정을 활성화하고 연결 유지 제한 시간을 로드 밸런서의 유휴 제한 시간보다 큰 값으로 설정합니다.

연결 유지 제한 시간이 유휴 제한 시간보다 작은지 확인하려면 Pod 또는 작업자 노드에서 연결 유지 값을 확인합니다. Pod 및 노드에 대한 다음 예제를 참조하십시오.

Pod의 경우:

$ kubectl exec your-pod-name -- sysctl \
    net.ipv4.tcp_keepalive_time \
    net.ipv4.tcp_keepalive_intvl \
    net.ipv4.tcp_keepalive_probes

노드의 경우:

$ sysctl \
    net.ipv4.tcp_keepalive_time \
    net.ipv4.tcp_keepalive_intvl \
    net.ipv4.tcp_keepalive_probes

백엔드 대상이 휘발성 포트 범위에서 로드 밸런서로부터 트래픽을 수신할 수 있는지 확인

로드 밸런서와 백엔드 대상 간에 데이터가 이동할 수 있도록 보안 그룹 및 네트워크 ACL을 구성해야 합니다. 예를 들어 이러한 대상은 로드 밸런서 유형에 따라 IP 주소 또는 인스턴스일 수 있습니다.

임시 포트 액세스를 위해 보안 그룹을 구성하려면 노드 및 Pod의 보안 그룹 이그레스(송신) 규칙을 로드 밸런서의 보안 그룹에 연결해야 합니다. 자세한 내용은 보안 그룹 작업규칙 추가 및 삭제를 참조하십시오.