Salta al contenuto

Come posso risolvere i problemi che riscontro con il componente aggiuntivo CNI di Amazon VPC per Amazon EKS?

7 minuti di lettura
0

Desidero utilizzare il componente aggiuntivo CNI (Container Network Interface) di Amazon Virtual Private Cloud (Amazon VPC) sui miei cluster Amazon Elastic Kubernetes Service (Amazon EKS). Tuttavia, ricevo errori.

Risoluzione

Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Se il nodo worker non è pronto perché il componente aggiuntivo CNI di Amazon VPC non è stato inizializzato, ricevi un messaggio di errore simile al seguente esempio:

"container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized"

Per accertare la presenza del problema, esegui questo comando:

kubectl describe node node_name

Nota: sostituisci node_name con il nome del nodo. Nell'output compare il messaggio di errore cni plugin no initialized.

Per risolvere il problema, intraprendi le seguenti azioni.

Verifica di aver installato il componente aggiuntivo CNI di Amazon VPC

Se mancano i Pod aws-node nel cluster, ricevi un messaggio di errore simile al seguente esempio nei log containerd:

"cni config load failed: no network config found in /etc/cni/net.d: cni plugin not initialized: failed to load cni config"

Per risolvere il problema, installa il componente aggiuntivo CNI di Amazon VCP.

Verifica eventuali problemi relativi alle autorizzazioni IAM

Per utilizzare il componente aggiuntivo CNI di Amazon VPC, utilizza la policy gestita AWS Identity and Access Management (AWS IAM) AmazonEKS_CNI_Policy. Oppure, se utilizzi una policy personalizzata, assicurati che includa le seguenti autorizzazioni:

 "ec2:AssignPrivateIpAddresses",
 "ec2:AttachNetworkInterface",
 "ec2:CreateNetworkInterface",
 "ec2:DeleteNetworkInterface",
 "ec2:DescribeInstances",
 "ec2:DescribeTags",
 "ec2:DescribeNetworkInterfaces",
 "ec2:DescribeInstanceTypes",
 "ec2:DescribeSubnets",
 "ec2:DetachNetworkInterface",
 "ec2:ModifyNetworkInterfaceAttribute",
 "ec2:UnassignPrivateIpAddresses"
 "ec2:CreateTags"

Per identificare le autorizzazioni IAM mancanti, controlla i log del daemon L-IPAM (IPAMD) nella directory host /var/log/aws-routed-eni/ipamd.log. Se il componente aggiuntivo CNI Amazon VPC non ha un'autorizzazione IAM richiesta, ricevi un messaggio di errore simile al seguente esempio:

{"level":"error","ts":"2023-11-18T01:08:34.083Z","caller":"aws-k8s-agent/main.go:28","msg":"Initialization failure: ipamd init: failed to retrieve attached ENIs info: UnauthorizedOperation: You are not authorized to perform this operation. User: arn:aws:sts::XXXXXXXXXXXXXXXXXXXX:assumed-role/rolename is not authorized to perform: ec2:DescribeNetworkInterfaces because no identity-based policy allows the ec2:DescribeNetworkInterfaces action\n\tstatus code: 403, request id: request id"}

Il precedente esempio di messaggio di errore mostra che il componente aggiuntivo richiede l'autorizzazione ec2:DescribeNetworkInterfaces.

Se non hai accesso diretto al nodo worker, controlla i Pod aws-node sul nodo worker. Per identificare il Pod aws-node sul nodo worker, esegui questo comando:

kubectl describe node node_name

Nota: sostituisci node_name con il nome del nodo. Cerca il nome del Pod aws-node nella sezione Non-terminated Pods dell'output.

Quindi esegui questo comando per visualizzare i dettagli sul Pod aws-node:

kubectl describe pod pod-name -n kube-system

Nota: sostituisci pod-name con il nome del Pod aws-node.

Nell'output, controlla Event per informazioni sulle autorizzazioni mancanti.

Esempio di output:

Type Reason Age From Message
---- ------ ---- ---- -------
Warning MissingIAMPermissions 105s (x2 over 105s) aws-node Unauthorized operation: failed to call ec2:DescribeNetworkInterfaces due to missing permissions. Please refer https://github.com/aws/amazon-vpc-cni-k8s/blob/master/docs/iam-policy.md to attach relevant policy to IAM role in the event section you can able to see the error message also you can check the AWS cloud trail event for the particular instance by filtering the cloudtrail with username and provide the instanceID there.

Oppure utilizza AWS CloudTrail per verificare la presenza di eventi specifici. Ad esempio, controlla il nome utente e l'ID dell'istanza per la chiamata API DescribeNetworkInterfaces in modo da stabilire se è stata eseguita.

Verifica la presenza di problemi di rete

Il componente aggiuntivo CNI di Amazon VPC deve raggiungere l'endpoint del server API e l'endpoint Amazon Elastic Compute Cloud (Amazon EC2) quando viene eseguito. Se una delle connessioni ha esito negativo, il componente aggiuntivo non può essere inizializzato e i nodi passano allo stato NotReady.

Per controllare il messaggio di errore specifico, esamina i log di IPAMD nella directory host /var/log/aws-routed-eni/ipamd.log. Assicurati che l'esecuzione dei Pod kube-proxy e coreDNS avvenga senza errori.

Controlla le versioni dei componenti aggiuntivi

