Por padrão, os serviços em um cluster ACK ficam isolados da rede externa. Um 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 utilizar o plugin de rede Flannel, os serviços de backend para um ALB Ingress limitam-se aos tipos NodePort e LoadBalancer.
Instale o ALB Ingress Controller
Na criação do cluster
Faça login no ACK console e clique em Create Kubernetes Cluster.
Na etapa Component Configuration, vá até a seção Ingress e selecione ALB Ingress.
-
Este exemplo utiliza 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 standard, com pagamento conforme o uso, pública ou privada na VPC do cluster e configura um listener
HTTP:80. -
AlbConfig e IngressClass: Cria automaticamente os recursos correspondentes de AlbConfig e IngressClass 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.
Utiliza 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 aprimorada com WAF, 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. Esta opção é adequada para cenários em que você precisa personalizar a configuração da instância ALB.
-
Para um cluster existente
Faça login no 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 localizar o componente. No cartão do componente ALB Ingress Controller, clique em Install no canto inferior direito.
-
Este exemplo utiliza 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 standard, com pagamento conforme o uso, pública ou privada na VPC do cluster e configura um listener
HTTP:80. -
AlbConfig e IngressClass: Cria automaticamente os recursos correspondentes de AlbConfig e IngressClass no cluster e os associa à instância ALB.
Existing
Utiliza 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 aprimorada com WAF, 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. Esta opção é adequada para cenários em que você precisa personalizar a configuração da instância ALB.
-
Criar uma aplicação de exemplo
A aplicação de exemplo implanta um Deployment chamado coffee e um serviço 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 conteúdo abaixo 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 serviço para a aplicação 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
Criar um ALB Ingress
Configure o nome de domínio e os mapeamentos de caminho para o ALB Ingress rotear solicitações de ingress-demo.com/coffee para o serviço 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 de 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 solicitação com base em seu prefixo. Por exemplo, solicitações para
/coffee/1ou/coffee/buy/1são correspondidas, mas solicitações para/cofou/coffeebuy/1não são.Exact
Corresponde exatamente ao caminho da solicitação. Apenas solicitações para
/coffeesão correspondidas.ImplementationSpecific
O comportamento de correspondência depende da implementação do controller de Ingress. 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. Clique 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, localize o endereço do endpoint ALB, que segue 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 solicitação com base em seu prefixo. Por exemplo, solicitações para
/coffee/1ou/coffee/buy/1são correspondidas, mas solicitações para/cofou/coffeebuy/1não são.Exact
Corresponde exatamente ao caminho da solicitação. Apenas solicitações para
/coffeesão correspondidas.ImplementationSpecific
O comportamento de correspondência depende da implementação do controller de Ingress. 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: É um componente gerenciado do ACK e gratuito.
Instância ALB: Cada objeto de recurso
AlbConfigcria uma instância ALB correspondente. As instâncias ALB utilizam faturamento pagamento conforme o uso.
Implantação em produção
Configurar 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 de serviço altamente disponível e flexível.
Ativar HTTPS: Utilize o Certificate Management Service para gerenciar centralmente seus certificados e referenciá-los declarativamente no campo
tlsde um recurso de Ingress, protegendo o tráfego do serviço com HTTPS.
Cotas e limites
Os nomes de recursos AlbConfig, Ingress, Service e namespace não podem começar com
aliyun.Para informações sobre os limites de cota do ALB Ingress, consulte Cálculo de cotas do ALB.
Para verificar as regiões e zonas de disponibilidade suportadas pelo ALB Ingress, consulte Regiões e zonas suportadas pelo ALB.
FAQ
Por que um Ingress retorna códigos de erro HTTP?
Causas
-
Erro 503 (Service Temporarily Unavailable)
Nenhuma regra de roteamento correspondente: O caminho da solicitação não corresponde a nenhuma regra de roteamento configurada no Ingress.
Nenhum pod de backend saudável: O serviço associado não possui pods prontos, resultando em um objeto de endpoints vazio.
-
Erro 502 (Bad Gateway)
Após um listener HTTP ou HTTPS receber uma solicitação de conexão do cliente, o ALB envia um código de status HTTP 502 Bad Gateway ao cliente porque falha ao encaminhar a solicitação para um Pod ou ao receber uma resposta dele.
-
Erro 404 (Not Found)
Geralmente ocorre quando uma solicitação corresponde a uma regra de roteamento do Ingress, mas sua URL não corresponde ao caminho do serviço da aplicação no pod de backend.
-
Erro 400 (Bad Request)
Pode ocorrer por vários motivos, como enviar uma solicitaçã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 saudável. Se estiver vazio, verifique se oselectordo serviço corresponde àslabelsdos 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 nos logs da aplicação se há falhas de inicialização ou erros de processamento de solicitações.Teste a conectividade de rede: De dentro de um pod ou de um nó, use
curlpara acessar o ClusterIP do serviço de backend ou um IP de pod, verificando se o serviço está acessível dentro do cluster.
Por que o HTTPS fica inacessível após a configuração de TLS?
Causas
A instância ALB não está escutando na porta 443: Você configurou 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 obsoleto: 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 automática e a reconciliação falharem ao disparar.
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}]. Essa 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 solicitaçã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 para falhas na resolução de nomes de domínio .
Como configuro HTTPS para um Ingress?
Comprar um certificado oficial, e solicitar um certificado. Certifique-se de que o certificado que deseja usar esteja no estado Issued.
-
Este exemplo mostra como baixar o arquivo de certificado formatado em 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: 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, localize o recurso alvo
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 alvo, 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 informações de resposta do servidor. O Server address, Server name e URI (com o valor
/coffee) são retornados conforme esperado. Isso confirma que o HTTPS está configurado corretamente e que o Ingress roteia solicitações para o pod de backend coffee.Para verificação, substitua o exemplo pelo seu nome de domínio registrado.
Para mais informações sobre como configurar certificados HTTPS, consulte Configurar certificados HTTPS para comunicação criptografada.
Como criar manualmente AlbConfig e IngressClass?
Criar um AlbConfig
-
Faça login no 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 abaixo pelos IDs de vSwitch 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
Criar um IngressClass
O recurso IngressClass associa um AlbConfig aos recursos de Ingress. Quando você especifica ingressClassName: alb em um Ingress, ele usa o AlbConfig definido na 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 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.