Este tópico descreve como usar um ALB Ingress em um cluster Kubernetes autogerenciado executado no Alibaba Cloud para gerenciar o tráfego com o Application Load Balancer (ALB).
Cenário de exemplo
Este tópico usa o cenário ilustrado na figura a seguir, em que um cluster Kubernetes autogerenciado no Alibaba Cloud utiliza um ALB Ingress para rotear requisições.
Implante o alb-ingress-controller e crie recursos de Ingress e Service no cluster Kubernetes autogerenciado. O alb-ingress-controller sincroniza as configurações do Ingress com uma instância ALB como regras de encaminhamento. Ele também monitora o API Server do cluster para detectar alterações nos Ingresses e sincroniza essas atualizações com a instância ALB. A instância ALB roteia dinamicamente o tráfego para os pods correspondentes no cluster. Para mais informações, consulte Gerenciamento de ALB Ingress.

Observações de uso
Se você usar um plug-in de rede overlay, como o Flannel, o serviço de backend do ALB Ingress deverá ser do tipo NodePort ou LoadBalancer.
Os nomes dos recursos AlbConfig, Namespace, Ingress e Service não podem começar com
aliyun.
Pré-requisitos
Você tem um cluster Kubernetes autogerenciado (v1.20 ou posterior) em execução no Alibaba Cloud. Conecte-se ao cluster usando kubectl. Para obter detalhes sobre como baixar e instalar o kubectl, consulte Instalar e configurar o kubectl.
Configure o SNAT para permitir acesso à internet no cluster autogerenciado. Para mais informações, consulte Usar o recurso SNAT de um gateway NAT da Internet para acessar a Internet.
-
Ao usar uma imagem de controller para seu cluster autogerenciado, considere o seguinte:
Se usar uma imagem privada, compile-a e envie-a seguindo as instruções em Implantar o controller a partir do código-fonte.
Para clusters com arquitetura x86 genérica, use a imagem pública fornecida pelo Alibaba Cloud para testes.
Procedimento