È consigliabile aggiornare i componenti principali alla versione più recente. Se la versione del componente aggiuntivo non corrisponde alla versione del cluster Kubernetes, il componente aggiuntivo non può essere inizializzato. Assicurati che la versione del componente aggiuntivo sia compatibile con la versione del cluster Kubernetes.

Risolvi gli errori del componente aggiuntivo CNI di Amazon VPC

Per identificare gli errori del componente aggiuntivo, connettiti utilizzando SSH al nodo worker in cui il componente aggiuntivo non riesce ad assegnare l'indirizzo IP. Quindi controlla i messaggi di errore eventualmente presenti nei log di IPAMD (file /var/log/aws-routed-eni/ipamd.log).

Failed to assign ip error

L'errore Failed to assign ip si verifica quando il componente aggiuntivo CNI di Amazon VPC non è in grado di assegnare indirizzi IP ai Pod pianificati nei nodi worker. Per identificare l'errore, puoi anche cercare l'evento AssignPrivateIpAddresses nella pagina della cronologia degli eventi di CloudTrail.

Per determinare se la sottorete assegnata non ha indirizzi IP disponibili, esegui questo comando AWS CLI describe-subnets:

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

Nota: sostituisci VPCID con l'ID del tuo VPC.

L'errore Failed to assign ip può verificarsi anche quando imposti le variabili di ambiente WARM_ENI_TARGET, WARM_IP_TARGET o MINIMUM_IP_TARGET su un valore troppo basso. Assicurati che l'intervallo CIDR della sottorete sia sufficientemente ampio e abbia allocazioni di indirizzi IP sufficienti per il caso d'uso. Per ulteriori informazioni, consulta WARM_ENI_TARGET, WARM_IP_TARGET and MINIMUM_IP_TARGET (WARM_ENI_TARGET, WARM_IP_TARGET e MINIMUM_IP_TARGET) sul sito web di GitHub.

Per controllare i valori delle variabili di ambiente, visualizza i dettagli del Pod eseguendo questo comando:

kubectl describe pod pod-name -n kube-system

Nota: sostituisci pod-name con il nome del Pod aws-node.

Puoi aggiornare le variabili di ambiente nel DaemonSet aws-node:

env:
  - name: WARM_ENI_TARGET
    value: "1"
  - name: WARM_IP_TARGET
    value: "5"
  - name: MINIMUM_IP_TARGET
    value: "25"

Oppure aggiornale eseguendo questo comando:

kubectl set env ds aws-node -n kube-system WARM_ENI_TARGET=1 WARM_IP_TARGET=5 MINIMUM_IP_TARGET=25

Se utilizzi la modalità di delega del prefisso e non utilizzi un intervallo di sottorete dedicato per i Pod, l'esito negativo del componente aggiuntivo potrebbe essere causato dalla frammentazione della sottorete. Il componente aggiuntivo deve assegnare all'interfaccia di rete un intervallo continuo di prefissi /28 per IPv4 e /80 per IPv6. Per ulteriori informazioni sulla delega dei prefissi, consulta ENABLE_PREFIX_DELEGATION sul sito web di GitHub.

Non puoi verificare direttamente la frammentazione della sottorete. Controlla invece se hai ancora più di 16 indirizzi IP disponibili nell'intervallo CIDR della sottorete. Se disponi di un numero sufficiente di indirizzi IP e continui a ricevere spesso l'errore Failed to assign ip, il problema è in genere legato alla frammentazione della sottorete. Per risolverlo, è consigliabile utilizzare reti personalizzate con delega di prefissi per definire sottoreti dedicate per i Pod. Per ulteriori informazioni, consulta AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG sul sito web di GitHub.

Errore Failed to get pod ENI config

Se utilizzi AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG per attivare reti personalizzate ma non crei una risorsa EniConfig, ricevi un messaggio di errore simile al seguente esempio:

"{"level":"error","ts":"","caller":"ipamd/ipamd.go:798","msg":"Failed to get pod ENI config"}"

Per verificare se la risorsa eniConfig esiste nel cluster, esegui questo comando:

kubectl get eniconfig -o yaml

Se la risorsa personalizzata EniConfig non esiste, creane una. Per ulteriori informazioni sulle reti personalizzate, consulta AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG sul sito web di GitHub.

Errore Failed to watch

Se non scrivi il file YAML nel formato corretto, potresti ricevere un messaggio di errore simile al seguente esempio:

"Failed to watch *v1alpha1.ENIConfig: failed to list *v1alpha1.ENIConfig:json: cannot unmarshal string into Go struct field ENIConfigSpec.items.spec.securityGroups of type []string"

Il problema si verifica generalmente in caso di mancata corrispondenza tra i dati JSON e la definizione del tipo di dati Go. L'esempio di messaggio di errore precedente indica l'esistenza di un problema con il campo securityGroups.

Per risolverlo, controlla i tuoi JSON eseguendo questo comando:

kubectl describe ENIConfig

Nell'output del comando, controlla la sintassi in base al problema identificato nel messaggio di errore. Ad esempio, assicurati che il campo securityGroups nel JSON sia un array di stringhe, non una singola stringa.

Esempio di output:

cat >$az_1.yaml <<EOF
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
  name: us-west-2a
spec:
  securityGroups:
    - sg-0123456789abcdef0
  subnet: subnet-0123456789abcdef0
EOF
AWS UFFICIALEAggiornata 6 mesi fa