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