내용으로 건너뛰기

Amazon EKS용 Amazon VPC CNI 플러그인 문제를 해결하려면 어떻게 해야 합니까?

6분 분량
0

Amazon Elastic Kubernetes Service(Amazon EKS)용 Amazon VPC CNI 플러그인과 관련된 문제를 해결하고 싶습니다.

해결 방법

Amazon EKS에서 Amazon Virtual Private Cloud(Amazon VPC) 컨테이너 네트워크 인터페이스(CNI) 플러그인이 올바르게 작동하려면 포드에 적절한 IP 주소가 할당되어야 합니다. VPC CNI 플러그인 문제를 해결하려면 다음 구성을 확인하십시오.

  • 워커 노드의 IAM 역할에 연결되는 AmazonEKS_CNI_Policy를 포함한 AWS Identity and Access Management(IAM) 권한 또는 서비스 계정 IAM 역할을 통해 제공하는 IAM 권한
  • 워커 노드에서 연결할 수 있는 Amazon EKS API 서버 엔드포인트
  • Amazon Elastic Compute Cloud(Amazon EC2), Amazon Elastic Container Registry(Amazon ECR) 및 Amazon Simple Storage Service(Amazon S3)의 API 엔드포인트에 대한 네트워크 액세스
  • 서브넷의 충분한 가용 IP 주소
  • aws-node 포드가 준비 상태로 전환되려면 성공적으로 실행되어야 하는 kube-proxy
  • Amazon EKS 클러스터 버전과 일치하는 Kube-proxy 버전VPC CNI 버전

VPC CNI 플러그인 문제를 해결하려면 다음 문제 해결 단계를 완료하십시오.

aws-node 포드가 실행 중 상태인지 확인

VPC CNI 플러그인은 kube-system 네임스페이스에서 aws-node라는 DaemonSet 포드로 실행됩니다. 클러스터의 각 워커 노드에서 하나의 aws-node 포드가 실행됩니다.

  1. aws-node 포드가 각 워커 노드에서 실행 중인지 확인하려면 다음 명령을 실행합니다.

    kubectl get pods -n kube-system -l k8s-app=aws-node -o wide

    참고: k8s-app=aws-node를 레이블 선택기로 바꾸십시오.

  2. 명령 출력에 RESTARTS 수가 0보다 큰 것으로 표시되면 컨테이너 및 오류 메시지의 상태를 확인하십시오. 다음 describe 명령을 실행합니다.

    kubectl describe pod aws-node-pod-name -n kube-system

    참고: aws-node-pod-name을 AWS 노드 포드의 이름으로 바꾸십시오.

  3. aws-node 포드가 ContainerCreating 상태 및 describe 출력에서 멈춘 경우 이벤트에 다음 오류 메시지가 표시됩니다.

    "Error while dialing dial tcp 127.0.0.1:50051: connect: connection refused"

    그런 다음 Amazon EKS 포드가 "Failed to create pod sandbox" 오류와 함께 ContainerCreating 상태에서 멈춘 이유는 무엇입니까?의 단계를 완료합니다.

  4. aws-node 포드의 로그를 보려면 다음 logs 명령을 실행합니다.

    kubectl logs daemonset/aws-node -n kube-system

    -또는-

    kubectl logs aws-node-pod-name -n kube-system

    참고: aws-node-pod-name을 aws-node 포드 이름으로 바꾸십시오.

  5. 워커 노드에서 VPC CNI 플러그인의 로그를 확인합니다. 워커 노드에 로그인한 다음 /var/log/aws-routed-eni/ 디렉터리로 이동합니다. plugin.logipamd.log 파일 이름을 찾은 다음 해당 파일의 로그를 확인합니다.

  6. 워커 노드가 Amazon EKS 클러스터의 API 서버 엔드포인트에 도달할 수 있는지 확인합니다. 워커 노드에 로그인하려면 SSH 또는 AWS Systems Manager Session Manager를 사용하고 다음 명령을 실행합니다.

    curl -ivk https://eks-api-server-endpoint-url

    참고: eks-api-server-endpoint-url을 Amazon EKS API 서버 엔드포인트 URL로 바꾸십시오.

