Por padrão, os serviços em um cluster ACK ficam isolados da rede externa. O ALB Ingress expõe esses serviços utilizando um Application Load Balancer (ALB) como ponto de entrada para o tráfego externo. O ALB oferece roteamento baseado em domínio, segurança e alta disponibilidade.
Como funciona
|
|
Limitações de tipo de serviço
Ao usar o plug-in de rede Flannel, os Services de backend para um ALB Ingress limitam-se aos tipos NodePort e LoadBalancer.
Instale o ALB Ingress Controller
Na criação do cluster
Acesse o ACK console e clique em Create Kubernetes Cluster.
Na etapa Component Configuration, acesse a seção Ingress e selecione ALB Ingress.
-
Este exemplo usa a opção New. Siga as instruções na tela para criar o cluster.
ALB Instance
Descrição
New
Cria automaticamente uma instância ALB, um AlbConfig e um IngressClass.
-
Instância ALB: Cria automaticamente uma instância ALB pública ou privada, da edição Standard e com pagamento conforme o uso na VPC do cluster, e configura um listener
HTTP:80. -
AlbConfig e IngressClass: Cria automaticamente os recursos AlbConfig e IngressClass correspondentes no cluster e os associa à instância ALB.
Select Existing VPC
Esta opção está disponível apenas quando o cluster está configurado para usar uma Virtual Private Cloud (VPC) existente.
Usa uma instância ALB existente e cria automaticamente um AlbConfig e um IngressClass. A instância ALB especificada deve ser da edição Standard ou WAF-enhanced, estar na mesma VPC do cluster e não estar associada a outro cluster.
None
Instala apenas o componente ALB Ingress Controller. Você deve criar manualmente um AlbConfig e um IngressClass posteriormente. Indicado para cenários em que você precisa personalizar a configuração da instância ALB.
-
Para um cluster existente
Acesse o ACK console. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Components and Add-ons .
Use a caixa de pesquisa ou clique na aba Networking para encontrar o componente. No cartão do componente ALB Ingress Controller, clique em Install no canto inferior direito.
-
Este exemplo usa a opção New. Clique em OK.
ALB Instance
Descrição
New
Cria automaticamente uma instância ALB, um AlbConfig e um IngressClass.
-
Instância ALB: Cria automaticamente uma instância ALB pública ou privada, da edição Standard e com pagamento conforme o uso na VPC do cluster, e configura um listener
HTTP:80. -
AlbConfig e IngressClass: Cria automaticamente os recursos AlbConfig e IngressClass correspondentes no cluster e os associa à instância ALB.
Existing
Usa uma instância ALB existente e cria automaticamente um AlbConfig e um IngressClass. A instância ALB especificada deve ser da edição Standard ou WAF-enhanced, estar na mesma VPC do cluster e não estar associada a outro cluster.
None
Instala apenas o componente ALB Ingress Controller. Você deve criar manualmente um AlbConfig e um IngressClass posteriormente. Indicado para cenários em que você precisa personalizar a configuração da instância ALB.
-
Crie um aplicativo de exemplo
O aplicativo de exemplo implanta um Deployment chamado coffee e um Service correspondente chamado coffee-svc.
Console
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
-
Clique em Create from YAML. Selecione Custom na lista suspensa Sample Template. Em seguida, copie o seguinte conteúdo para o editor de modelo e clique em Create.
Na caixa de diálogo de confirmação, clique em View e verifique se o status do Pod é
Running.
kubectl
-
Crie um arquivo chamado
coffee-deployment-service.yamlcom o seguinte conteúdo. -
Crie o Deployment e o Service para o aplicativo de exemplo.
kubectl apply -f coffee-deployment-service.yaml -
Verifique se o status do Pod é
Running.kubectl get pod -l app=coffeeSaída esperada:
NAME READY STATUS RESTARTS AGE coffee-84bd6*****-***** 1/1 Running 0 4m22s coffee-84bd6*****-***** 1/1 Running 0 4m22s
Crie um ALB Ingress
Configure o nome de domínio e os mapeamentos de caminho para o ALB Ingress rotear as requisições de ingress-demo.com/coffee para o Service coffee-svc dentro do cluster.
Para usar um ALB Ingress em um cluster dedicado ACK , você deve conceder permissões de acesso ao ALB Ingress Controller .
Console
No painel de navegação à esquerda, escolha . Selecione o namespace
defaulte clique em Create Ingress.-
Especifique os seguintes parâmetros do Ingress e clique em OK.
Name:
coffee-ingressDomain Name:
ingress-demo.com-
Mappings: Path:
/coffee, Match Rule:Prefix, Service:coffee-svc, Port:80.Regra de correspondência (pathType)
Descrição
Prefix
Corresponde ao caminho da requisição com base em seu prefixo. Por exemplo, requisições para
/coffee/1ou/coffee/buy/1são correspondidas, mas requisições para/cofou/coffeebuy/1não são.Exact
Corresponde exatamente ao caminho da requisição. Apenas requisições para
/coffeesão correspondidas.ImplementationSpecific
O comportamento de correspondência depende da implementação do Ingress controller. Para o ALB Ingress Controller, este tipo equivale a uma correspondência Exact.
-
Obtenha o endereço do Endpoint.
Um ALB Ingress leva cerca de 10 segundos para entrar em vigor. Você pode clicar no botão de atualização para obter as informações do endpoint. Se o endpoint não for atualizado após um longo período, clique no nome do Ingress e acesse a aba Events para solucionar problemas .
Na coluna Endpoint da lista de Ingress, encontre o endereço do endpoint ALB, que possui um formato semelhante a
alb-<instance_id>.cn-wulanchabu.alb.aliyuncsslb.com. -
Teste o acesso ao domínio e ao endpoint. Um código de status HTTP
200indica que o ALB Ingress está funcionando corretamente.curl -H "Host:ingress-demo.com" http://<endpoint_address>/coffee -s -o /dev/null -w "%{http_code}\n"
kubectl
-
Crie um arquivo chamado
coffee-ingress.yamlcom o seguinte conteúdo. Em seguida, execute o comandokubectl apply -f coffee-ingress.yamlpara criar o ALB Ingress.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: coffee-ingress namespace: default spec: ingressClassName: alb rules: - host: ingress-demo.com http: paths: - path: /coffee backend: service: name: coffee-svc port: number: 80 pathType: PrefixRegra de correspondência (pathType)
Descrição
Prefix
Corresponde ao caminho da requisição com base em seu prefixo. Por exemplo, requisições para
/coffee/1ou/coffee/buy/1são correspondidas, mas requisições para/cofou/coffeebuy/1não são.Exact
Corresponde exatamente ao caminho da requisição. Apenas requisições para
/coffeesão correspondidas.ImplementationSpecific
O comportamento de correspondência depende da implementação do Ingress controller. Para o ALB Ingress Controller, este tipo equivale a uma correspondência Exact.
-
Visualize o Ingress e obtenha o endereço do endpoint no campo
ADDRESS.kubectl get ingress coffee-ingress -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'Saída esperada:
alb-******************.cn-wulanchabu.alb.aliyuncsslb.com -
Teste o acesso ao domínio e ao endpoint. Um código de status HTTP
200indica que o ALB Ingress está funcionando corretamente.curl -H "Host:ingress-demo.com" http://<endpoint_address>/coffee -s -o /dev/null -w "%{http_code}\n"
Faturamento
ALB Ingress Controller: Este é um componente gerenciado do ACK e é gratuito.
Instância ALB: Cada objeto de recurso
AlbConfigcria uma instância ALB correspondente. As instâncias ALB usam o faturamento de pagamento conforme o uso.
Implantação em produção
Configure DNS: Crie um registro CNAME para mapear o domínio do seu serviço ao endpoint público da instância ALB. Isso desacopla o domínio do endpoint da instância, garantindo um ponto de entrada do serviço altamente disponível e flexível.
Ative HTTPS: Use o Certificate Management Service para gerenciar centralmente seus certificados e referencie-os declarativamente no campo
tlsde um recurso Ingress para proteger o tráfego do Service com HTTPS.
Cotas e limites
Os nomes de recursos AlbConfig, Ingress, Service e namespace não podem começar com
aliyun.Para obter informações sobre os limites de cota do ALB Ingress, consulte Cálculo de cota do ALB.
Para ver as regiões e zonas de disponibilidade suportadas pelo ALB Ingress, consulte Regiões e zonas suportadas pelo ALB.
Perguntas frequentes
Por que um Ingress retorna códigos de erro HTTP?
Causas
-
Erro 503 (Service Temporarily Unavailable)
Nenhuma regra de roteamento correspondente: O caminho da requisição não corresponde a nenhuma regra de roteamento configurada no Ingress.
Nenhum pod de backend íntegro: O Service associado não possui pods prontos, o que resulta em um objeto de endpoints vazio.
-
Erro 502 (Bad Gateway)
Após um listener HTTP ou HTTPS receber uma requisição de conexão do cliente, o ALB envia um código de status HTTP 502 Bad Gateway ao cliente porque não consegue encaminhar a requisição para um Pod ou receber uma resposta dele.
-
Erro 404 (Not Found)
Geralmente ocorre quando uma requisição corresponde a uma regra de roteamento do Ingress, mas sua URL não corresponde ao caminho do Service do aplicativo no pod de backend.
-
Erro 400 (Bad Request)
Pode ocorrer por vários motivos, como enviar uma requisição HTTP para um listener HTTPS.
Para mais informações sobre códigos de erro HTTP, consulte Códigos de status do ALB .
Solução
-
Verifique o status do Ingress: Execute o comando
kubectl describe ingress <ingress-name> -n <namespace>e inspecione a seção Events em busca de mensagens de erro. Se aparecer um evento comolistener is not exist in alb, adicione a configuração de listener necessária ao seu AlbConfig.... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedBuildModel **** ingress listener is not exist in alb, port: 443, protocol: HTTPS Warning FailedBuildModel **** ingress listener not found for (443/HTTPS), with ingresses 1 ... Verifique os endpoints de backend: Execute o comando
kubectl get endpoints <service-name> -n <namespace>para confirmar que o campoENDPOINTSlista pelo menos um endereço IP e porta de pod íntegro. Se estiver vazio, verifique se oselectordo Service corresponde aoslabelsdos pods e se os pods estão no estadoRunning.Verifique o status e os logs do pod: Execute
kubectl get pod -l <app=your-app> -n <namespace>para visualizar o status do pod. Em seguida, use o nome do pod para executarkubectl logs <pod-name> -n <namespace>e verifique os logs do aplicativo em busca de falhas de inicialização ou erros de processamento de requisição.Teste a conectividade de rede: De dentro de um pod ou de um nó, use
curlpara acessar o ClusterIP do Service de backend ou o IP de um pod e verifique se o Service está acessível dentro do cluster.
Por que o HTTPS fica inacessível após a configuração do TLS?
Causas
A instância ALB não está escutando na porta 443: Você configurou o TLS para o Ingress, mas o listener
HTTPS:443correspondente não foi criado.Configuração de certificado incorreta: O tipo do Secret não é
kubernetes.io/tlsouIngressTLS, ou o conteúdo detls.crtetls.keyno campodataestá incorreto ou não corresponde.Certificado desatualizado: A instância ALB pode estar usando um certificado antigo. Isso acontece se você atualizar um certificado no Alibaba Cloud Certificate Management Service, mas não atualizar o ID do certificado no seu AlbConfig, ou se a descoberta e a reconciliação automáticas não forem acionadas.
Solução
Verifique a porta do listener: Execute o comando
kubectl describe albconfig <alb-name> -n <namespace>para confirmar que as configuraçõesspec.listeners.port: 443espec.listeners.protocol: HTTPSestão presentes.Verifique a configuração do Ingress: Confirme se a configuração do Ingress inclui a annotation
alb.ingress.kubernetes.io/listen-ports: [{"HTTP": 80}, {"HTTPS": 443}]. Esta annotation associa o Ingress aos listeners HTTP e HTTPS.Verifique a configuração do Secret: Na configuração do Ingress, verifique o campo
secretNamedespec.tlspara confirmar que o Secret correto está referenciado. Execute o comandokubectl get secret <secret-name> -n <namespace> -o yamlpara confirmar o tipo do Secret e a integridade dos dados.
Como configurar a resolução de domínio do Ingress?
-
Por exemplo, adicione um registro DNS com o tipo de registro
CNAME, o registro de host @ (que representa o domínio raiz, comoingress-demo.com), e o valor do registro como o endereço do endpoint do Ingress . -
Em um navegador, acesse http://ingress-demo.com/coffee para verificar se a resolução do nome de domínio está funcionando.
Após o acesso bem-sucedido, uma página de teste do NGINX é retornada, exibindo informações como Server address, Server name, Date e URI (com o valor
/coffee) do pod de backend. Isso indica que o Ingress roteou corretamente a requisição para o pod de backend.Para verificação, substitua o exemplo pelo seu nome de domínio registrado. Se a resolução do nome de domínio falhar, consulte Solução rápida de problemas para falhas na resolução de nomes de domínio .
Como configuro o HTTPS para um Ingress?
Compre um certificado oficial, e solicite um certificado. Certifique-se de que o certificado que você deseja usar esteja no estado Issued.
-
Este exemplo mostra como baixar o arquivo de certificado no formato PEM para o domínio
ingress-demo.com, com o tipo de servidor definido como Other . -
Crie um Secret para armazenar o arquivo de certificado.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
-
Na página Secrets, selecione o namespace
defaulte clique em Create à esquerda. Adicione as seguintes configurações e clique em OK.Name:
ingress-tlsType: Ingress TLS Certificate
Certificates: O conteúdo completo do arquivo de certificado baixado e descompactado (.pem).
Key: O conteúdo completo do arquivo de chave privada baixado e descompactado (.key).
-
Atualize o AlbConfig para adicionar um listener
HTTPS:443à instância ALB.No painel de navegação à esquerda, escolha . Na aba Resource Objects, pesquise por AlbConfig e clique no resultado da pesquisa.
Na lista de objetos de recurso AlbConfig, encontre o recurso de destino
albe clique em Edit YAML na coluna Actions.-
Adicione os campos
spec.listeners.port: 443espec.listeners.protocol: HTTPSe clique em OK.spec: config: addressAllocatedMode: Fixed addressType: Internet zoneMappings: - vSwitchId: vsw-xxx - vSwitchId: vsw-xxx listeners: - port: 80 protocol: HTTP - port: 443 protocol: HTTPS
-
Atualize o Ingress para adicionar uma configuração TLS e associá-la ao listener
HTTPS:443.No painel de navegação à esquerda, escolha . Na coluna Actions do Ingress de destino, clique em Update.
-
Adicione as seguintes configurações e clique em OK.
TLS Settings: Enabled
Domain Name:
ingress-demo.comSecrets:
ingress-tlsAnnotations:
alb.ingress.kubernetes.io/listen-ports: [{"HTTP": 80}, {"HTTPS": 443}]
-
Em um navegador, acesse
https://ingress-demo.com/coffeepara verificar o acesso HTTPS.A página exibe o logotipo do NGINX e as informações de resposta do servidor. O Server address, Server name e URI (com o valor
/coffee) são retornados conforme o esperado. Isso confirma que o HTTPS está configurado corretamente e que o Ingress roteia as requisições para o pod de backend docoffee.Para verificação, substitua o exemplo pelo seu nome de domínio registrado.
Para mais informações sobre como configurar certificados HTTPS, consulte Configure certificados HTTPS para comunicação criptografada.
Como criar manualmente o AlbConfig e o IngressClass?
Crie um AlbConfig
-
Acesse o VPC console e anote os IDs de pelo menos dois vSwitches que estejam em zonas de disponibilidade diferentes dentro da VPC onde o cluster está implantado.
As zonas de disponibilidade dos vSwitches configurados devem ser suportadas pelo ALB. Para mais informações, consulte Regiões e zonas do ALB .
-
Substitua
zoneMappings.vSwitchIdno código a seguir pelos IDs dos vSwitches obtidos na etapa anterior. Salve o conteúdo em um arquivo chamado albconfig.yaml e executekubectl apply -f albconfig.yamlpara criar o AlbConfig.Para etapas mais detalhadas, consulte Criar um AlbConfig .
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb # Do not create another AlbConfig resource with the same name. spec: config: name: alb-test addressType: Internet zoneMappings: - vSwitchId: vsw-****cg2a9g71hx8go**** # Replace with your actual vSwitch ID. - vSwitchId: vsw-****un9tql5t8nh15**** # Replace with your actual vSwitch ID. listeners: - port: 80 protocol: HTTP
Crie um IngressClass
O recurso IngressClass associa um AlbConfig aos recursos Ingress. Quando você especifica ingressClassName: alb em um Ingress, ele usa o AlbConfig definido no IngressClass alb.
Salve o seguinte conteúdo em um arquivo chamado IngressClass.yaml e execute kubectl apply -f IngressClass.yaml para criar o IngressClass.
O campospec.parameters.namedeve ser definido com o nome do AlbConfig. O AlbConfig padrão criado ao instalar o componente chama-sealb. Para mais informações, consulte Usar o IngressClass para associar um AlbConfig a um Ingress .
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: alb
spec:
controller: ingress.k8s.alibabacloud/alb
parameters:
apiGroup: alibabacloud.com
kind: AlbConfig
name: alb # This must match the name of the AlbConfig resource.