Crie, configure e reutilize instâncias e listeners ALB por meio de CRDs AlbConfig, com suporte a IPv6, logs de acesso do Simple Log Service (SLS), políticas TLS e ACLs de rede.
Pré-requisitos
O ALB Ingress Controller está instalado no cluster.
Dois vSwitches em zonas diferentes e compatíveis com ALB foram criados na mesma VPC do cluster ACK.
Para usar o ALB Ingress com um cluster dedicado ACK, conceda as permissões necessárias ao cluster primeiro.
Observações de uso
Para modificar configurações de recursos, use
kubectl edit. Caso utilizekubectl apply, executekubectl diffantes para visualizar as alterações antes de aplicá-las.Se o cluster utilizar o plugin de rede Flannel, os services de backend para o ALB Ingress devem ser do tipo NodePort ou LoadBalancer.
As instâncias ALB criadas pelo AlbConfig são recursos gerenciados controlados pelo ALB Ingress Controller. Não modifique essas instâncias diretamente no console ALB (por exemplo, não altere tags, ACLs, logs de acesso ou configurações de timeout no console). O loop de reconciliação do controller sobrescreve as alterações feitas no console ou elas podem causar erros. Para atualizar a configuração de uma instância ALB gerenciada, modifique o recurso AlbConfig no cluster. O controller sincroniza automaticamente as alterações na instância ALB.
Principais parâmetros em resumo
Parâmetros do AlbConfig mais utilizados:
|
Parâmetro |
Tipo |
Padrão |
Apenas na criação |
Descrição |
|
|
string |
— |
Não |
Nome da instância ALB |
|
|
string |
|
Não |
Define o modo de IP da instância ALB. Valores válidos: |
|
|
string |
|
Sim |
|
|
|
string |
— |
Sim |
Defina como |
|
|
array |
— |
Sim |
IDs de vSwitch (pelo menos dois, em zonas diferentes) |
|
|
string |
|
Não |
Edição da instância ALB |
|
|
string |
— |
Não |
ID de uma instância ALB existente para reutilização |
|
|
boolean |
|
Não |
Indica se os atributos de uma instância ALB reutilizada devem ser sobrescritos |
|
|
boolean |
|
Não |
Indica se os atributos dos listeners de uma instância reutilizada devem ser sobrescritos |
|
|
string |
— |
Não |
Projeto de log do SLS |
|
|
string |
— |
Não |
Logstore do SLS (deve começar com |
|
|
string |
— |
Não |
ID da instância de Internet Shared Bandwidth |
|
|
integer |
— |
Não |
Porta do listener |
|
|
string |
— |
Não |
|
|
|
integer |
|
Não |
Timeout de requisição em segundos (1–600) |
|
|
boolean |
|
Não |
Ativa a compressão Gzip/Brotli |
Configurações da instância ALB
Criar um AlbConfig
Cada AlbConfig configura uma instância ALB. Para usar várias instâncias ALB, crie um AlbConfig por instância.
Ao instalar o ALB Ingress Controller e selecionar Create ou Select Existing para Gateway Source, o controller cria automaticamente um AlbConfig chamado alb e uma IngressClass chamada alb.
-
Crie o arquivo
alb.yamlcom o seguinte conteúdo:Parâmetro
Descrição
spec.config.nameNome da instância ALB. Deve ser único dentro do cluster.
spec.config.addressTypeInternet(padrão): IP público.Intranet: apenas interno à VPC. Definido apenas na criação; não pode ser alterado posteriormente.spec.config.zoneMappingsPelo menos dois vSwitches em zonas compatíveis com ALB diferentes, na mesma VPC do cluster. Definido apenas na criação; não pode ser alterado posteriormente. Regiões de zona única permitem um vSwitch.
spec.config.zoneMappings[].allocationId(Opcional) ID do EIP a ser associado à instância ALB. Se omitido, um EIP BGP (multi-ISP) pago conforme o uso é criado automaticamente. Apenas EIPs pagos conforme o uso (pagamento por transferência de dados) que não estejam em uma instância de Internet Shared Bandwidth são suportados. Os EIPs para zonas diferentes devem ser do mesmo tipo.
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb spec: config: name: alb addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** # Replace with your vSwitch ID. allocationId: eip-asdfas**** # Replace with your EIP ID. If omitted, an EIP is assigned automatically. - vSwitchId: vsw-uf6nun9tql5t8nh15**** allocationId: eip-dpfmss**** listeners: - port: 80 protocol: HTTPConfigurações padrão do AlbConfig (exceto
vSwitchId):apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb spec: config: accessLogConfig: logProject: "" logStore: "" addressAllocatedMode: Dynamic addressType: Internet billingConfig: internetBandwidth: 0 internetChargeType: "" payType: PostPay deletionProtectionEnabled: true edition: Standard forceOverride: false zoneMappings: - vSwitchId: #... - vSwitchId: #... status: loadBalancer: dnsname: alb-s2em8fr9debkg5****.cn-shenzhen.alb.aliyuncs.com id: alb-s2em8fr9debkg5**** -
Aplique a configuração:
kubectl apply -f alb.yamlSaída esperada:
AlbConfig.alibabacloud.com/alb created -
Verifique o AlbConfig:
Os campos
PORT&PROTOCOLeCERTIDpermanecem vazios até que você configure listeners HTTPS e certificados.kubectl get AlbConfigSaída esperada:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE alb alb-****** alb-******.<regionID>.alb.aliyuncs.com 28m
Atualizar um AlbConfig
-
Liste seus AlbConfigs:
kubectl get AlbConfig -
Edite o AlbConfig:
kubectl edit albconfig <ALBCONFIG_NAME>Por exemplo, para renomear a instância ALB para
new_alb:spec: config: name: new_alb
Excluir um AlbConfig
Se uma instância ALB foi criada com um AlbConfig, excluir o AlbConfig também exclui a instância ALB.
Exclua todos os Ingresses associados ao AlbConfig antes de excluí-lo.
kubectl delete AlbConfig <AlbConfig_NAME>
Vincular uma instância de Internet Shared Bandwidth
Para vincular uma instância de Internet Shared Bandwidth à instância ALB, defina billingConfig.bandWidthPackageId:
Isso se aplica apenas a instâncias ALB voltadas para a internet. Para adquirir uma instância de Internet Shared Bandwidth, consulte Criar uma instância de Internet Shared Bandwidth .
spec:
config:
name: alb
addressType: Internet
edition: Standard
zoneMappings:
- vSwitchId: vsw-2vcqeyvwsnd***
- vSwitchId: vsw-2vcbhjlqu7y***
billingConfig:
bandWidthPackageId: cbwp-2vcjucp49otd8qolhm***
Criar e usar múltiplas instâncias ALB
Para utilizar várias instâncias ALB, crie um AlbConfig e uma IngressClass separados para cada instância.
-
Crie o arquivo
alb-2.yaml:apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-2 spec: config: name: alb-2 addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** - vSwitchId: vsw-uf6nun9tql5t8nh15**** -
Aplique a configuração:
kubectl apply -f alb-2.yaml -
Crie o arquivo
ingress_class2.yaml:Clusters v1.19 and later
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb-2 spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-2Clusters earlier than v1.19
apiVersion: networking.k8s.io/v1beta1 kind: IngressClass metadata: name: alb-2 spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-2 -
Aplique a configuração:
kubectl apply -f ingress_class2.yaml -
Crie o arquivo
ingress2.yaml. DefinaingressClassNamecomo a IngressClass da instância ALB de destino:Clusters v1.19 and later
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cafe-ingress2 spec: ingressClassName: alb-2 rules: - http: paths: - path: /tea pathType: ImplementationSpecific backend: service: name: tea-svc port: number: 80 - path: /coffee pathType: ImplementationSpecific backend: service: name: coffee-svc port: number: 80Clusters earlier than v1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: cafe-ingress2 spec: ingressClassName: alb-2 rules: - http: paths: - path: /tea backend: serviceName: tea-svc servicePort: 80 - path: /coffee backend: serviceName: coffee-svc servicePort: 80 -
Aplique a configuração:
kubectl apply -f ingress2.yaml
Associar um AlbConfig a um Ingress usando IngressClass
Utilize uma IngressClass para vincular um AlbConfig a um ALB Ingress.
Criar uma IngressClass
Crie o arquivo ingress_class.yaml:
Clusters v1.19 and later
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: alb
spec:
controller: ingress.k8s.alibabacloud/alb
parameters:
apiGroup: alibabacloud.com
kind: AlbConfig
name: alb
Clusters earlier than v1.19
apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
name: alb
spec:
controller: ingress.k8s.alibabacloud/alb
parameters:
apiGroup: alibabacloud.com
kind: AlbConfig
name: alb
Aplique a configuração:
kubectl apply -f ingress_class.yaml
Saída esperada:
ingressclass.networking.k8s.io/alb created
Criar um Ingress que referencie a IngressClass
Crie o arquivo ingress.yaml e defina ingressClassName como o nome da IngressClass:
Clusters v1.19 and later
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /tea
pathType: ImplementationSpecific
backend:
service:
name: tea-svc
port:
number: 80
- path: /coffee
pathType: ImplementationSpecific
backend:
service:
name: coffee-svc
port:
number: 80
Clusters earlier than v1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: cafe-ingress
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /tea
backend:
serviceName: tea-svc
servicePort: 80
- path: /coffee
backend:
serviceName: coffee-svc
servicePort: 80
Aplique a configuração:
kubectl apply -f ingress.yaml
Saída esperada:
ingress.networking.k8s.io/cafe-ingress created
Gerenciamento de instâncias ALB reutilizadas
Reutilizar uma instância ALB existente
Defina spec.config.id para reutilizar uma instância ALB existente. Instâncias Standard e com WAF ativado no console ALB são suportadas; instâncias Basic não podem ser reutilizadas. Uma instância ALB pode ser reutilizada por apenas um cluster e por apenas um AlbConfig dentro desse cluster.
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: reuse-alb
spec:
config:
id: ****
forceOverride: false
listenerForceOverride: false
Como id, forceOverride e listenerForceOverride interagem:
|
id |
forceOverride |
listenerForceOverride |
Resultado |
|
Não definido |
— |
— |
A instância ALB não é reutilizada. |
|
Definido |
|
— |
Os atributos da instância ALB e dos listeners são sobrescritos. |
|
Definido |
|
|
Quando listenerForceOverride é false, o ALB Ingress Controller gerencia apenas os listeners criados automaticamente pelo AlbConfig (nomeados ingress-auto-listener-{port}). Listeners criados manualmente não são gerenciados pelo AlbConfig. |
|
Definido |
|
|
Os atributos da instância ALB não são sobrescritos. O controller gerencia todos os listeners. A existência e a configuração dos listeners são determinadas pelo AlbConfig. |
Não renomeie listeners em uma instância ALB reutilizada. Listeners nomeados ingress-auto-listener-{port} são gerenciados pelo ACK; listeners com outros nomes são gerenciados no console ALB.
Excluir o AlbConfig de uma instância ALB reutilizada
Excluir o AlbConfig de uma instância ALB reutilizada não exclui a própria instância ALB.
Para o ALB Ingress Controller 2.10.0-aliyun.1 ou anterior: execute
kubectl editpara remover todas as entradas despec.listeners, o que exclui os listeners configurados através do AlbConfig. Para versões posteriores a 2.10.0-aliyun.1, pule esta etapa.-
Exclua todos os Ingresses associados ao AlbConfig e, em seguida, exclua o AlbConfig:
kubectl delete AlbConfig <AlbConfig_NAME>
Configurações avançadas
Ativar o SLS para coletar logs de acesso
Defina logProject e logStore em spec.config.accessLogConfig:
spec:
config:
accessLogConfig:
logProject: "k8s-log-xz92lvykqj1siwvif****"
logStore: "alb_****"
O valor delogStoredeve começar comalb_. Se o Logstore especificado não existir, um novo será criado automaticamente.
Encontre o projeto de log no console ACK nas Cluster Information > Basic Information do seu cluster.
Para ativar o SLS em uma instância ALB reutilizada , defina forceOverride: true .
Após ativar, clique em no nome do projeto ao lado de Log Service Project em Basic Information para visualizar os logs no SLS.
Ativar IPv6
Defina addressIpVersion: DualStack para ativar a pilha dupla IPv4/IPv6:
addressIpVersion entra em vigor apenas na criação e não pode ser alterado posteriormente.
spec:
config:
addressIpVersion: DualStack
Configurações de listener
Criar listeners
Defina port e protocol em spec.listeners para definir como o ALB recebe tráfego. Protocolos suportados: HTTP, HTTPS e Quick UDP Internet Connections (QUIC).
Modificar a port, o protocol ou outros atributos de um listener exclui o listener existente e cria um novo. Para configurar vários listeners com protocolos diferentes, adicione as anotações necessárias ao seu Ingress.
HTTP listener
spec:
listeners:
- port: 80
protocol: HTTP
O HTTP suporta WebSocket nativamente. Nenhuma configuração adicional é necessária.
HTTPS listener
spec:
listeners:
- port: 443
protocol: HTTPS
Listeners HTTPS exigem certificados.
QUIC listener
spec:
listeners:
- port: 443
protocol: QUIC
Listeners QUIC recebem requisições HTTP/3 dos clientes.
Especificar um certificado
Para adicionar um certificado a um listener HTTPS, execute kubectl edit albconfig <Albconfig_Name> e defina o campo certificates:
spec:
listeners:
- caEnabled: false
certificates:
- CertificateId: 756****-cn-hangzhou
IsDefault: true
port: 443
protocol: HTTPS
Se nenhum certificado padrão for especificado, o ALB Ingress usa o primeiro certificado como padrão.
Se nenhum certificado for especificado, a criação do listener é adiada até que um Ingress seja associado e um certificado seja descoberto automaticamente com base no nome de domínio.
Consulte Configurar certificados HTTPS para comunicação criptografada.
Excluir um listener
Execute kubectl edit albconfig <Albconfig_Name> e remova a entrada do listener de spec.listeners.
Desassocie todos os Ingresses do listener antes de excluí-lo. Caso contrário, a exclusão falhará com erros.
Por exemplo, para excluir o listener na porta 8002:
# Before
listeners:
- port: 8001
protocol: HTTP
- port: 8002
protocol: HTTP
# After
listeners:
- port: 8001
protocol: HTTP
Como funcionam as atualizações de listener
O array listeners é reconciliado comparando a nova configuração com o estado ativo e a anotação last-applied-configuration:
|
Na nova configuração |
Na configuração ativa |
Em last-applied-configuration |
Resultado |
|
Sim |
Sim |
— |
O listener é mantido. |
|
Sim |
Não |
— |
O listener é adicionado. |
|
Não |
— |
Sim |
O listener é excluído. Os campos podem ser redefinidos para os padrões. |
|
Não |
Sim |
Não |
O listener é excluído. |
Exemplo:
Dados estes três estados:
# New configuration
listeners:
- port: 8001
protocol: HTTP
- port: 8003
protocol: HTTP
- port: 8005 # New
protocol: HTTP
# Live configuration
listeners:
- port: 8001
protocol: HTTP
- port: 8002
protocol: HTTP
- port: 8003
protocol: HTTP
- port: 8004
protocol: HTTP
# last-applied-configuration
listeners:
- port: 8001
protocol: HTTP
- port: 8002
protocol: HTTP
- port: 8003
protocol: HTTP
Após aplicar a nova configuração:
listeners:
- port: 8001 # Retained (in new config and live config)
protocol: HTTP
- port: 8003 # Retained (in new config and live config)
protocol: HTTP
- port: 8005 # Added (in new config, not in live config)
protocol: HTTP
# Port 8002: deleted (not in new config, in last-applied-configuration)
# Port 8004: deleted (not in new config, in live config, not in last-applied-configuration)
Definir o período de timeout de conexão
Defina requestTimeout para controlar quanto tempo o ALB aguarda por uma resposta do backend antes de retornar HTTP 504 ao cliente. Intervalo válido: 1–600 segundos. Padrão: 60 segundos.
spec:
listeners:
- port: 80
protocol: HTTP
requestTimeout: 40
Configurações avançadas de listener
Configurar compressão de dados
Defina gzipEnabled: true para ativar a compressão. Todos os tipos de arquivo suportam compressão Brotli. Os seguintes tipos de arquivo também suportam compressão Gzip: text/xml, text/plain, text/css, application/javascript, application/x-javascript, application/rss+xml, application/atom+xml, application/xml e application/json.
Algoritmo de compressão: Se um cliente suportar tanto Brotli quanto Gzip, o ALB usa Brotli por ser mais eficiente.
Condições de compressão: O ALB comprime uma resposta apenas quando o cabeçalho de resposta
Content-Lengthexcede 1.024 bytes e o cabeçalho de requisiçãoAccept-Encodingdo cliente inclui o algoritmo de compressão correspondente.
spec:
listeners:
- port: 80
protocol: HTTP
gzipEnabled: true
Preservar endereços IP do cliente
O ALB adiciona o endereço IP do cliente ao cabeçalho X-Forwarded-For antes de encaminhar a requisição para o backend.
Disponível apenas para listeners HTTP e HTTPS.
XForwardedForEnabledestá ativado por padrão e não pode ser desativado.
spec:
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForEnabled: true # This parameter cannot be set to false.
Melhor prática para ambientes com múltiplas camadas de proxy: Embora XForwardedForEnabled: true propague o cabeçalho X-Forwarded-For por padrão, o valor do IP pode ser falsificado quando as requisições passam por vários proxies. Em ambientes de produção com múltiplas camadas de proxy, use XForwardedForClientSourceIpsEnabled: true juntamente com XForwardedForClientSourceIpsTrusted para recuperar o endereço IP do cliente de uma cadeia de proxy confiável.
Recuperar metadados de conexão do cliente
Use xForwardedForConfig para anexar metadados do cliente e do listener aos cabeçalhos de requisição encaminhados para o backend. Todos os campos abaixo estão disponíveis para listeners HTTP e HTTPS.
|
Campo |
Quando definido como true |
|
|
Adiciona a porta que o cliente usou para se conectar à instância ALB. |
|
|
Adiciona o protocolo do listener usado pela instância ALB. |
|
|
Adiciona o ID da instância ALB. |
|
|
Adiciona a porta de escuta da instância ALB. |
Exemplo — anexar todos os quatro cabeçalhos:
spec:
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForClientSrcPortEnabled: true
XForwardedForProtoEnabled: true
XForwardedForSLBIdEnabled: true
XForwardedForSLBPortEnabled: true
Recuperar o endereço IP do cliente de uma cadeia de proxy confiável
Defina XForwardedForClientSourceIpsEnabled: true para extrair o IP real do cliente de X-Forwarded-For quando as requisições passarem por múltiplos proxies. Use XForwardedForClientSourceIpsTrusted para listar IPs de proxy confiáveis ou blocos CIDR. O ALB percorre X-Forwarded-For da direita para a esquerda e trata o primeiro IP não confiável como o IP do cliente.
Por exemplo, se X-Forwarded-For for <client IP, proxy-1, proxy-2>, adicione proxy-1 e proxy-2 à lista de confiáveis.
Disponível apenas para listeners HTTP e HTTPS.
spec:
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForClientSourceIpsEnabled: true
XForwardedForClientSourceIpsTrusted: 192.168.x.x;192.168.x.x/16
Configurar uma política de segurança TLS personalizada
Defina securityPolicyId em um listener HTTPS para aplicar uma política de segurança TLS padrão ou personalizada.
spec:
listeners:
- port: 443
protocol: HTTPS
securityPolicyId: tls_cipher_policy_1_1
Configurar um endereço IP de proxy confiável
Configurar ACLs de rede
Use aclConfig para permitir ou negar tráfego de endereços IP específicos ou blocos CIDR no nível do listener.
spec:
listeners:
- port: 80
protocol: HTTP
aclConfig:
aclEntries:
- 127.0.0.1/32
aclType: White
|
Parâmetro |
Descrição |
|
|
|
|
|
Endereços IP ou blocos CIDR a serem incluídos na regra de ACL. Exemplo: |
Consulte Configurar ACLs.
Solução de problemas
Erro ao salvar um arquivo YAML do AlbConfig: alb: listener port number must between [1:65535], or you should set listen port explicitly in listener config.
Causa
Em um arquivo YAML do AlbConfig, o símbolo - na seção spec.listener marca o início de uma configuração de listener individual. No exemplo incorreto à esquerda, três símbolos - são usados, o que define três listeners. Ocorre um erro porque a seção certificates da última entrada - está sem a configuração de port.
Solução
Cada configuração de listener deve começar com um hífen (-). No exemplo corrigido à direita, o hífen (-) antes de certificates foi removido, o que torna a configuração do certificado parte do listener HTTPS: 443.
Exemplo incorreto: | Exemplo corrigido: |
Por que as alterações no tipo de rede (addressType) ou vSwitch (zoneMappings.vSwitchId) de uma instância ALB não entram em vigor quando feitas através de um arquivo YAML do AlbConfig?
Causa
Não é possível alterar o tipo de rede ou a configuração de vSwitch de uma instância Application Load Balancer (ALB) modificando addressType ou zoneMappings.vSwitchId em seu arquivo YAML do AlbConfig.

