Por que o status do meu nó de processamento é “Não íntegro” quando uso o NGINX Ingress Controller com o Amazon EKS?

3 minuto de leitura
0

Eu uso o NGINX Ingress Controller para expor o recurso de entrada. Porém, meus nós de processamento do Amazon Elastic Kubernetes Service (Amazon EKS) não usam o Network Load Balancer.

Breve descrição

Para preservar o IP do cliente, o NGINX Ingress Controller define a opção spec.externalTrafficPolicy como Local. Além disso, ele encaminha as solicitações somente para os nós de processamento íntegros.

Para solucionar o status dos nós de processamento e atualizar a política de tráfego, consulte as etapas a seguir.

Nota: não há necessidade de manter o endereço IP do cluster ou preservar o endereço IP do cliente.

Resolução

Verifique o status de integridade dos nós de processamento

Nota: os exemplos a seguir usam o NGINX Ingress Controller v1.5.1 em execução no EKS Cluster v1.23.

1.    Crie os recursos obrigatórios para o NGINX Ingress Controller (do site do Kubernetes) em seu cluster:

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/aws/deploy.yaml

Por padrão, o NGINX Ingress Controller cria o serviço Kubernetes ingress-nginx-controller com a opção .spec.ExternalTrafficPolicy definida como Local (no site do GitHub).

2.    Verifique se a política de tráfego externo (do site do Kubernetes) está definida como Local:

$ kubectl -n ingress-nginx describe svc ingress-nginx-controller

Você receberá um resultado semelhante ao descrito abaixo:

Name:                     ingress-nginx-controller
Namespace:                ingress-nginx
Labels:                   app.kubernetes.io/component=controller
                          app.kubernetes.io/instance=ingress-nginx
                          app.kubernetes.io/managed-by=Helm
                          app.kubernetes.io/name=ingress-nginx
                          app.kubernetes.io/version=1.0.2
                          helm.sh/chart=ingress-nginx-4.0.3
Annotations:              service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
                          service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: true
                          service.beta.kubernetes.io/aws-load-balancer-type: nlb
Selector:                 app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
Type:                     LoadBalancer
IP Families:              <none>
IP:                       10.100.115.226
IPs:                      10.100.115.226
LoadBalancer Ingress:     a02245e77404f4707a725d0b977425aa-5b97f717658e49b9.elb.eu-west-1.amazonaws.com
Port:                     http  80/TCP
TargetPort:               http/TCP
NodePort:                 http  31748/TCP
Endpoints:                192.168.43.203:80
Port:                     https  443/TCP
TargetPort:               https/TCP
NodePort:                 https  30045/TCP
Endpoints:                192.168.43.203:443
Session Affinity:         None
External Traffic Policy:  Local
HealthCheck NodePort:     30424
Events:                   <none>

Observação: a configuração Local descarta pacotes que forem enviados para nós do Kubernetes, e que não precisarem executar instâncias do NGINX Ingress Controller. Atribua pods NGINX (do site do Kubernetes) aos nós para os quais você quiser agendar o NGINX Ingress Controller.

3.    Verifique o comando iptables que configurou as regras DROP nos nós que não estão executando instâncias do NGINX Ingress Controller:

$ sudo iptables-save | grep -i "no local endpoints"
-A KUBE-XLB-CG5I4G2RS3ZVWGLK -m comment --comment "ingress-nginx/ingress-nginx-controller:http has no local endpoints
        " -j KUBE-MARK-DROP
-A KUBE-XLB-EDNDUDH2C75GIR6O -m comment --comment "ingress-nginx/ingress-nginx-controller:https has no local endpoints " -j KUBE-MARK-DROP

Defina a opção de política

Atualize a opção spec.externalTrafficPolicy para Cluster:

$ kubectl -n ingress-nginx patch service ingress-nginx-controller -p '{"spec":{"externalTrafficPolicy":"Cluster"}}'
service/ingress-nginx-controller patched

Por padrão, os serviços do NodePort realizam a tradução do endereço IP de origem (do site do Kubernetes). Para o NGINX, isso significa que o endereço IP de origem de uma solicitação HTTP é sempre o endereço IP do nó do Kubernetes que recebeu a solicitação. Se você definir externalTrafficPolicy (.spec.externalTrafficPolicy) como Cluster na especificação do serviço ingress-nginx, o tráfego de entrada não preservará o endereço IP de origem. Para obter mais informações, consulte Preserving the client source IP address (Preservar o endereço IP de origem do cliente (no site do Kubernetes).


AWS OFICIAL
AWS OFICIALAtualizada há um ano