Por que meu plugin CNI da VPC não consegue acessar o servidor de API no Amazon EKS?

Data da última atualização: 14/12/2021

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

Este artigo ajudou?


Precisa de ajuda com faturamento ou suporte técnico?