VPC CNI 버전 확인

VPC CNI 플러그인 버전이 최신 상태이고 Amazon EKS 클러스터 버전과 호환되는지 확인하십시오.

현재 VPC CNI 버전을 확인하려면 다음 명령을 실행합니다.

kubectl describe daemonset aws-node -n kube-system | grep Image | cut -d "/" -f 2

현재 버전을 GitHub 웹 사이트의 Amazon VPC CNI plugin releases에 나와 있는 사용 가능한 최신 버전과 비교합니다.

버전이 오래된 경우 VPC CNI 플러그인을 최신 버전으로 업데이트하십시오. 자세한 내용은 Amazon VPC CNI(Amazon EKS 추가 기능) 업데이트를 참조하십시오.

네트워크 구성 및 요구 사항 확인

Amazon EKS 클러스터의 보안 그룹 및 서브넷 구성이 올바르게 설정되었는지 확인합니다.

보안 그룹 규칙 확인

보안 그룹은 컨트롤 플레인과 데이터 플레인 간의 연결을 허용해야 합니다.

워커 노드에 사용자 지정 보안 그룹을 사용하는 경우 포트를 확인하십시오. 최소 노드 그룹 규칙은 컨트롤 플레인 보안 그룹에서 들어오는 포트 10250 인바운드 및 컨트롤 플레인 보안 그룹으로 나가는 아웃바운드 443을 허용합니다. 자세한 내용은 네트워크 보안을 참조하십시오.

포드 보안 그룹 기능이 활성화된 경우 보안 그룹 제한에 도달했는지 확인하십시오. 보안 그룹의 탄력적 네트워크 인터페이스당 한도에 도달하면 포드 네트워킹 구성이 실패할 수 있습니다. 자세한 내용은 Amazon VPC 할당량을 참조하십시오.

필요한 보안 그룹 규칙에 대한 자세한 내용은 클러스터의 Amazon EKS 보안 그룹 요구 사항 보기를 참조하십시오.

서브넷 구성 확인

Amazon VPC ID의 각 서브넷에서 사용 가능한 IP 주소를 나열하려면 다음 명령을 실행합니다.

aws ec2 describe-subnets —filters "Name=vpc-id,Values= VPCID" | jq '.Subnets[] | .SubnetId + "=" + "\(.AvailableIpAddressCount)"'

서브넷에 대한 워커 노드의 네트워크 액세스 제어 목록 규칙이 Amazon EKS API 서버와의 통신을 허용하는지 확인합니다. 네트워크 ACL을 구성하는 방법에 대한 자세한 내용은 네트워크 액세스 제어 목록으로 서브넷 트래픽 제어를 참조하십시오.

컨트롤 플레인 서브넷에 사용 가능한 사용 가능한 IP 주소가 충분한지 확인합니다. 각 컨트롤 플레인 서브넷에는 Amazon EKS에서 사용할 수 있는 IP 주소가 6개 이상 있어야 합니다. 하지만 AWS는 각 서브넷에 16개 이상의 IP 주소를 권장합니다. 포드가 실행되는 서브넷의 AvailableIpAddressCount는 0보다 커야 합니다. 자세한 내용은 서브넷 요구 사항 및 고려 사항을 참조하십시오.

kube-proxy 포드가 실행 중 상태인지 확인

올바른 네트워크 연결을 위해서는 kube-proxy 포드가 실행 중이어야 합니다.

kube-proxy가 실행되고 있는지 확인하려면 다음 명령을 실행합니다.

kubectl get pods -n kube-system -l k8s-app=kube-proxy

모든 kube-proxy 포드가 실행 중 상태인지 확인합니다. kube-proxy가 실행되고 있지 않다면 포드 로그에 오류가 있는지 확인하십시오.

kubectl logs -n kube-system POD-NAME

참고: POD-NAME을 kube-proxy 포드 이름으로 바꾸십시오.

WARM_PREFIX_TARGET 값 확인

접두사 위임이 켜져 있는 경우 로그 파일에서 다음과 같은 오류 메시지를 확인합니다.

"Error: Setting WARM_PREFIX_TARGET = 0 is not supported while WARM_IP_TARGET/MINIMUM_IP_TARGET is not set. Please configure either one of the WARM_{PREFIX/IP}_TARGET or MINIMUM_IP_TARGET env variable"

오류를 해결하려면 WARM_PREFIX_TARGET1보다 크거나 같은 값으로 설정해야 합니다. 접두사 위임이 켜져 있고 WARM_PREFIX_TARGET0으로 설정된 경우 값을 1 이상으로 업데이트하십시오.

kubectl set env daemonset aws-node -n kube-system WARM_PREFIX_TARGET=1

서브넷의 예약된 공간 확인

접두사 위임이 켜져 있는 경우 서브넷에 /28 IP CIDR 블록이 충분한지 확인하십시오. 16개의 IP 주소가 모두 연속적이어야 합니다. 접두사 위임이 켜져 있는 경우 로그 파일에서 다음과 같은 오류 메시지를 확인합니다.

"InsufficientCidrBlocks"

오류를 해결하려면 새 서브넷을 만든 후 새 서브넷에서 포드를 실행합니다. Amazon EC2 서브넷 CIDR 예약을 사용하여 할당된 접두사가 있는 서브넷 내의 공간을 예약합니다. 자세한 내용은 서브넷 CIDR 예약을 참조하십시오.

사용자 지정 네트워크 구성 확인

Amazon EKS 클러스터에 사용자 지정 네트워킹이 활성화되어 있는지 확인하려면 다음 명령을 실행합니다.

kubectl describe pod -n kube-system $(kubectl get pods -n kube-system -l k8s-app=aws-node -o jsonpath='{.items[0].metadata.name}')

이 변수를 True로 설정하면 사용자 지정 네트워킹이 활성화됩니다.

사용자 지정 네트워킹이 활성화된 경우 클러스터의 네트워킹 요구 사항에 맞게 ENIConfig CRD를 올바르게 구성해야 합니다. 다음 명령을 실행하여 목록을 검색하고 모든 ENIConfig CRD를 검사합니다.

kubectl get ENIConfig -A -o yaml

특정 ENIConfig를 설명하려면 다음 명령을 실행합니다.

kubectl describe ENIConfig eni-config-name

참고: Eni-config-name을 ENIConfig 이름으로 바꾸십시오.

각 ENIConfig에서 각 가용 영역에 대한 서브넷 및 보안 그룹 구성이 올바른지 확인합니다.

ENIConfig에 지정된 서브넷이 워커 노드의 가용 영역과 일치하는지 확인합니다.

사용자 지정 네트워킹에 대한 자세한 내용은 사용자 지정 네트워킹을 사용하여 대체 서브넷에 포드 배포를 참조하십시오.

롤백을 방지하기 위한 충돌 해결 구성

AWS Cloud Development Kit(AWS CDK), AWS CloudFormation 또는 eksctl을 관리형 추가 기능과 함께 사용하는 경우 롤백을 방지하기 위해 충돌 해결 방법을 정의하십시오.

올바른 메서드는 NONE, OVERWRITE 또는 PRESERVE입니다.

  • 메서드가 정의되지 않은 경우 기본값은 NONE입니다. 시스템이 충돌을 감지하면 CloudFormation 스택에 대한 업데이트가 롤백되고 변경 사항이 적용되지 않습니다.
  • 추가 기능에 대한 기본 구성을 설정하려면 overwrite 메서드를 사용합니다. 자체 관리형 추가 기능에서 Amazon EKS 관리형 추가 기능으로 이동할 때는 OVERWRITE를 사용해야 합니다.
  • WARM_IP_TARGET 또는 사용자 지정 네트워킹과 같은 사용자 정의 구성을 사용할 때는 PRESERVE 메서드를 사용합니다.

충돌 해결 방법 설정에 대한 자세한 내용은 Amazon EKS 추가 기능 업데이트를 참조하십시오.

AWS 공식업데이트됨 3달 전