Solução
Primeiro, desative o modo somente leitura de configuração para a instância no console ALB. Em seguida, altere manualmente o tipo de rede ou a configuração de vSwitch da instância ALB. Após alterar a configuração, ative o modo somente leitura de configuração novamente.
Faça login no console ALB. Na região de destino, clique em no ID da instância que corresponde a
status.loadBalancer.idno arquivo AlbConfig.Na aba Instance Details, na seção Instance Information, clique em Disable Configuration Read-only Mode e confirme.
Clique em Change Network Type ou Modify Zone/Subnet para alterar o tipo de rede ou a configuração de vSwitch da instância ALB.
Após concluir as alterações, reative o configuration read-only mode.
Erro de listener HTTPS: empty https listener default certs
Causa
Um listener HTTPS está configurado no AlbConfig, mas nenhum ID de certificado foi especificado no campo certificates. O controller não consegue criar o listener porque não existe nenhum Ingress associado para descobrir automaticamente um certificado com base no nome de domínio.
Soluções
-
Método 1 (Recomendado): Especifique um ID de certificado no campo
certificatespara o listener HTTPS. Para mais informações, consulte especificar um certificado.listeners: - port: 443 protocol: HTTPS certificates: - CertificateId: <your-certificate-id> # Replace with your actual certificate ID. IsDefault: true Método 2: No AlbConfig, configure um listener HTTP na porta 80 e crie um recurso Ingress associado ao nome de domínio de destino. Após a criação do Ingress, o ALB Ingress Controller descobre automaticamente o certificado do Ingress com base no nome de domínio e o anexa ao listener HTTPS.