Amazon EKS 포드가 ‘포드 샌드박스 생성 실패’라는 오류와 함께 ContainerCreating 상태에서 멈추는 이유는 무엇인가요?

8분 분량
0

Amazon Elastic Kubernetes Service(Amazon EKS) 포드가 ‘포드 샌드박스 생성 실패’라는 오류와 함께 ContainerCreating 상태에서 멈췄습니다.

해결 방법

Amazon EKS가 네트워크 연결 오류와 함께 ContainerCreating 상태에서 멈추는 이유에는 여러 가지가 있습니다. 표시되는 오류 메시지에 따라 다음 문제 해결 단계를 사용합니다.

데몬에서 오류 응답: shim을 시작하지 못함: fork/exec /usr/bin/containerd-shim: 리소스를 일시적으로 사용할 수 없음: 알 수 없음

이 오류는 최대 PID 또는 최대 파일 수에 대해 정의된 커널 설정으로 인한 운영 체제 제한 때문에 발생합니다.

포드에 대한 정보를 가져오려면 다음 명령을 실행합니다.

$ kubectl describe pod example_pod

출력 예시:

kubelet, ip-xx-xx-xx-xx.xx-xxxxx-x.compute.internal  Failed to create pod sandbox: rpc error: code = Unknown desc = failed to start sandbox container for pod "example_pod": Error response from daemon: failed to start shim: fork/exec /usr/bin/containerd-shim: resource temporarily unavailable: unknown

문제를 임시로 해결하려면 노드를 다시 시작합니다.

이 오류를 해결하려면 다음을 수행합니다.

  • 노드 로그를 수집합니다.
  • Docker 로그에 ‘dockerd[4597]: runtime/cgo: pthread_create failed: 리소스를 일시적으로 사용할 수 없음’ 오류가 있는지 검토합니다.
  • Kubelet 로그에서 다음 오류를 검토합니다.
    • "kubelet[5267]: runtime: failed to create new OS thread (have 2 already; errno=11)"
    • "kubelet[5267]: runtime: may need to increase max user processes (ulimit -u)".
  • ps 명령을 실행하여 좀비 프로세스를 식별합니다. 출력에서 상태 Z와 함께 나열된 모든 프로세스가 좀비 프로세스입니다.

네트워크 플러그 인 cni가 포드 네트워크를 설정하지 못함: cmd 추가: IP 주소를 컨테이너에 할당하지 못함

이 오류는 컨테이너 네트워크 인터페이스(CNI)가 새로 프로비저닝된 포드에 IP 주소를 할당할 수 없음을 나타냅니다.

CNI가 새로 생성된 포드에 IP 주소를 제공하지 못하는 이유는 다음과 같습니다.

  • 인스턴스는 허용된 탄력적 네트워크 인터페이스(ENI) 최대치와 IP 주소를 사용했습니다.
  • Amazon Virtual Private Cloud(VPC) 서브넷의 IP 주소 수는 0입니다.

다음은 네트워크 인터페이스 IP 주소 소진의 예입니다.

Instance type    Maximum network interfaces    Private IPv4 addresses per interface    IPv6 addresses per interface
t3.medium        3                             6                                       6

이 예제에서 t3.medium 인스턴스에는 최대 3개의 네트워크 인터페이스가 있고 각 네트워크 인터페이스에는 최대 6개의 IP 주소가 있습니다. 첫 번째 IP 주소는 노드에 사용되며 할당할 수 없습니다. 이렇게 하면 네트워크 인터페이스에서 할당할 수 있는 17개의 IP 주소가 남습니다.

로컬 IP 주소 관리 대몬(daemon)(ipamD) 로그는 네트워크 인터페이스에 IP 주소가 부족할 때 다음 메시지를 표시합니다.

"ipamd/ipamd.go:1285","msg":"Total number of interfaces found: 3 "
"AssignIPv4Address: IP address pool stats: total: 17, assigned 17"
"AssignPodIPv4Address: ENI eni-abc123 does not have available addresses"

포드에 대한 정보를 가져오려면 다음 명령을 실행합니다.

$ kubectl describe pod example_pod

출력 예시:

Warning FailedCreatePodSandBox 23m (x2203 over 113m) kubelet, ip-xx-xx-xx-xx.xx-xxxxx-x.compute.internal (combined from similar events): Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" network for pod "provisioning-XXXXXXXXXXXXXXX": networkPlugin cni failed to set up pod "provisioning-XXXXXXXXXXXXXXX" network: add cmd: failed to assign an IP address to container

서브넷을 검토하여 서브넷에 사용 가능한 IP 주소가 부족한지 확인합니다. Amazon VPC 콘솔서브넷 섹션에서 각 서브넷에 사용 가능한 IP 주소를 볼 수 있습니다.

Subnet: XXXXXXXXXX
IPv4 CIDR Block 10.2.1.0/24   Number of allocated ips 254   Free address count 0

