É possível acessar um Service exposto pelo Alibaba Cloud Server Load Balancer (SLB) fora do cluster pelo nome de domínio do SLB ou por <IP:Service Port>. Dentro do cluster, o acesso ocorre via <Service Name:Service Port>. Este tópico descreve como expor um aplicativo em um cluster ACS usando um Service com um balanceador de carga existente, tomando um aplicativo Nginx como exemplo.
Pré-requisitos
Você deve ter uma instância de SLB criada no console do SLB na mesma região do cluster ACS. Este tópico usa como exemplo uma instância de Classic Load Balancer (CLB) voltada para a internet. Se você não tiver uma instância de CLB, consulte Criar e gerenciar instâncias de CLB.
Considerações
Limites de reutilização do SLB
-
A instância de SLB a ser reutilizada deve atender aos seguintes requisitos:
Somente instâncias de SLB criadas manualmente no console do SLB podem ser reutilizadas. Não é possível reutilizar instâncias criadas automaticamente pelo cloud controller manager (CCM) ou usadas pelo servidor de API do cluster.
Para reutilizar uma instância de SLB de rede interna em um cluster ACS, a instância e o cluster devem estar na mesma Virtual Private Cloud (VPC).
-
O tipo de endereço da instância de SLB deve corresponder ao tipo de acesso do Service:
Se o Service fornecer Public Access (definido pela anotação
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "internet"), o Address Type da instância de SLB deve ser Public Network.Se o Service fornecer acesso interno (definido pela anotação
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet"), o Address Type da instância de SLB deve ser Internal Network.
Vários Services não podem usar a mesma porta de listener na mesma instância de SLB.
Ao reutilizar uma instância de SLB entre clusters, garanta que a combinação de namespace e nome do Service seja exclusiva em cada cluster.
-
O CCM configura uma instância de SLB apenas para Services do tipo
type: LoadBalancer.ImportanteSe você alterar um Service
type: LoadBalancerpara outro tipo, o CCM excluirá as configurações adicionadas à instância de SLB. Consequentemente, o Service ficará inacessível por meio dessa instância. -
O CCM usa uma API declarativa e reconcilia automaticamente a configuração do SLB com base na configuração do Service sob condições específicas. Se a anotação
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"estiver definida, quaisquer configurações modificadas manualmente no console do SLB poderão ser sobrescritas.ImportanteNão modifique manualmente no console do SLB nenhuma configuração de uma instância gerenciada pelo ACS. Caso contrário, as configurações poderão ser perdidas e o Service poderá ficar inacessível.
Não é possível alterar a instância de SLB de um Service LoadBalancer existente. Para trocar a instância de SLB, crie um novo Service.
Limites de cota do SLB
O CCM cria uma instância de SLB para cada Service
Type=LoadBalancer. A cota padrão é de 60 instâncias de CLB e 60 de NLB. Para aumentar essa cota, faça login no console do Quota Center e envie uma solicitação.-
O CCM anexa instâncias de ECS ou Elastic Network Interfaces (ENIs) ao grupo de servidores de back-end do SLB conforme a configuração do Service, criando um grupo de servidores separado por targetPort. Limites de cota:
Quantidade de servidores de back-end: Uma instância de CLB suporta até 200 servidores; uma instância de NLB suporta até 400 servidores baseados em ECS, ENI ou IP. Fórmula da cota: servidores de back-end × targetPorts. Para aumentar a cota, faça login no console do Quota Center e envie uma solicitação antecipadamente.
Anexos de grupos de servidores por instância: Uma instância de ECS ou ENI pode ser anexada a até 50 grupos de servidores de back-end de CLB e 200 de NLB. Para aumentar esse limite, faça login no console do Quota Center e envie uma solicitação.
Cota extra durante atualizações contínuas: Novos pods são criados antes da exclusão dos antigos, consumindo cota adicional que pode exceder as expectativas. Reserve cota suficiente com antecedência.
O CCM cria listeners com base nas portas do Service. O limite padrão é de 50 listeners por instância de CLB ou NLB. Para adicionar mais, faça login no console do Quota Center e envie uma solicitação.
-
Consulte Limites do CLB e Limites do NLB.
Verifique as cotas do SLB em Gerenciamento de cotas do Server Load Balancer.
Etapa 1: Implantar um aplicativo de exemplo
Os passos a seguir demonstram como implantar o aplicativo usando kubectl.
Use o kubectl no Cloud Shell para conectar-se ao seu cluster.
-
Crie um arquivo chamado my-nginx.yaml com o seguinte conteúdo.
-
Execute o comando abaixo para implantar o aplicativo de exemplo my-nginx.
kubectl apply -f my-nginx.yaml -
Execute o comando a seguir para verificar se o aplicativo está em execução.
kubectl get deployment my-nginxSaída esperada:
NAME READY UP-TO-DATE AVAILABLE AGE my-nginx 3/3 3 3 50s
Etapa 2: Expor o aplicativo com um Service
Crie um Service LoadBalancer para expor o aplicativo usando o console ou o kubectl.
Console
Faça login no console do ACS. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do cluster desejado. No painel de navegação à esquerda, escolha Network > Services.
Na página Services, clique em Create no canto superior esquerdo.
-
Na caixa de diálogo Create Service, configure os parâmetros do Service.
Parâmetro
Descrição
Exemplo
Name
Insira um nome para o Service.
my-nginx-svc
Service Type
Selecione o tipo do Service. Isso determina como o Service será acessado.
Create Service:
-
Service Type: LoadBalancer
-
SLB Type: Classic Load Balancer (CLB)
-
Select Resource: Use Existing Resource
-
: Selected
Backend
Se você não associar uma carga de trabalho, nenhum objeto Endpoints será criado, mas é possível vincular um manualmente. Para mais informações, consulte Services without selectors.
Clique em + Reference Workload Label e selecione my-nginx:
-
Name: app
-
Value: nginx
Port Mapping
Adicione uma porta de serviço (campo
portno arquivo YAML do Service) e uma porta de contêiner (campotargetPortno arquivo YAML do Service). A porta do contêiner deve corresponder à porta exposta pelo Pod de back-end.-
Service Port: 80
-
Container Port: 80
-
Protocol: TCP
Annotations
Adicione uma anotação ao Service para configurar parâmetros do balanceador de carga. Para mais detalhes, consulte Usar anotações para configurar instâncias de Classic Load Balancer (CLB).
Este exemplo define o método de faturamento como pagamento por largura de banda e o limite de largura de banda como 2 Mbit/s para controlar o tráfego do Service.
Defina o método de faturamento:
-
Name:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-charge-type -
Value: paybybandwidth
Defina a largura de banda:
-
Name:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-bandwidth -
Value: 2
Label
Adicione um rótulo para identificar o Service.
Nenhum
-
Clique em Create. Na página Services, visualize o Service recém-criado.
-
Acesse o aplicativo de exemplo usando o endereço IP na coluna External IP, como 39.106.XX.XX:80.
Após acessar o aplicativo, a página Welcome to nginx! será exibida. Isso indica que o Service Nginx foi implantado e está funcionando conforme o esperado.
kubectl
-
Crie um arquivo chamado my-nginx-svc.yaml com o conteúdo abaixo.
Atualize o valor da anotação
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id. Substitua ${YOUR_LB_ID} pelo ID da instância de SLB criada no console do SLB.Por padrão, reutilizar uma instância de SLB existente não cria nem sobrescreve seus listeners. Se necessário, defina a anotação
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listenerscomotrue. Neste exemplo, a instância de SLB é nova e requer um listener, portanto o valor é definido comotrue. Para mais informações, consulte Usar anotações para configurar instâncias de Classic Load Balancer (CLB).Defina o valor de
selectorcomo o valor dematchLabelsno arquivomy-nginx.yaml, que éapp: nginx, para associar o Service ao aplicativo de back-end.
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${YOUR_LB_ID} service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: 'true' labels: app: nginx name: my-nginx-svc namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer -
Execute o comando a seguir para criar o Service my-nginx-svc e expor o aplicativo.
kubectl apply -f my-nginx-svc.yaml -
Execute o comando abaixo para verificar se o Service LoadBalancer foi criado.
kubectl get svc my-nginx-svcSaída esperada:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-nginx-svc LoadBalancer 172.21.5.82 39.106.XX.XX 80/TCP 5m -
Execute o comando curl <YOUR-External-IP> para acessar o aplicativo. Substitua o placeholder <YOUR-External-IP> pelo
EXTERNAL-IPobtido na etapa anterior.curl 39.106.XX.XXSaída esperada:
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>