Configuração de rede de passagem para um Serviço de LoadBalancer
Cenários de aplicações
O kube-proxy, que é responsável pelo encaminhamento do tráfego intracluster, adiciona os endereços IP dos balanceadores de carga associados aos Serviços de LoadBalancer às regras de encaminhamento local dos nós por padrão. Quando um cliente de dentro de um cluster acessa o endereço IP de um balanceador de carga, o tráfego é encaminhado diretamente para o destino, em vez de ser encaminhado pelo balanceador de carga.
Se a afinidade em nível de nó estiver configurada para um Serviço (com externalTrafficPolicy definido como Local), o Serviço encaminhará o tráfego apenas para pods no nó que executa esses pods. Quando um nó ou pod acessa outro pod no mesmo cluster, se o nó em que o cliente é executado não tiver o pod de back-end correspondente, o acesso poderá falhar.
Solução
O CCE suporta redes de passagem. Você pode configurar a anotação kubernetes.io/elb.pass-through para o Serviço de LoadBalancer para que o balanceador de carga encaminhe o acesso intracluster para o endereço IP do balanceador de carga associado ao Serviço para pods de back-end.
- Clusters do CCE
Quando um Serviço de LoadBalancer é acessado dentro do cluster, o acesso é encaminhado para os pods de back-end usando iptables/IPVS por padrão.
Quando um Serviço de LoadBalancer (configurado com elb.pass-through) é acessado dentro do cluster, o acesso é encaminhado primeiro para o balanceador de carga, depois para os nós e, finalmente, para os pods de back-end usando iptables/IPVS.
- Clusters do CCE Turbo
Quando um cliente acessa um Serviço de LoadBalancer de dentro do cluster, a passagem é usada por padrão. Nesse caso, o cliente acessa diretamente o endereço IP da rede privada do balanceador de carga e, em seguida, acessa um contêiner por meio do balanceador de carga.
Restrições
- Em um cluster padrão do CCE, depois que a rede de passagem é configurada para um balanceador de carga dedicado, o endereço IP privado do balanceador de carga não pode ser acessado do nó onde o pod de carga de trabalho reside ou de outros contêineres no mesmo nó da carga de trabalho.
- A rede de passagem não é suportada para clusters de v1.15 ou anterior.
- No modo de rede IPVS, as configurações de passagem dos Serviços conectados ao mesmo balanceador de carga devem ser as mesmas.
- Se a afinidade de serviço em nível de nó (local) for usada, kubernetes.io/elb.pass-through será automaticamente definido como onlyLocal para ativar a passagem.
Procedimento
Esta seção descreve como criar um Deployment usando uma imagem do Nginx e criar um Serviço com a rede de passagem ativada.
- Use a ferramenta de linha de comando kubectl para se conectar ao cluster. Para obter detalhes, consulte Conexão a um cluster usando o kubectl.
- Use a imagem do Nginx para criar um Deployment.
Crie um arquivo nginx-deployment.yaml. O conteúdo do arquivo é o seguinte:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx:latest name: container-0 resources: limits: cpu: 100m memory: 200Mi requests: cpu: 100m memory: 200Mi imagePullSecrets: - name: default-secret
Execute o seguinte comando para implementar a carga de trabalho:kubectl create -f nginx-deployment.yaml
- Crie um Serviço de LoadBalancer e defina kubernetes.io/elb.pass-through como true. Para obter detalhes sobre como criar o Serviço de LoadBalancer, consulte LoadBalancer.
O conteúdo do arquivo nginx-elb-svc.yaml é o seguinte. (Neste exemplo, um balanceador de carga compartilhado chamado james é criado automaticamente.)
apiVersion: v1 kind: Service metadata: annotations: kubernetes.io/elb.pass-through: "true" kubernetes.io/elb.class: union kubernetes.io/elb.autocreate: '{"type":"public","bandwidth_name":"cce-bandwidth","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}' labels: app: nginx name: nginx spec: externalTrafficPolicy: Local ports: - name: service0 port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer
- Execute o seguinte comando para criar o Serviço:
kubectl create -f nginx-elb-svc.yaml
Verificação
- Faça logon no console do ELB e verifique o balanceador de carga (chamado james neste exemplo) associado ao Serviço.
- Clique no nome do balanceador de carga e clique na guia Monitoring.
Há 0 conexões com o balanceador de carga.
- Faça logon em um contêiner de Nginx no cluster usando kubectl e acesse o endereço IP do balanceador de carga.
- Obtenha os contêineres de Nginx no cluster.
kubectl get pod
Informação semelhante à seguinte é exibida:NAME READY STATUS RESTARTS AGE nginx-7c4c5cc6b5-vpncx 1/1 Running 0 9m47s nginx-7c4c5cc6b5-xj5wl 1/1 Running 0 9m47s
- Efetue logon em um contêiner do Nginx.
kubectl exec -it nginx-7c4c5cc6b5-vpncx -- /bin/sh
- Acesse o endereço IP do balanceador de carga.
curl **.**.**.**
- Obtenha os contêineres de Nginx no cluster.
- Aguarde um pouco e verifique os dados de monitoramento no console do ELB.
Se uma nova conexão de acesso for exibida, o acesso será encaminhado pelo balanceador de carga conforme o esperado.