Por que meu plugin CNI da VPC não consegue acessar o servidor de API no Amazon EKS?
Meu plugin Container Network Interface (CNI) da Amazon VPC falha ao acessar o servidor de API no Amazon Kubernetes Service (Amazon EKS).
Breve descrição
Se o daemon ipamD tentar se conectar ao servidor de API antes que o kube-proxy adicione a porta do Kubernetes Service, a conexão entre o ipamD e o servidor da API atinge o tempo limite. Para solucionar essa situação, verifique os logs do ipamD e do kube-proxy e compare o carimbo de data/hora de cada um.
Você também pode adicionar um contêiner init. O contêiner init espera o kube-proxy criar a porta do Kubernetes Service. Em seguida, os pods aws-node terminam a inicialização para evitar um tempo limite.
Resolução
Verifique os logs do ipamD e do kube-proxy
Logs do ipamD:
Se a conexão entre o ipamD e o servidor da API expirar, você receberá o seguinte erro:
"Failed to create client: error communicating with apiserver:
Logs do kube-proxy:
O kube-proxy cria rotas iptables para endpoints do servidor de API do Kubernetes no nó de processamento. Depois que o kube-proxy criar a rota, você verá a seguinte mensagem:
Adding new service port \"default/kubernetes:https\"
Compare os carimbos de data/hora entre os logs
Logs do 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"}
Logs do 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"}
Nos logs do ipamD, você pode ver que o daemon ipamD tentou se conectar ao servidor da API em 2021-09-22T10:40:49.735Z. A conexão atingiu o tempo limite e falhou. Nos logs do kube-proxy, você pode ver que o kube-proxy adicionou a porta do Kubernetes Service em 2021-09-22T10:41:15.26766844Z.
Adicione um contêiner init
Para adicionar um contêiner init, conclua as seguintes etapas:
1. Modifique a especificação aws-node para que o DNS seja resolvido para o nome do Kubernetes Service:
$ kubectl -n kube-system edit daemonset/aws-node
Resultado:
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. Verifique se os pods do aws-node criaram os contêineres init:
$ kubectl get pods -n kube-system -w
Resultado:
... 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
Conteúdo relevante
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há um ano