Durante atualizações de service, use implantações canary para manter a estabilidade do sistema. O ALB Ingress oferece suporte a anotações canary por header, cookie ou peso (prioridade: header > cookie > peso). Direcione parte do tráfego para a nova versão do Service em produção, valide o comportamento e promova a versão quando estiver pronta.
Pré-requisitos
Conclua os seguintes itens:
Dois vSwitches em zonas diferentes na mesma VPC do cluster ACK. Consulte Criar e gerenciar um vSwitch.
-
Controlador ALB Ingress instalado no cluster. Consulte Gerencie o controlador ALB Ingress.
Para clusters dedicados ACK, conceda permissões ao cluster para acessar o ALB Ingress. Consulte Autorizar um cluster dedicado ACK a acessar o controlador ALB Ingress .
AlbConfig criado. Consulte Crie um AlbConfig.
kubectl conectado ao cluster ACK. Consulte Obter o arquivo kubeconfig de um cluster e usar kubectl para conectar-se ao cluster.
Anotações canary
Todo Ingress canary requer a anotação alb.ingress.kubernetes.io/canary: "true". Sem ela, o Ingress canary entra em conflito com a produção em vez de rotear o tráfego paralelamente.
As anotações abaixo controlam a divisão de tráfego:
|
Anotação |
Descrição |
|
|
Marca o Ingress como canary. Defina como |
|
|
Chave do header de requisição para correspondência. Requisições correspondentes são roteadas para o Service canary. |
|
|
Valor do header para correspondência. Requer |
|
|
Percentual de tráfego (0–100) destinado ao Service canary quando nenhuma regra de header ou cookie corresponde. |
|
|
Ordem de avaliação da regra de roteamento. Valores válidos: 1–1000. Padrão: |
Prioridade das regras: baseada em header > baseada em cookie > baseada em peso.
Observações de uso
Regras baseadas em header e cookie não podem compartilhar um Ingress com regras baseadas em peso. Use Ingresses separados ou custom routing rules para condições complexas.
O host do Ingress canary deve corresponder exatamente ao host do Ingress de produção.
Defina a prioridade explicitamente com
alb.ingress.kubernetes.io/orderquando múltiplos Ingresses canary compartilharem um host, em vez de depender da ordenação lexicográfica.
Etapa 1: Implantar o Service de produção
Implante o Deployment, o Service e o Ingress de produção.
-
Crie o arquivo
tea-deploy.yamle aplique-o:apiVersion: apps/v1 kind: Deployment metadata: name: tea spec: replicas: 1 selector: matchLabels: app: tea template: metadata: labels: app: tea spec: containers: - name: tea image: registry.cn-hangzhou.aliyuncs.com/acs-sample/old-nginx:latest ports: - containerPort: 80kubectl apply -f tea-deploy.yaml -
Crie o arquivo
tea-svc.yamle aplique-o:apiVersion: v1 kind: Service metadata: name: tea-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: tea type: NodePortkubectl apply -f tea-svc.yaml -
Crie o arquivo
tea-ingress.yamle aplique-o:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tea-ingress spec: ingressClassName: alb rules: - host: demo.domain.ingress.top # Replace with your domain name, resolved to the load balancer IP. http: paths: - path: / pathType: Prefix backend: service: name: tea-svc port: number: 80kubectl apply -f tea-ingress.yaml
Etapa 2: Implantar o Service canary e as regras de roteamento
Implante o Service canary com dois Ingresses canary: um roteia por header e o outro divide o tráfego restante por peso.
Antes de aplicar os Ingresses canary:
Defina
alb.ingress.kubernetes.io/canary: "true"em todo Ingress canary. Sem isso, o Ingress canary entra em conflito com a produção.O campo
hostdeve corresponder exatamente ao host do Ingress de produção (demo.domain.ingress.topneste exemplo).Regras baseadas em header e baseadas em peso devem estar em Ingresses separados.
-
Crie o arquivo
canary-deploy.yamle aplique-o:apiVersion: apps/v1 kind: Deployment metadata: name: canary spec: replicas: 1 selector: matchLabels: app: canary template: metadata: labels: app: canary spec: containers: - name: canary image: registry.cn-hangzhou.aliyuncs.com/acs-sample/new-nginx:latest ports: - containerPort: 80kubectl apply -f canary-deploy.yaml -
Crie o arquivo
canary-svc.yamle aplique-o:apiVersion: v1 kind: Service metadata: name: canary-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: canary type: NodePortkubectl apply -f canary-svc.yaml -
Crie um Ingress canary baseado em header. Requisições com
location: hzsão roteadas paracanary-svc; outros headers seguem para a próxima regra. Crie o arquivocanary-header-ingress.yamle aplique-o:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/canary: "true" alb.ingress.kubernetes.io/canary-by-header: "location" alb.ingress.kubernetes.io/canary-by-header-value: "hz" name: canary-header-ingress namespace: default spec: ingressClassName: alb rules: - host: demo.domain.ingress.top # Must match the production Ingress host exactly. http: paths: - backend: service: name: canary-svc port: number: 80 path: / pathType: Prefixkubectl apply -f canary-header-ingress.yaml -
Crie um Ingress canary baseado em peso. Requisições sem correspondência são divididas 50/50 entre os Services de produção e canary. Crie o arquivo
canary-weight-ingress.yamle aplique-o:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/canary: "true" alb.ingress.kubernetes.io/canary-weight: "50" name: canary-weight-ingress namespace: default spec: ingressClassName: alb rules: - host: demo.domain.ingress.top # Must match the production Ingress host exactly. http: paths: - backend: service: name: canary-svc port: number: 80 path: / pathType: Prefixkubectl apply -f canary-weight-ingress.yaml
Verifique a implantação canary
-
Obtenha o endereço da instância ALB:
kubectl get ingSaída esperada:
NAME CLASS HOSTS ADDRESS PORTS AGE canary-header-ingress alb demo.domain.ingress.top alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com 80 8m23s canary-weight-ingress alb demo.domain.ingress.top alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com 80 8m16s tea-ingress alb demo.domain.ingress.top alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com 80 7m5s -
Verifique se as requisições com o header
location: hzsempre chegam ao canary:for i in $(seq 1 10); do curl -s -H "Host:demo.domain.ingress.top" -H "location:hz" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com; doneTodas as 10 respostas retornam
new. A regra de header tem a maior prioridade e roteia todas as requisições correspondentes para o canary. -
Confirme que as requisições sem um header correspondente são divididas aproximadamente 50/50:
for i in $(seq 1 10); do curl -s -H "Host:demo.domain.ingress.top" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com; doneAs respostas alternam entre
new(canary) eold(produção), aproximadamente metade para cada. Headers sem correspondência (por exemplo,location: bj) seguem a mesma divisão baseada em peso.
Etapa 3: Promover a nova versão
Após a estabilização do canary, redirecione todo o tráfego de produção para o novo Service e exclua os Ingresses canary.
-
Atualize o arquivo
tea-ingress.yamlpara apontar paracanary-svc:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tea-ingress spec: ingressClassName: alb rules: - host: demo.domain.ingress.top http: paths: - path: / pathType: Prefix backend: service: name: canary-svc # Changed from tea-svc. port: number: 80kubectl apply -f tea-ingress.yaml -
Exclua os Ingresses canary:
kubectl delete ing canary-weight-ingress canary-header-ingress -
Verifique se todo o tráfego chega à nova versão:
for i in $(seq 1 10); do curl -s -H "Host:demo.domain.ingress.top" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com; doneTodas as 10 respostas retornam
new. A versão antiga do Service foi totalmente descontinuada.
Próximas etapas
Consulte Advanced ALB Ingress configurations para redirecionamentos de HTTP para HTTPS, regras de roteamento personalizadas e mais.
Para solução de problemas, consulte Ingress FAQ.