Pourquoi le plug-in CNI de mon VPC ne parvient-il pas à atteindre le serveur d'API dans Amazon EKS ?

Date de la dernière mise à jour : 14/12/2021

Mon plug-in Amazon VPC Container Network Interface (CNI) ne parvient pas à atteindre le serveur d'API dans Amazon Kubernetes Service (Amazon EKS).

Brève description

Si le démon ipamD essaie de se connecter au serveur d'API avant que le paramètre kube-proxy ajoute le port du service Kubernetes, la connexion entre l'iPAMD et le serveur d'API expire. Pour résoudre ce problème, vérifiez les journaux ipamD et kube-proxy, puis comparez l'horodatage de chacun.

Vous pouvez également ajouter un conteneur d'initialisation. Le conteneur d'initialisation attend que kube-proxy crée le port de service Kubernetes. Les pods aws-node terminent ensuite l'initialisation pour éviter une expiration du délai d'attente.

Résolution

Vérifier les journaux ipamD et kube-proxy

Journaux ipamD :

Si la connexion entre ipamD et le serveur API expire, le message d'erreur suivant s'affiche :

"Failed to create client: error communicating with apiserver:

Journaux kube-proxy :

kube-proxy crée des acheminements iptables pour les points de terminaison du serveur d'API Kubernetes sur le composant master. Une fois que kube-proxy crée l'acheminement, le message suivant s'affiche :

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

Comparer les horodatages entre les journaux

Journaux 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"}

Journaux 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"}

Dans les journaux ipamD, vous pouvez voir que le démon ipamD a essayé de se connecter au serveur d'API à 2021-09-22T10:40:49.735Z. La connexion a expiré et a échoué. Dans les journaux de kube-proxy, vous pouvez voir que le kube-proxy a ajouté le port de service Kubernetes à 2021-09-22T10:41:15.26766844Z.

Ajouter un conteneur d'initialisation

Pour ajouter un conteneur d'initialisation, procédez comme suit :

1.    Modifiez la spécification aws-node afin que le DNS soit résolu pour le nom de service Kubernetes :

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

Sortie :

   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.    Vérifiez que les pods aws-node ont créé les conteneurs d'initialisation :

$ kubectl get pods -n kube-system  -w

Sortie :

    ...
    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

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?