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

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

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

간략한 설명

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

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

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 CNI 플러그인이 있습니다.

​해결 방법

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

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 오류를 해결하려면 어떻게 해야 합니까?를 참조하십시오.

참고: 자세한 내용은 포드, 서비스, 헤드리스 서비스를 참조하십시오.

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

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

모든 트래픽을 자체적으로 활성화하는 것이 가장 좋습니다. 새 포트가 있는 새 포드가 생성될 때마다 보안 그룹 규칙을 변경하지 않아도 됩니다.

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

네트워크 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 플러그인이 있습니다.

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

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


이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?