이 문제를 해결하려면 일부 워크로드를 축소하여 사용 가능한 IP 주소를 확보합니다. 추가 서브넷 용량을 사용할 수 있는 경우 노드를 확장하는 방법을 선택할 수 있습니다. 추가 서브넷을 생성할 수도 있습니다. 자세한 내용은 Amazon EKS에서 여러 CIDR 범위를 사용하려면 어떻게 해야 하나요?를 참조하세요. 새 CIDR 범위를 사용하여 서브넷 생성하기 섹션의 지침을 따릅니다.

dial tcp 127.0.0.1:50051을 다이얼하는 동안 오류 발생: connect: 연결 거부됨

이 오류는 aws-node 포드가 노드에서 실행되지 않아 aws-node 포드가 IPAM과 통신하지 못했음을 나타냅니다.

다음 명령을 실행하여 포드에 대한 정보를 얻습니다.

$ kubectl describe pod example_pod
$ kubectl describe pod/aws-node-XXXXX -n kube-system

출력 예:

Warning  FailedCreatePodSandBox  51s  kubelet, ip-xx-xx-xx-xx.ec2.internal  Failed create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" network for pod "example_pod": NetworkPlugin cni failed to set up pod "example_pod" network: add cmd: Error received from AddNetwork gRPC call: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp 127.0.0.1:50051: connect: connection refused", failed to clean up sandbox container
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" network for pod "example_pod": NetworkPlugin cni failed to teardown pod "example_pod" network: del cmd: error received from DelNetwork gRPC call: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp 127.0.0.1:50051: connect: connection refused"]

이 문제를 해결하려면 aws-node 포드가 배포되고 Running(실행 중) 상태인지 확인합니다.

kubectl get pods --selector=k8s-app=aws-node -n kube-system

참고: 클러스터 버전에 맞는 VPC CNI 플러그인 버전을 실행하고 있는지 확인합니다.

Liveness 및 Readiness 프로브 오류로 인해 포드가 Pending(보류) 상태일 수 있습니다. 호환성 표에 따라 권장되는 최신 VPC CNI 애드온 버전이 있는지 확인합니다.

다음 명령을 실행하여 aws-node 포드의 마지막 로그 메시지를 확인합니다.

kubectl -n kube-system exec -it aws-node-XXX-- tail -f /host/var/log/aws-routed-eni/ipamd.log | tee ipamd.log

이 문제는 Dockershim 마운트 포인트를 마운트하지 못하기 때문에 발생할 수도 있습니다. 다음은 이 문제가 발생할 때 받을 수 있는 예제 메시지입니다.

Getting running pod sandboxes from \"unix:///var/run/dockershim.sock\
Not able to get local pod sandboxes yet (attempt 1/5): rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: Error while dialing dial unix /var/run/dockershim.sock: connect: no such file or director

위 메시지는 포드가 var/run/dockershim.sock을 마운트할 수 없음을 나타냅니다.

이 문제를 해결하려면 다음을 시도합니다.

  • aws-node 포드를 다시 시작하여 마운트 지점을 다시 매핑합니다.
  • 노드를 코든하고 노드 그룹의 노드를 확장합니다.
  • Amazon VPC 네트워크 인터페이스를 지원되는 최신 클러스터 버전으로 업그레이드합니다.

CNI을 AWS Management Console에서 관리형 플러그인으로 추가한 경우 aws-node가 프로브에 실패합니다. 관리형 플러그인은 서비스 계정을 덮어씁니다. 그러나 서비스 계정은 선택한 역할로 구성되지 않습니다. 이 문제를 해결하려면 AWS Management Console에서 플러그인을 끄고 매니페스트 파일을 사용하여 서비스 계정을 생성합니다. 또는 현재 aws-node 서비스 계정을 편집하여 관리형 플러그인에 사용되는 역할을 추가합니다.

네트워크 플러그 인 cni가 포드 ‘my-app-xxbz-zz’ 네트워크를 설정하지 못함: Kubernetes 인자를 파싱하지 못함: 포드에 vpc.amazonaws.com/PrivateIPv4Address라는 레이블이 없음

다음과 같은 이유 중 하나로 인해 이 오류가 발생할 수 있습니다.

  • 포드가 제대로 실행되지 않습니다.
  • 포드에서 사용 중인 인증서가 성공적으로 생성되지 않았습니다.

이 오류는 Amazon EKS 클러스터에서 Windows 워크로드를 실행하는 데 필요한 Amazon VPC 승인 컨트롤러 웹후크와 관련이 있습니다. 이 웹후크는 kube-system 네임스페이스에서 포드를 실행하는 플러그 인입니다. 이 구성 요소는 Linux 노드에서 실행되며 Windows 노드에서 수신되는 포드에 대한 네트워킹을 허용합니다.

다음 명령어를 실행하여 영향을 받는 포드 목록을 가져옵니다.

kubectl get pods

출력 예시:

my-app-xxx-zz        0/1     ContainerCreating   0          58m   <none>            ip-XXXXXXX.compute.internal   <none>
my-app-xxbz-zz       0/1     ContainerCreating   0          58m   <none>

다음 명령을 실행하여 포드에 대한 정보를 얻습니다.

$ kubectl describe pod my-app-xxbz-zz

출력 예시:

Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" network for pod "<POD_ANME>": networkPlugin cni failed to set up pod "example_pod" network: failed to parse Kubernetes args: pod does not have label vpc.amazonaws.com/PrivateIPv4Address
Reconciler worker 1 starting processing node ip-XXXXXXX.compute.internal.
Reconciler checking resource vpc.amazonaws.com/PrivateIPv4Address warmpool size 1 desired 3 on node ip-XXXXXXX.compute.internal.
Reconciler creating resource vpc.amazonaws.com/PrivateIPv4Address on node ip-XXXXXXX.compute.internal.
Reconciler failed to create resource vpc.amazonaws.com/PrivateIPv4Address on node ip-XXXXXXX.compute.internal: node has no open IP address slots.

Windows 노드는 노드당 하나의 네트워크 인터페이스를 지원합니다. 각 Windows 노드는 네트워크 인터페이스당 사용 가능한 IP 주소에서 하나를 뺀 수만큼의 포드를 실행할 수 있습니다. 이 문제를 해결하려면 Windows 노드 수를 늘립니다.

IP 주소가 문제가 아닌 경우 Amazon VPC 승인 컨트롤러 포드 이벤트 및 로그를 검토합니다.

다음 명령을 실행하여 Amazon VPC 승인 컨트롤러 포드가 생성되었는지 확인합니다.

$ kubectl get pods -n kube-system  OR kubectl get pods -n kube-system | grep "vpc-admission"

출력 예시:

vpc-admission-webhook-5bfd555984-fkj8z     1/1     Running   0          25m

다음 명령을 실행하여 포드에 대한 정보를 얻습니다.

$ kubectl describe pod vpc-admission-webhook-5bfd555984-fkj8z -n kube-system

출력 예시:

  Normal  Scheduled  27m   default-scheduler  Successfully assigned kube-system/vpc-admission-webhook-5bfd555984-fkj8z to ip-xx-xx-xx-xx.ec2.internal
  Normal  Pulling    27m   kubelet            Pulling image "xxxxxxx.dkr.ecr.xxxx.amazonaws.com/eks/vpc-admission-webhook:v0.2.7"
  Normal  Pulled     27m   kubelet            Successfully pulled image "xxxxxxx.dkr.ecr.xxxx.amazonaws.com/eks/vpc-admission-webhook:v0.2.7" in 1.299938222s
  Normal  Created    27m   kubelet            Created container vpc-admission-webhook
  Normal  Started    27m   kubelet            Started container vpc-admission-webhook

다음 명령을 실행하여 포드 로그에서 구성 문제를 확인합니다.

$ kubectl logs vpc-admission-webhook-5bfd555984-fkj8z -n kube-system

출력 예시:

I1109 07:32:59.352298       1 main.go:72] Initializing vpc-admission-webhook version v0.2.7.
I1109 07:32:59.352866       1 webhook.go:145] Setting up webhook with OSLabelSelectorOverride: windows.
I1109 07:32:59.352908       1 main.go:105] Webhook Server started.
I1109 07:32:59.352933       1 main.go:96] Listening on :61800 for metrics and healthz
I1109 07:39:25.778144       1 webhook.go:289] Skip mutation for  as the target platform is .

위 출력은 컨테이너가 성공적으로 시작되었음을 나타냅니다. 그런 다음 포드는 vpc.amazonaws.com/PrivateIPv4Address 레이블을 애플리케이션 포드에 추가합니다. 하지만 애플리케이션 포드의 매니페스트에는 Windows 노드에서 포드가 스케줄링되도록 노드 셀렉터 또는 선호도가 포함되어야 합니다.

이 문제를 해결하기 위한 다른 옵션에는 다음을 확인하는 것이 포함됩니다.

  • kube-system 네임스페이스에 Amazon VPC 승인 컨트롤러 포드를 배포했습니다.
  • 로그나 이벤트가 만료된 인증서를 가리키지 않습니다. 인증서가 만료되고 Windows 포드가 컨테이너 생성 상태에서 멈춘 경우 포드를 삭제하고 다시 배포해야 합니다.
  • 시간 제한 혹은 DNS 관련 문제는 없습니다.

Amazon VPC 승인 컨트롤러를 생성하지 않은 경우 클러스터에 대한 Windows 지원을 켭니다.

중요: Amazon EKS에서는 Windows 노드 그룹을 지원하기 위해 Amazon VPC 승인 컨트롤러를 켤 필요가 없습니다. Amazon VPC 승인 컨트롤러를 켠 경우 데이터 영역에서 기존 Windows 지원을 제거합니다.


관련 정보

Amazon EKS 네트워킹

AWS 공식
AWS 공식업데이트됨 일 년 전