Perché il mio plug-in CNI VPC non riesce a raggiungere il server API in Amazon EKS?

Ultimo aggiornamento: 14/12/2021

Il mio plug-in CNI (Container Network Interface) Amazon VPC non riesce a raggiungere il server API in Amazon EKS (Amazon Kubernetes Service).

Breve descrizione

Se il daemon ipamD tenta di connettersi al server API prima che il kube-proxy abbia aggiunto la porta del servizio Kubernetes, la connessione tra ipamD e il server API scade. Per risolvere questo problema, controlla i log di ipamD e del kube-proxy, quindi confronta il timestamp di ciascuno di essi.

È inoltre possibile aggiungere un container di inizializzazione. Il container di inizializzazione attende che il kube-proxy crei la porta del servizio Kubernetes. I pod aws-node terminano quindi l'inizializzazione per evitare un timeout.

Risoluzione

Controlla i log di ipamD e kube-proxy

Log ipamD:

Se si verifica il timeout della connessione tra ipamD e il server API, viene visualizzato il seguente errore:

"Failed to create client: error communicating with apiserver:

Log kube-proxy:

Il kube-proxy crea instradamenti iptables per gli endpoint del server API Kubernetes sul nodo worker. Dopo che il kube-proxy ha creato l'instradamento, viene visualizzato il seguente messaggio:

Adding new service port \"default/kubernetes:https\"

Confronta i timestamp tra log

Log ipamD:

{"level":"error","ts":"2021-09-22T10:40:49.735Z","caller":"aws-k8s-agent/main.go:28","msg":"Failed to create client: error communicating with apiserver: Get https://10.77.0.1:443/version?timeout=32s: dial tcp 10.77.0.1:443: i/o timeout"}

Log kube-proxy:

{"log":"I0922 10:41:15.267648       1 service.go:379] Adding new service port \"default/kubernetes:https\" at 10.77.0.1:443/TCP\n","stream":"stderr","time":"2021-09-22T10:40:49.26766844Z"}

Nei log di ipamD, puoi vedere che il daemon ipamD ha provato a connettersi al server API all'indirizzo 2021-09-22T 10:40:49 .735Z. La connessione è scaduta e non è riuscita. Nei log del kube-proxy, puoi vedere che il kube-proxy ha aggiunto la porta del servizio Kubernetes su 2021-09-22T 10:41:15 .26766844Z.

Aggiungi un container di inizializzazione

Per aggiungere un container di inizializzazione, completa i seguenti passaggi:

1.    Modifica la specifica aws-node in modo che il DNS venga risolto per il nome del servizio Kubernetes:

$ kubectl -n kube-system edit daemonset/aws-node

Output:

   initContainers:
   - name: init-kubernetes-api
     image: busybox:1.28
     command: ['sh', '-c', "until nc -zv ${KUBERNETES_PORT_443_TCP_ADDR} 443; do echo waiting for kubernetes Service endpoint; sleep 2; done"]

2.    Verifica che i pod aws-node abbiano creato i container di inizializzazione:

$ kubectl get pods -n kube-system  -w

Output:

    ...
    kube-proxy-smvfl                          0/1     Pending             0          0s
    aws-node-v68bh                            0/1     Pending             0          0s
    kube-proxy-smvfl                          0/1     Pending             0          0s
    aws-node-v68bh                            0/1     Pending             0          0s
    aws-node-v68bh                            0/1     Init:0/1            0          0s
    kube-proxy-smvfl                          0/1     ContainerCreating   0          0s
    kube-proxy-smvfl                          1/1     Running             0          6s
    aws-node-v68bh                            0/1     PodInitializing     0          9s
    aws-node-v68bh                            0/1     Running             0          16s
    aws-node-v68bh                            1/1     Running             0          53s

Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?