클러스터에서 Cloud NAT 패킷 손실 문제 해결


이 페이지에서는 VPC 기반 Google Kubernetes Engine(GKE) 비공개 클러스터Cloud NAT 패킷 손실 문제를 해결하는 방법을 보여줍니다.

VPC 기반 GKE 비공개 클러스터의 노드 VM에는 외부 IP 주소가 없습니다. 즉, 인터넷의 클라이언트가 노드의 IP 주소에 연결할 수 없습니다. 비공개 클러스터가 공개 연결되도록 Cloud NAT를 사용하여 외부 IP 주소와 포트를 할당할 수 있습니다.

노드 VM에 Cloud NAT의 외부 포트 및 IP 주소 할당이 부족해지면 패킷이 삭제됩니다. 이를 방지하기 위해서는 아웃바운드 패킷 비율을 줄이거나 사용 가능한 Cloud NAT 소스 IP 주소 및 포트의 할당을 늘릴 수 있습니다. 다음 섹션에서는 GKE 비공개 클러스터의 컨텍스트에서 Cloud NAT로부터 패킷 손실을 진단하고 문제 해결하는 방법을 설명합니다.

패킷 손실 진단

다음 섹션에서는 Cloud Logging을 사용하여 손실된 패킷을 로깅하고 Cloud Monitoring을 사용하여 패킷 손실 원인을 진단하는 방법을 설명합니다.

손실된 패킷 로깅

Cloud Logging에서 다음 쿼리를 사용하여 손실된 패킷을 로깅할 수 있습니다.

resource.type="nat_gateway"
resource.labels.region=REGION
resource.labels.gateway_name=GATEWAY_NAME
jsonPayload.allocation_status="DROPPED"

다음을 바꿉니다.

  • REGION: 클러스터가 있는 리전의 이름입니다.
  • GATEWAY_NAME: Cloud NAT 게이트웨이의 이름입니다.

이 명령어는 Cloud NAT 게이트웨이에서 삭제된 모든 패킷의 목록을 반환하지만 원인을 식별하지 않습니다.

패킷 손실 원인 모니터링

손실된 패킷의 원인을 식별하려면 Cloud Monitoring에서 측정항목 관찰자를 쿼리합니다. 패킷은 세 가지 이유 중 하나로 삭제됩니다.

  • OUT_OF_RESOURCES
  • ENDPOINT_INDEPENDENT_CONFLICT
  • NAT_ALLOCATION_FAILED

OUT_OF_RESOURCES 또는 ENDPOINT_ALLOCATION_FAILED 오류 코드로 인해 삭제된 패킷을 식별하려면 다음 쿼리를 사용합니다.

fetch nat_gateway
  metric 'router.googleapis.com/nat/dropped_sent_packets_count'
  filter (resource.gateway_name == GATEWAY_NAME)
  align rate(1m)
  every 1m
  group_by [metric.reason],
    [value_dropped_sent_packets_count_aggregate:
       aggregate(value.dropped_sent_packets_count)]

이러한 이유로 인해 삭제된 패킷을 발견한 경우 문제 해결 도움말을 보려면 리소스 부족으로 인해 패킷이 삭제됨엔드포인트 독립 충돌로 인해 패킷이 삭제됨을 참조하세요.

NAT_ALLOCATION_FAILED 오류 코드로 인해 삭제된 패킷을 확인하려면 다음 쿼리를 사용합니다.

fetch nat_gateway
  metric 'router.googleapis.com/nat/nat_allocation_failed'
  group_by 1m,
    [value_nat_allocation_failed_count_true:
       count_true(value.nat_allocation_failed)]
  every 1m

이 이유로 인해 삭제된 패킷을 확인한 경우 더 많은 IP 주소 할당 필요를 참조하세요.

Cloud NAT 구성 조사

이전 쿼리에서 빈 결과를 반환하고 GKE 포드가 외부 IP 주소와 통신할 수 없으면 다음 표를 사용하여 구성 문제를 해결합니다.

구성 문제 해결
서브넷의 기본 IP 주소 범위에만 적용되도록 구성된 Cloud NAT Cloud NAT가 서브넷의 기본 IP 주소 범위에 대해서만 구성된 경우 클러스터에서 외부 IP 주소로 전송된 패킷에 소스 노드 IP 주소가 있어야 합니다. 이 Cloud NAT 구성에 대한 설명은 다음과 같습니다.
  • 이러한 외부 IP 주소 대상에 IP 마스커레이딩이 적용되는 경우 포드가 외부 IP 주소로 패킷을 전송할 수 있습니다. ip-masq-agent를 배포할 때 nonMasqueradeCIDRs 목록에 대상 IP 주소 및 포트가 포함되지 않는지 확인합니다. 이러한 대상으로 전송되는 패킷은 먼저 소스 노드 IP 주소로 변환된 후 Cloud NAT에서 처리됩니다.
  • 포드가 이 Cloud NAT 구성을 사용해서 모든 외부 IP 주소에 연결할 수 있게 하려면 ip-masq-agent가 배포되었고 nonMasqueradeCIDRs 목록에 클러스터의 노드 및 포드 IP 주소 범위만 포함되었는지 확인합니다. 클러스터 외부의 대상에 전송된 패킷은 먼저 소스 노드 IP 주소로 변환된 후 Cloud NAT에서 처리됩니다.
  • 포드가 일부 외부 IP 주소로 패킷을 전송하지 못하도록 방지하려면 마스커레이딩되지 않도록 해당 주소를 명시적으로 차단해야 합니다. ip-masq-agent가 배포되면 차단하려는 외부 IP 주소를 nonMasqueradeCIDRs 목록에 추가합니다. 이러한 대상에 전송된 패킷은 노드의 포드 IP 주소 소스를 원래 상태로 둡니다. 포드 IP 주소는 클러스터 서브넷의 보조 IP 주소 범위에서 시작됩니다. 이 구성에서 Cloud NAT는 이 보조 범위에서 작동하지 않습니다.
포드 IP에 사용된 서브넷의 보조 IP 주소 범위에만 적용되도록 구성된 Cloud NAT

Cloud NAT가 클러스터의 포드 IP에 사용되는 서브넷의 보조 IP 주소 범위에 대해서만 구성된 경우 클러스터에서 외부 IP 주소로 전송된 패킷에 소스 포드 IP 주소가 있어야 합니다. 이 Cloud NAT 구성에 대한 설명은 다음과 같습니다.

  • IP 마스커레이드 에이전트를 사용하면 Cloud NAT에서 처리할 때 패킷의 소스 포드 IP 주소가 손실됩니다. 소스 포드 IP 주소를 유지하려면 nonMasqueradeCIDRs 목록에 대상 IP 주소 범위를 지정합니다. ip-masq-agent가 배포된 상태로 nonMasqueradeCIDRs 목록의 대상에 전송된 패킷은 소스 포드 IP 주소를 보존한 후 Cloud NAT에서 처리됩니다.
  • 포드가 이 Cloud NAT 구성을 사용해서 모든 외부 IP 주소에 연결할 수 있게 하려면 ip-masq-agent가 배포되었고 nonMasqueradeCIDRs 목록이 가능한 한 크게 설정되었는지 확인합니다(0.0.0.0/0은 모든 IP 주소 대상 지정). 모든 대상에 전송된 패킷은 소스 포드 IP 주소를 보존한 후 Cloud NAT에서 처리됩니다.

패킷 손실 줄이기

패킷 손실 원인을 진단했으면 다음 권장사항에 따라 향후 문제가 재발할 가능성을 줄여보세요.

  • 동적 포트 할당을 사용하고 VM당 최대 포트 수를 늘리도록 Cloud NAT 게이트웨이를 구성합니다.

  • 정적 포트 할당을 사용하는 경우 VM당 최소 포트 수를 늘립니다.

  • 애플리케이션의 아웃바운드 패킷 비율을 줄입니다. 애플리케이션이 같은 대상 IP 주소와 포트에 대한 아웃바운드 연결을 여러 번 수행하면 Cloud NAT가 할당된 NAT 소스 주소 및 소스 포트 튜플 수를 사용하여 대상에 수행할 수 있는 모든 연결을 빠르게 소비할 수 있습니다.

    대상에 대한 동시 연결 수 제한을 포함하여 Cloud NAT에서 NAT 소스 주소와 소스 포트를 사용하여 연결을 수행하는 방법에 대한 자세한 내용은 포트 및 연결을 참조하세요.

    애플리케이션에서 아웃바운드 연결 비율을 줄이려면 열린 연결을 재사용합니다. 연결을 재사용하는 일반적인 방법에는 연결 풀링, HTTP/2와 같은 프로토콜을 사용하는 연결 다중화 또는 여러 요청에 재사용되는 영구 연결 설정 등이 있습니다. 자세한 내용은 포트 및 연결을 참조하세요.

다음 단계

추가 지원이 필요하면 Cloud Customer Care에 문의하세요.