As etapas a seguir envolvem a modificação de vários arquivos. A tabela abaixo descreve a finalidade de cada um.
|
Etapa |
Nome do arquivo |
Finalidade |
|
load-balancer-controller.yaml Modificado a partir de um modelo |
Implantar o alb-ingress-controller |
|
|
alb.yaml Criado e modificado |
Criar recursos AlbConfig e IngressClass, o que gera automaticamente uma instância ALB |
|
|
test-service.yaml Criado e modificado |
Implantar um serviço de teste |
|
|
test-ingress.yaml Criado e modificado |
Criar um Ingress |
Etapa 1: Implantar o alb-ingress-controller
O pull da imagem de implantação pode falhar devido a problemas de rede da operadora. Para evitar isso, use uma imagem privada. Compile-a e envie-a seguindo as instruções em Implantar o controller a partir do código-fonte.
Neste tópico, o alb-ingress-controller inicia no modo InCluster. Após configurar as permissões para observar recursos de Service, Endpoint e Node, use o arquivo load-balancer-controller.yaml para implantar o alb-ingress-controller. Os recursos ServiceAccount, Deployment e ConfigMap necessários já vêm pré-configurados. Modifique-os apenas para adequá-los ao seu ambiente.
-
Modifique o arquivo load-balancer-controller.yaml para alterar a imagem do Deployment para um endereço de imagem acessível.
O arquivo
load-balancer-controller.yamlserve para implantar o alb-ingress-controller.Antes da modificação:
image: ${path/to/your/image/registry}Após a modificação:
image: alibabacloudslb/alibaba-load-balancer-controller:v1.2.0 # An x86-compiled image. -
Edite o arquivo
load-balancer-controller.yamlpara configurar o AccessKey ID e o AccessKey Secret no ConfigMap.NotaFaça login no RAM console com a conta Alibaba Cloud que será usada para criar a instância ALB. Em seguida, visualize o AccessKey ID e o AccessKey Secret na página AccessKey.
apiVersion: v1 kind: ConfigMap metadata: name: load-balancer-config namespace: kube-system data: cloud-config.conf: |- { "Global": { "AccessKeyID": "<YOUR_ACCESS_KEY_ID>", # Base64 encoding is required. "AccessKeySecret": "<YOUR_ACCESS_KEY_SECRET>" # Base64 encoding is required. } } -
Conecte-se ao cluster usando kubectl e execute o comando a seguir para aplicar o arquivo
load-balancer-controller.yamlmodificado.kubectl apply -f load-balancer-controller.yamlSaída esperada:
clusterrole.rbac.authorization.k8s.io/system:load-balancer-controller created serviceaccount/load-balancer-controller created clusterrolebinding.rbac.authorization.k8s.io/system:load-controller-manager created configmap/load-balancer-config created deployment.apps/load-balancer-controller created -
Execute o comando abaixo para verificar a implantação do alb-ingress-controller.
kubectl -n kube-system get all | grep load-balancerA saída a seguir mostra que o pod está no estado
Running, indicando uma implantação bem-sucedida.[root@iZ2ze9xxx uoZ test]# kubectl -n kube-system get all | grep load-balancer pod/load-balancer-controller-67985dd48d-qtgl8 1/1 Running 0 61d deployment.apps/load-balancer-controller 1/1 1 1 62d replicaset.apps/load-balancer-controller-67985dd48d 1 1 1 62d
Etapa 2: Criar recursos AlbConfig e IngressClass
Após criar os recursos AlbConfig e IngressClass, uma instância ALB é criada automaticamente.
-
Crie um arquivo chamado alb.yaml e copie o conteúdo a seguir para ele.
O arquivo
alb.yamlcria os recursos AlbConfig e IngressClass.apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-demo spec: config: name: alb-test # The name of the ALB instance. addressType: Internet # Use 'Internet' for public-facing or 'Intranet' for private. zoneMappings: - vSwitchId: vsw-wz9e2usil7e5an1xi**** # Specify vSwitch IDs in at least two zones. - vSwitchId: vsw-wz92lvykqj1siwvif**** listeners: - port: 80 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: alb-demo # The referenced AlbConfig resource.NotaAtente-se aos seguintes parâmetros:
-
albconfig.spec.config.addressType: Tipo de rede da instância. Valores válidos:
-
Internet (padrão): Cria uma instância voltada para a internet pública. Um IP público e um IP privado são atribuídos a cada zona. Instâncias ALB públicas usam um elastic IP address (EIP) para fornecer serviços pela internet. São cobradas taxas de instância e de transferência de dados para o EIP.
O EIP fornece acesso à internet pública para a instância ALB.
O IP privado permite o acesso à instância ALB a partir de instâncias ECS dentro da mesma VPC.
Intranet: Cria uma instância privada. Um IP privado é atribuído a cada zona. A instância ALB fica acessível apenas pela rede do Alibaba Cloud e não pode ser alcançada pela internet.
-
spec.config.zoneMappings: Especifica os IDs dos vSwitches para o ALB Ingress. Informe pelo menos dois IDs de vSwitches em zonas diferentes. Os vSwitches especificados devem estar em zonas suportadas pela instância ALB atual. Para mais informações sobre as regiões e zonas suportadas pelo ALB, consulte Regiões e zonas suportadas.
-
-
Conecte-se ao cluster via kubectl e execute o comando a seguir para aplicar o arquivo
alb.yaml.kubectl apply -f alb.yamlSaída esperada:
AlbConfig.alibabacloud.com/alb-demo created ingressclass.networking.k8s.io/alb created -
Verifique a criação da instância ALB.
-
Método 1: Execute o comando abaixo para visualizar o ID da instância ALB.
kubectl get albconfig alb-demo[root@i-xxx nuoZ test]# kubectl get albconfig alb-demo NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE alb-demo alb-3lzokczr3c9guq7zz7 alb-3xxx.com 84s -
Método 2: Acesse o ALB console para visualizar a instância ALB criada.
NotaFaça login no console com a conta Alibaba Cloud configurada no ConfigMap na Etapa 1: Implantar o alb-ingress-controller.
-
Etapa 3: Implantar uma aplicação de teste
Esta seção orienta o uso de uma imagem de teste para criar recursos de Deployment e implantar uma aplicação de teste.
-
Crie um arquivo chamado test-service.yaml e copie o conteúdo a seguir para ele.
O arquivo
test-service.yamlimplanta dois Deployments chamadostest01etest02, além de dois Services chamadostest01-serviceetest02-service.apiVersion: apps/v1 kind: Deployment metadata: name: test01 spec: replicas: 2 selector: matchLabels: app: test01 template: metadata: labels: app: test01 spec: containers: - name: test01 image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: test01-service spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: test01 type: NodePort --- apiVersion: apps/v1 kind: Deployment metadata: name: test02 spec: replicas: 1 selector: matchLabels: app: test02 template: metadata: labels: app: test02 spec: containers: - name: test02 image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: test02-service spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: test02 type: NodePort -
Conecte-se ao cluster usando kubectl e execute o comando a seguir para aplicar o arquivo
test-service.yaml.kubectl apply -f test-service.yamlSaída esperada:
deployment.apps/test01 created service/test01-service created deployment.apps/test02 created service/test02-service created -
Execute o comando abaixo para confirmar que os serviços de teste foram implantados com sucesso.
kubectl get svc,deployA saída a seguir indica que os serviços de teste foram implantados corretamente.
[root@iZ2z***uoZ test]# kubectl get svc,deploy NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/cloud-nodeport NodePort 10.xxx.122 <none> 80:31310/TCP 63d service/kubernetes ClusterIP 10.xxx.1 <none> 443/TCP 63d service/test01-service NodePort 10.xxx.121 <none> 80:31254/TCP 9s service/test02-service NodePort 10.xxx.118 <none> 80:30337/TCP 9s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/openresty-deployment 2/2 2 2 63d deployment.apps/test01 2/2 2 2 9s deployment.apps/test02 1/1 1 1 9s
Etapa 4: Criar um Ingress
Um Ingress corresponde a uma regra de encaminhamento em uma instância ALB. Este tópico usa roteamento baseado em caminho. Para mais informações sobre recursos avançados, consulte o Guia de usuário do ALB Ingress.
-
Crie um arquivo chamado test-ingress.yaml e copie o conteúdo a seguir para ele.
O arquivo
test-ingress.yamlcria um Ingress.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-ingress spec: ingressClassName: alb rules: - host: demo.domain.ingress.top http: paths: - path: /test01 pathType: Prefix backend: service: name: test01-service port: number: 80 - path: /test02 pathType: Prefix backend: service: name: test02-service port: number: 80 -
Conecte-se ao cluster via kubectl e execute o comando a seguir para aplicar o arquivo
test-ingress.yaml.kubectl apply -f test-ingress.yamlSaída esperada:
ingress.networking.k8s.io/test-ingress created -
Execute o comando abaixo para verificar a criação do recurso
test-ingress.kubectl get ingressA saída a seguir indica que o recurso
test-ingressfoi criado com sucesso.[root@iZ2zxxx test]# kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE test-ingress alb demo.domain.ingress.top alb-xxx.cn-beijing.alb.aliyuncs.com 80 19s
Etapa 5: Verificar os resultados
Acesso por nome de domínio
-
Crie um registro CNAME para mapear seu nome de domínio ao nome DNS da instância ALB. Para mais informações, consulte Configurar um registro CNAME para uma instância ALB.
Neste exemplo, suponha que você mapeie o nome de domínio personalizado
demo.domain.ingress.toppara o nome DNS público da instância ALB. -
Execute o comando a seguir para acessar o serviço
test01por meio da instância ALB.curl http://demo.domain.ingress.top/test01O pod de backend NGINX retorna uma resposta com detalhes como Endereço do servidor (
10.xxx.xxx.xxx:80), Nome do servidor (test01-648bf46944-kvlhj), Data (07/Nov/2022:08:16:35 +0000) e URI (/test01). Isso confirma que o Ingress roteou corretamente a requisição para um pod de backend do serviçotest01. -
Execute o comando a seguir para acessar o serviço
test02por meio da instância ALB.curl http://demo.domain.ingress.top/test02O comando retorna a página de teste do NGINX, mostrando que o Endereço do servidor é
10.xxx.20:80, o Nome do servidor étest02-76d96f7b8d-6mtnne a URI é/test02. Isso confirma que o Ingress roteou corretamente a requisição para o pod de backendtest02.
Em caso de dúvidas, participe do Grupo de Clientes ALB (DingTalk ID: 31945843) para obter assistência.
Documentos relacionados
Visão geral e recursos do ALB Ingress:
Documentação do código-fonte: