Perché il mio pod Amazon EKS è bloccato nello stato ContainerCreating e restituisce l'errore "failed to create pod sandbox" (Impossibile creare la sandbox (ambiente di sperimentazione) del pod)?

Ultimo aggiornamento: 09/01/2023

Il mio pod Amazon Elastic Kubernetes Service (Amazon EKS) è bloccato nello stato ContainerCreating e restituisce l'errore "failed to create pod sandbox".

Risoluzione

I pod Amazon EKS potrebbero essere bloccati nello stato ContainerCreating e restituire un errore di connettività di rete per diversi motivi. Utilizza i seguenti passaggi per la risoluzione dei problemi in base al messaggio di errore visualizzato.

Error response from daemon: failed to start shim: fork/exec /usr/bin/containerd-shim: resource temporarily unavailable: unknown (Risposta di errore dal daemon: impossibile avviare shim: fork/exec /usr/bin/containerd-shim: risorsa temporaneamente non disponibile: sconosciuta)

Questo errore si verifica a causa di una limitazione del sistema operativo causata dalle impostazioni del kernel definite per il numero massimo di PID (ID processo) o il numero massimo di file.

Esegui il seguente comando per ottenere informazioni sul tuo pod:

$ kubectl describe pod example_pod

Output di esempio:

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

Per risolvere temporaneamente il problema, riavvia il nodo.

Per risolvere il problema, procedi come segue:

  • Raccogli i log del nodo.
  • Esamina i log Docker per l’errore "dockerd[4597]: runtime/cgo: pthread_create failed: Risorsa temporaneamente non disponibile".
  • Esamina il log Kubelet per i seguenti errori:
    • "kubelet [5267]: runtime: impossibile creare un nuovo thread del sistema operativo (ne ho già 2; errno=11)"
    • "kubelet [5267]: runtime: potrebbe essere necessario aumentare il numero massimo di processi utente (ulimit -u)".
  • Identifica i processi zombie eseguendo il comando ps. Tutti i processi elencati con lo stato Z nell'output sono processi zombie.

Network plugin cni failed to set up pod network: add cmd: failed to assign an IP address to container (Il plug-in di rete cni non è riuscito a configurare la rete del pod: aggiungi commando: impossibile assegnare un indirizzo IP al container)

Questo errore indica che l'interfaccia di rete del container (Container Network Interface, CNI) non può assegnare un indirizzo IP per il pod appena sottoposto a provisioning.

Di seguito sono riportati i motivi per cui la CNI non fornisce un indirizzo IP al pod appena creato:

  • L'istanza ha utilizzato il numero massimo consentito di interfacce di rete elastiche e indirizzi IP.
  • Le sottoreti Amazon Virtual Private Cloud (Amazon VPC) hanno un numero di indirizzi IP pari a zero.

Di seguito è riportato un esempio di esaurimento degli indirizzi IP dell'interfaccia di rete:

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

In quest’esempio, l'istanza t3.medium ha un massimo di 3 interfacce di rete e ciascuna interfaccia di rete ha un massimo di 6 indirizzi IP. Il primo indirizzo IP viene utilizzato per il nodo e non è assegnabile. Rimangono 17 indirizzi IP che l'interfaccia di rete può allocare.

I log del daemon di gestione degli indirizzi IP locali (ipamD) mostrano il seguente messaggio quando l'interfaccia di rete esaurisce gli indirizzi 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"

Esegui il seguente comando per ottenere informazioni sul tuo pod:

$ kubectl describe pod example_pod

Output di esempio:

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

Esamina la sottorete per identificare se ha esaurito gli indirizzi IP liberi. Puoi visualizzare gli indirizzi IP disponibili per ogni sottorete nella console Amazon VPC nella sezione Subnets (Sottoreti).

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

Per risolvere questo problema, riduci parte del carico di lavoro per liberare gli indirizzi IP disponibili. Se è disponibile una capacità di sottorete aggiuntiva, è possibile ridimensionare il nodo. È inoltre possibile creare una sottorete aggiuntiva. Per ulteriori informazioni, consulta Come si utilizzano più intervalli CIDR con Amazon EKS? Segui le istruzioni nella sezione Crea sottoreti con un nuovo intervallo CIDR.

Errore durante la composizione del dial tcp 127.0.0.1:50051: connessione: connessione rifiutata

Questo errore indica che il pod aws-node non è riuscito a comunicare con IPAM perché il pod aws-node non è stato eseguito sul nodo.

Esegui i seguenti comandi per ottenere informazioni sul pod:

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

Output di esempio:

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"]

Per risolvere questo problema, verifica che il pod aws-node sia distribuito e sia nello stato Running (In esecuzione):

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

