Use gateways multicluster ALB para gerenciar o tráfego norte-sul em vários clusters ACK. Essa abordagem oferece redundância ativa entre zonas, balanceamento de carga e roteamento baseado em cabeçalhos, eliminando a necessidade de gerenciar controladores de Ingress separados para cada cluster.
Pré-requisitos
Antes de começar, verifique se você tem:
Gerenciamento de frota ativado — consulte Ative gerenciamento multicluster
Uma instância ACK One Fleet associada a dois clusters ACK na mesma Virtual Private Cloud (VPC) — consulte Gerencie clusters associados
O arquivo kubeconfig da instância Fleet baixado do console do ACK One, com o kubectl conectado à instância Fleet
A versão mais recente da CLI do Alibaba Cloud instalada e configurada
Como funciona
O tráfego flui da internet pela instância ALB até os pods nos clusters associados:
Internet → ALB instance → ACK One Fleet instance → Associated cluster 1 (pods)
→ Associated cluster 2 (pods)
A instância Fleet atua como plano de controle. Um objeto AlbConfig na instância Fleet provisiona a instância ALB. As regras de Ingress na instância Fleet controlam como o ALB roteia o tráfego para os pods em todos os clusters associados.
Etapa 1: Crie um gateway multicluster ALB
Crie um objeto AlbConfig na instância Fleet para provisionar a instância ALB e registrar os clusters associados como destinos de tráfego.
Obtenha os IDs de dois vSwitches da VPC onde a instância Fleet reside.
-
Crie o arquivo
gateway.yamlcom o conteúdo a seguir. Substitua${vsw-id1}e${vsw-id2}pelos IDs dos vSwitches e substitua${cluster1}e${cluster2}pelos IDs dos clusters associados.Para cada cluster associado (
${cluster1}e${cluster2}), configure as regras de entrada dos respectivos grupos de segurança para permitir tráfego de todos os endereços IP e portas no bloco CIDR do vSwitch.Parâmetro
Obrigatório
Descrição
metadata.nameSim
Nome do AlbConfig.
metadata.annotations: alb.ingress.kubernetes.io/remote-clustersSim
Lista separada por vírgulas de IDs de cluster para adicionar ao gateway multicluster ALB. Cada ID de cluster já deve estar associado à instância Fleet.
spec.config.nameNão
Nome da instância ALB.
spec.config.addressTypeNão
Tipo de rede da instância ALB.
Internet(padrão): voltado para a internet pública, requer um Elastic IP Address (EIP), com cobrança de taxas de instância e largura de banda.Intranet: privado, acessível apenas dentro da VPC.spec.config.zoneMappingsSim
IDs de vSwitch para a instância ALB. Os vSwitches devem estar em zonas compatíveis com o ALB e na mesma VPC dos clusters. Para alta disponibilidade, use vSwitches em pelo menos duas zonas, caso a região ofereça suporte. Para regiões e zonas compatíveis, consulte Regiões e zonas onde o ALB está disponível.
spec.listenersNão
Porta e protocolo do listener. O exemplo usa HTTP na porta 8001. Mantenha esta configuração — sem um listener, não é possível usar Ingresses ALB.
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: ackone-gateway-demo annotations: # Add associated clusters that are used to handle traffic to the ALB multi-cluster instance. alb.ingress.kubernetes.io/remote-clusters: ${cluster1},${cluster2} spec: config: name: one-alb-demo addressType: Internet addressAllocatedMode: Fixed zoneMappings: - vSwitchId: ${vsw-id1} - vSwitchId: ${vsw-id2} listeners: - port: 8001 protocol: HTTP --- apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: ackone-gateway-demo -
Aplique o manifesto para criar o gateway multicluster ALB e a IngressClass:
kubectl apply -f gateway.yaml -
Após 1 a 3 minutos, verifique se o gateway foi criado:
kubectl get albconfig ackone-gateway-demoSaída esperada:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE ackone-gateway-demo alb-xxxx alb-xxxx.<regionid>.alb.aliyuncs.com 4d9h -
Verifique se os clusters associados estão conectados ao gateway:
kubectl get albconfig ackone-gateway-demo -ojsonpath='{.status.loadBalancer.subClusters}'A saída é uma lista de IDs de cluster.
Etapa 2: Roteamento de tráfego com Ingress
Crie um Ingress com ingressClassName: alb para usar o gateway multicluster ALB. Os Ingresses ALB suportam anotações comuns do Nginx Ingress e oferecem recursos aprimorados para instâncias ALB. Para obter a lista completa de anotações suportadas, consulte Configuração de Ingress ALB com anotações.
A tabela a seguir resume os quatro cenários de roteamento abordados nesta seção:
|
Cenário |
Quando usar |
Anotação principal |
|
Balanceamento de carga padrão |
Distribuir tráfego para todos os clusters por contagem de réplicas |
Nenhuma necessária |
|
Roteamento para cluster único |
Enviar todo o tráfego para um único cluster (para isolamento ou testes) |
|
|
Roteamento baseado em cabeçalho |
Roteamento de requisições com um cabeçalho específico para um cluster designado |
|
|
Roteamento baseado em peso |
Dividir o tráfego entre clusters em porcentagens definidas |
|
Exemplo 1: Balanceamento de carga padrão
Distribua o tráfego para todos os pods de backend nos clusters associados, ponderado pela contagem de réplicas. Nenhuma anotação de peso de cluster é necessária. Use este método quando desejar uma distribuição de carga simples e automática, sem personalizar pesos por cluster.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/listen-ports: |
[{"HTTP": 8001}]
name: alb-ingress
namespace: demo
spec:
ingressClassName: alb
rules:
- host: alb.ingress.alibaba.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
Exemplo 2: Roteamento para cluster único
Roteie todo o tráfego para um cluster específico — por exemplo, para isolar um cluster durante um incidente ou direcionar tráfego canário para um único cluster. Defina o peso do cluster como "100". Se o cluster especificado não existir, o sistema o ignorará.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/listen-ports: |
[{"HTTP": 8001}]
alb.ingress.kubernetes.io/cluster-weight.c6XXXXXXXXXXXXXXXXXXXXXXXXX: "100"
name: alb-ingress
namespace: demo
spec:
ingressClassName: alb
rules:
- host: alb.ingress.alibaba.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
Exemplo 3: Roteamento baseado em cabeçalho
Encaminhe requisições com um valor de cabeçalho HTTP específico para um cluster designado — por exemplo, para enviar requisições com stage: gray para um cluster de lançamento gradual (gray-release). Use a anotação alb.ingress.kubernetes.io/conditions.{service} para definir a regra de correspondência de cabeçalho e alb.ingress.kubernetes.io/cluster-weight.{clusterID} para especificar o cluster de destino. Caso o cluster especificado não exista, o sistema o ignorará.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/listen-ports: |
[{"HTTP": 8001}]
alb.ingress.kubernetes.io/conditions.service1: |
[{
"type": "Header",
"headerConfig": {
"key":"stage",
"values": [
"gray"
]
}
}]
alb.ingress.kubernetes.io/cluster-weight.c6XXXXXXXXXXXXXXXXXXXXXXXXX: "100"
name: alb-ingress
namespace: demo
spec:
ingressClassName: alb
rules:
- host: alb.ingress.alibaba.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
Exemplo 4: Roteamento baseado em peso
Divida o tráfego entre clusters em porcentagens definidas — por exemplo, para transferir gradualmente o tráfego de um cluster para outro durante uma migração. A soma de todos os pesos dos clusters deve ser igual a 100.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/listen-ports: |
[{"HTTP": 8001}]
alb.ingress.kubernetes.io/cluster-weight.c6XXXXXXXXXXXXXXXXXXXXXXXXX: "60"
alb.ingress.kubernetes.io/cluster-weight.cdXXXXXXXXXXXXXXXXXXXXXXXXX: "40"
name: alb-ingress
namespace: demo
spec:
ingressClassName: alb
rules:
- host: alb.ingress.alibaba.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
Solução de problemas
Gateway não criado após 3 minutos
Inspecione o status do AlbConfig para obter detalhes sobre erros:
kubectl describe albconfig ackone-gateway-demo
Causas comuns:
Os vSwitches não estão em zonas compatíveis com o ALB. Verifique usando Regiões e zonas onde o ALB está disponível.
As regras de entrada do grupo de segurança dos clusters associados não permitem tráfego proveniente do bloco CIDR do vSwitch.
Clusters associados não aparecem em subClusters
Verifique se os IDs de cluster na anotação alb.ingress.kubernetes.io/remote-clusters correspondem aos IDs dos clusters associados à instância Fleet:
kubectl get albconfig ackone-gateway-demo -ojsonpath='{.status.loadBalancer.subClusters}'
Se a saída estiver vazia, confirme se os IDs de cluster no arquivo gateway.yaml estão corretos e se os clusters estão associados à instância Fleet.
Próximos passos
Configuração de Ingress ALB com anotações — referência completa para anotações de Ingress ALB
Gerencie clusters associados — adicione ou remova clusters de uma instância Fleet
Pagamento conforme o uso — detalhes de faturamento para instâncias ALB voltadas para a internet