포드가 Amazon EKS의 다른 포드에 연결되지 않는 이유는 무엇입니까?

최종 업데이트 날짜: 2022년 2월 11일

포드가 Amazon Elastic Kubernetes Service(Amazon EKS)의 다른 포드에 연결되지 않습니다.

간략한 설명

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생할 경우 AWS CLI의 최신 버전을 사용하고 있는지 확인하세요.

포드를 다른 포드와 연결할 수 없는 경우 다음 오류가 발생할 수 있습니다(애플리케이션에 따라 다름).

작업자 노드의 보안 그룹이 노드 간 통신을 허용하지 않는 경우:

curl: (7) Failed to connect to XXX.XXX.XX.XXX port XX: Connection timed out

DNS가 작동하지 않는 경우:

Error: RequestError: send request failed caused by: Post  dial tcp: i/o timeout

DNS가 작동하지만 포드 연결 문제가 여전히 존재하는 경우:

Error: RequestError: send request failed caused by: Post  dial tcp 1.2.3.4.5:443: i/o timeout

포드가 서비스를 통해 노출되지 않은 상태에서 포드에 대한 DNS를 확인하려고 시도하는 경우:

kubectl exec -it busybox -- nslookup nginx 
Server:   10.100.0.10
Address:  10.100.0.10:53
** server can't find nginx.default.svc.cluster.local: NXDOMAIN
*** Can't find nginx.svc.cluster.local: No answer
*** Can't find nginx.cluster.local: No answer
*** Can't find nginx.ap-southeast-2.compute.internal: No answer
*** Can't find nginx.default.svc.cluster.local: No answer
*** Can't find nginx.svc.cluster.local: No answer
*** Can't find nginx.cluster.local: No answer
*** Can't find nginx.ap-southeast-2.compute.internal: No answer

이러한 오류를 해결하려면 다음을 확인하여 환경이 올바르게 설정되었는지 확인하세요.

  • Kubernetes에 대한 네트워킹 요구 사항에 부합합니다(의도적인 NetworkPolicy 제외).
  • 포드가 올바르게 DNS를 사용하여 서로 통신합니다.
  • 보안 그룹이 Amazon EKS 지침을 충족합니다.
  • 포드에 대한 보안 그룹이 포드가 서로 통신할 수 있도록 허용합니다.
  • 네트워크 ACL(액세스 제어 목록)이 연결을 거부하지 않습니다.
  • 서브넷에 Amazon Virtual Private Cloud(Amazon VPC) 내에서 통신하기 위한 로컬 경로가 있습니다.
  • 서브넷에 사용 가능한 IP 주소가 충분히 있습니다.
  • 포드가 예약되어 있고 RUNNING 상태입니다.
  • 권장 버전의 Kubernetes용 Amazon VPC Container Network Interface(CNI) 플러그인이 있습니다.

해결 방법

Kubernetes에 대한 네트워킹 요구 사항에 부합합니다(의도적인 NetworkPolicy 제외).

Kubernetes 웹 사이트에서 Kubernetes 네트워킹 요구 사항을 충족하는지 확인합니다.

기본적으로 포드는 격리되지 않습니다. 포드는 모든 소스로부터의 트래픽을 허용합니다. 포드는 포드를 선택하는 NetworkPolicy를 통해 격리됩니다.

참고: NetworkPolicy 구성은 Amazon EKS에 Calico 설치를 참조하세요.

포드가 올바르게 DNS를 사용하여 서로 통신합니다.

먼저 서비스를 통해 포드를 노출해야 합니다. 그렇지 않으면 포드에 DNS 이름이 표시되지 않으며 특정 IP 주소로만 포드에 연결할 수 있습니다.

예를 들면 다음과 같습니다.

$ kubectl run nginx --image=nginx --replicas=5 -n web
deployment.apps/nginx created

$ kubectl expose deployment nginx --port=80 -n web
service/nginx exposed

$ kubectl get svc -n web
NAME    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
nginx   ClusterIP   10.100.94.70   <none>        80/TCP    2s

# kubectl exec -ti busybox -n web -- nslookup nginx
Server:    10.100.0.10
Address 1: 10.100.0.10 ip-10-100-0-10.ap-southeast-2.compute.internal
Name:      nginx
Address 1: 10.100.94.70 ip-10-100-94-70.ap-southeast-2.compute.internal

출력은 nginx 서비스의 DNS 이름을 확인할 때 ClusterIP 10.100.94.70이 반환되었음을 보여줍니다.

포드가 여전히 DNS를 확인하지 못할 경우 Amazon EKS와 관련된 DNS 오류를 해결하려면 어떻게 해야 합니까?를 참조하세요.

참고: 자세한 내용은 Kubernetes 웹 사이트의 포드, 서비스헤드리스 서비스를 참조하세요.

보안 그룹이 Amazon EKS 지침을 충족합니다.

작업자 노드의 보안 그룹에서 허용되는 트래픽을 설정하는 인바운드 규칙을 생성합니다. 작업자 노드가 노드 간 통신에 사용하는 모든 프로토콜 또는 포트에 대한 인바운드 규칙을 생성합니다.

작업자 노드의 보안 그룹에 대한 모든 트래픽을 활성화하는 것이 가장 좋습니다. 새 포트가 있는 새 포드가 생성될 때마다 보안 그룹 규칙을 변경하지 않아도 됩니다.

자세한 내용은 Amazon EKS 클러스터 보안 그룹 고려 사항을 참조하세요.

포드에 대한 보안 그룹이 포드가 서로 통신할 수 있도록 허용합니다.

포드에 대한 보안 그룹 또는 CNI 사용자 지정 네트워킹을 사용하는 경우 포드에 보안 그룹을 할당할 수 있습니다. 이 시나리오에서는 보안 그룹이 포드 간 통신을 올바르게 허용하는지 확인합니다.

네트워크 ACL이 연결을 거부하지 않습니다.

1.    Amazon EKS 클러스터와 VPC CIDR 간의 트래픽 흐름이 네트워크 ACL에서 원활한지 확인합니다.

2.    (선택 사항) VPC에 보안 계층을 추가하려면 보안 그룹과 유사한 규칙을 사용하여 네트워크 ACL을 설정하는 것이 좋습니다.

서브넷에 VPC 내에서 통신하기 위한 로컬 경로가 있습니다.

서브넷에 VPC 내 통신에 대한 기본 경로가 있는지 확인합니다.

서브넷에 사용 가능한 IP 주소가 충분히 있습니다.

지정된 서브넷에 교차 계정 탄력적 네트워크 인터페이스 및 포드에 사용할 수 있는 IP 주소가 충분히 있는지 확인합니다.

자세한 내용은 VPC IP 주소 지정을 참조하세요.

사용 가능한 IP 주소를 확인하려면 다음 AWS CLI 명령을 실행하세요.

$ aws ec2 describe-subnets --subnet-id YOUR-SUBNET-ID --query 'Subnets[0].AvailableIpAddressCount'

포드가 예약되어 있고 RUNNING 상태입니다.

포드가 예약되어 있고 RUNNING 상태인지 확인합니다.

포드 상태에 관한 문제를 해결하려면 Amazon EKS에서 포드 상태 문제를 해결하려면 어떻게 해야 합니까?를 참조하세요.

권장 버전Kubernetes용 Amazon VPC CNI 플러그 인을 실행하지 않는 경우 최신 버전으로 업그레이드하는 것이 좋습니다.

권장 버전이 있지만 문제가 있는 경우 Amazon EKS에 대한 kubelet 또는 CNI 플러그인 문제를 해결하려면 어떻게 해야 합니까?를 참조하세요.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?