Nota: assicurati di utilizzare la versione corretta del plug-in CNI VPC per la versione cluster.

I pod potrebbero essere nello stato In sospeso a causa di errori di probe di attività e di idoneità. Assicurati di disporre dell'ultima versione del componente aggiuntivo VPC CNI consigliata in base alla tabella di compatibilità.

Esegui il seguente comando per visualizzare l'ultimo messaggio di log dal pod aws-node:

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

Il problema potrebbe verificarsi anche perché il punto di montaggio Dockershim non riesce a montare. Di seguito è riportato un messaggio di esempio che è possibile ricevere quando si verifica questo problema:

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

Questo messaggio indica che il pod non è stato in grado di montare var/run/dockershim.sock.

Per risolvere il problema, completa la seguente operazione:

  • Riavvia il pod aws-node per rimappare il punto di montaggio.
  • Cordona il nodo e ridimensiona i nodi nel gruppo di nodi.
  • Aggiorna l'interfaccia di rete Amazon VPC all'ultima versione del cluster supportata.

Se la CNI è stata aggiunta come plug-in gestito nella Console di gestione AWS, allora aws-node non supera i probe. I plug-in gestiti sovrascrivono l'account del servizio. Tuttavia, l'account del servizio non è configurato con il ruolo selezionato. Per risolvere questo problema, disattiva il plug-in dalla Console di gestione AWS e crea l'account del servizio utilizzando un file manifesto. In alternativa, modifica l'account del servizio aws-node corrente per aggiungere il ruolo utilizzato nel plug-in gestito.

Il plug-in di rete cni non è riuscito a configurare la rete del pod "my-app-xxbz-zz": impossibile analizzare gli argomenti di Kubernetes: il pod non ha l'etichetta vpc.amazonaws.com/PrivateIPv4Address

Potresti ricevere questo errore per i seguenti motivi:

  • Il pod non funziona correttamente.
  • Il certificato utilizzato dal pod non è stato creato correttamente.

Questo errore si riferisce al webhook del controller di ammissione Amazon VPC necessario sui cluster Amazon EKS per eseguire carichi di lavoro Windows. Il webhook è un plug-in che esegue un pod nello spazioe dei nomi kube-system. Il componente funziona su nodi Linux e consente il collegamento in rete per i pod in ingresso sui nodi Windows.

Esegui il seguente comando per ottenere l'elenco dei pod interessati:

kubectl get pods

Output di esempio:

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>

Esegui il seguente comando per ottenere informazioni sul pod:

$ kubectl describe pod my-app-xxbz-zz

Output di esempio:

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.

I nodi Windows supportano un'interfaccia di rete per nodo. Ogni nodo Windows può eseguire tanti pod quanti sono gli indirizzi IP disponibili per interfaccia di rete, meno uno. Per risolvere questo problema, aumenta il numero di nodi Windows.

Se il problema non sono gli indirizzi IP, esamina l'evento e i log del pod del controller di ammissione Amazon VPC.

Esegui il seguente comando per confermare che il pod del controller di ammissione Amazon VPC è stato creato:

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

Output di esempio:

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

Esegui il seguente comando per ottenere informazioni sul pod:

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

Output di esempio:

  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

Esegui il seguente comando per controllare i log del pod per scoprire eventuali problemi di configurazione:

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

Output di esempio:

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 .

L'output precedente mostra che il container è stato avviato correttamente. Il pod aggiunge quindi l'etichetta vpc.amazonaws.com/PrivateIPv4Address al pod dell'applicazione. Tuttavia, il manifesto per il pod dell'applicazione deve contenere un selettore di nodi o un'affinità in modo che il pod sia pianificato sui nodi Windows.

Altre opzioni per risolvere il problema includono la verifica di quanto segue:

  • Il pod del controller di ammissione Amazon VPC è stato distribuito nello spazio dei nomi kube-system.
  • I log o gli eventi non fanno riferimento a un certificato scaduto. Se il certificato è scaduto e i pod Windows sono bloccati nello stato Container creating (Creazione del container), è necessario eliminare e ridistribuire i pod.
  • Non ci sono timeout o problemi relativi al DNS.

Se non crei il controller di ammissione Amazon VPC, attiva il supporto di Windows per il tuo cluster.

Importante: Amazon EKS non richiede l'attivazione del controller di ammissione Amazon VPC per supportare i gruppi di nodi Windows. Se hai attivato il controller di ammissione Amazon VPC, rimuovi il supporto Windows precedente dal tuo piano dati.


Questo articolo è stato utile?


Hai bisogno della fattura o di supporto tecnico?