Mon plug-in CNI (Container Network Interface) Virtual Private Cloud (VPC) Amazon ne parvient pas à atteindre le serveur API dans Amazon Elastic Kubernetes Service (Amazon EKS).
Brève description
Il est possible que le démon ipamD tente de se connecter au serveur API avant que le kube-proxy n'ajoute le port de service Kubernetes. Dans ce cas, la connexion entre l’ipamD et le serveur API expire. Pour résoudre ce problème, consultez les journaux de l'ipamD et du kube-proxy, puis comparez l'horodatage de chacun.
Vous pouvez également ajouter un conteneur d'initialisation. Le conteneur d'initialisation attend que le kube-proxy crée le port de service Kubernetes. Les pods aws-node terminent ensuite l'initialisation pour éviter un délai d'attente.
Résolution
Vérification des journaux de l'ipamD et du kube-proxy
Journaux de l'ipamD
Si la connexion entre l'ipamD et le serveur API expire, le message d'erreur suivant s'affiche :
« Failed to create client: error communicating with apiserver: »
Journaux du kube-proxy
Le kube-proxy crée des acheminements iptables pour les points de terminaison du serveur API Kubernetes sur le composant master. Une fois que le kube-proxy à créé l'acheminement, le message suivant s'affiche :
« Adding new service port \"default/kubernetes:https\ »
Comparaison de l'horodatage des journaux
Journaux de l'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 du 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 de l’ipamD, nous pouvons voir que le démon ipamD a tenté de se connecter au serveur API à la date suivante : 2021-09-22T10:40:49.735Z. La connexion a expiré et a échoué. Dans les journaux de kube-proxy, nous pouvons voir que le kube-proxy a ajouté le port de service Kubernetes à la date suivante : 2021-09-22T10:41:15.26766844Z.
Ajout d'un conteneur d'initialisation
Pour ajouter un conteneur d'initialisation, procédez comme suit :
-
Modifiez la spécification aws-node afin que le DNS soit résolu pour le nom du service Kubernetes :
$ kubectl -n kube-system edit daemonset/aws-node
Vous obtenez le résultat suivant :
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"]
-
Vérifiez que les pods aws-node ont bien créé les conteneurs d'initialisation :
$ kubectl get pods -n kube-system -w
Vous obtenez le résultat suivant :
...
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
Informations connexes
Mise à jour du module complémentaire autogéré Kubernetes kube-proxy
Version skew policy sur le site Web de Kubernetes