Perché il plug-in CNI VPC non riesce a raggiungere il server API in Amazon EKS?
Il plug-in Container Network Interface (CNI) di Amazon Virtual Private Cloud (Amazon VPC) non riesce a raggiungere il server API in Amazon Elastic Kubernetes Service (Amazon EKS).
Breve descrizione
Il daemon ipamD potrebbe tentare di connettersi al server API prima che il kube-proxy aggiunga la porta di servizio Kubernetes. In questo caso, la connessione tra ipamD e il server API si interrompe. Per risolvere questo problema, controlla i log di ipamD e kube-proxy, quindi confronta il timestamp di ciascuno.
Puoi anche aggiungere un container init. Il container init attende che il kube-proxy crei la porta di servizio Kubernetes. I pod aws-node completano quindi l'inizializzazione per evitare un timeout.
Soluzione
Controllo dei log di ipamD e kube-proxy
Log ipamD
Se la connessione tra ipamD e il server API si interrompe, viene visualizzato il seguente errore:
"Failed to create client: error communicating with apiserver:"
Log kube-proxy
Il kube-proxy crea percorsi iptables per gli endpoint del server API Kubernetes sul nodo worker. Dopo che il kube-proxy ha creato il percorso, viene visualizzato il seguente messaggio:
"Adding new service port \"default/kubernetes:https\"
Confronto dei timestamp dei 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, si può vedere che il daemon ipamD ha provato a connettersi al server API al 2021-09-22T10:40:49.735Z. La connessione è scaduta e non è riuscita. Nei log del kube-proxy, si può vedere che il kube-proxy ha aggiunto la porta del servizio Kubernetes al 2021-09-22T10:41:15.26766844Z.
Aggiunta di un container init
Per aggiungere un container init, completa i seguenti passaggi:
-
Modifica la specifica aws-node in modo che il DNS sia risolto per il nome di servizio Kubernetes:
$ kubectl -n kube-system edit daemonset/aws-node
Viene visualizzato il seguente 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"]
-
Verifica che i pod aws-node abbiano creato i container init:
$ kubectl get pods -n kube-system -w
Viene visualizzato il seguente 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
Informazioni correlate
Updating the Kubernetes kube-proxy self-managed add-on
Version skew policy sul sito Web di Kubernetes
Contenuto pertinente
- AWS UFFICIALEAggiornata 2 anni fa
- AWS UFFICIALEAggiornata un anno fa
- AWS UFFICIALEAggiornata 2 anni fa
- AWS UFFICIALEAggiornata 4 mesi fa