Lors des mises à niveau de services, utilisez les déploiements canaris pour maintenir la stabilité du système. Les Ingress ALB prennent en charge les annotations canaries basées sur l'en-tête, le cookie ou le poids (priorité : en-tête > cookie > poids). Acheminez une partie du trafic vers la nouvelle version du Service en production, validez-la, puis promouvez-la lorsque vous êtes prêt.
Prérequis
Effectuez les opérations suivantes :
Deux vSwitch dans différentes zones au sein du même VPC que le cluster ACK. Consultez Créer et gérer un vSwitch.
-
Contrôleur Ingress ALB installé dans le cluster. Consultez Gérer le contrôleur Ingress ALB.
Pour les clusters dédiés ACK, accordez au cluster les permissions nécessaires pour accéder à Ingress ALB. Consultez Autoriser un cluster dédié ACK à accéder au contrôleur Ingress ALB .
AlbConfig créé. Consultez Créer un AlbConfig.
kubectl connecté au cluster ACK. Consultez Obtenir le fichier kubeconfig d'un cluster et utiliser kubectl pour se connecter au cluster.
Annotations canaries
Chaque Ingress canari nécessite l'annotation alb.ingress.kubernetes.io/canary: "true". Sans celle-ci, l'Ingress canari entre en conflit avec la production au lieu de router le trafic conjointement.
Ces annotations contrôlent la répartition du trafic :
| Annotation | Description |
|---|---|
alb.ingress.kubernetes.io/canary |
Identifie l'Ingress comme canari. Définissez la valeur sur "true". Obligatoire sur chaque Ingress canari. |
alb.ingress.kubernetes.io/canary-by-header |
Clé d'en-tête de requête à faire correspondre. Les requêtes correspondantes sont acheminées vers le Service canari. |
alb.ingress.kubernetes.io/canary-by-header-value |
Valeur d'en-tête à faire correspondre. Nécessite canary-by-header ; ignorée si cette annotation n'est pas définie. |
alb.ingress.kubernetes.io/canary-weight |
Pourcentage de trafic (0–100) destiné au Service canari lorsqu'aucune règle d'en-tête ou de cookie ne correspond. 0 n'envoie aucun trafic ; 100 envoie tout le trafic. |
alb.ingress.kubernetes.io/order |
Ordre d'évaluation des règles de routage. Valeurs valides : 1–1000. Par défaut : 10. Les valeurs plus faibles ont une priorité plus élevée. Sans cette annotation, l'ordre suit le tri lexicographique de l'espace de noms et du nom de l'Ingress. |
Priorité des règles : basé sur l'en-tête > basé sur le cookie > basé sur le poids.
Notes d'utilisation
Les règles basées sur les en-têtes et les cookies ne peuvent pas partager un Ingress avec des règles basées sur le poids. Utilisez des Ingress distincts ou règles de routage personnalisées pour des conditions complexes.
L'hôte de l'Ingress canari doit correspondre exactement à l'hôte de l'Ingress de production.
Définissez explicitement la priorité avec
alb.ingress.kubernetes.io/orderlorsque plusieurs Ingress canaris partagent un hôte, plutôt que de compter sur l'ordre lexicographique.
Étape 1 : Déployer le Service de production
Déployez le Deployment, le Service et l'Ingress de production.
-
Créez
tea-deploy.yamlet appliquez-le :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 -
Créez
tea-svc.yamlet appliquez-le :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 -
Créez
tea-ingress.yamlet appliquez-le :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
Étape 2 : Déployer le Service canari et les règles de routage
Déployez le Service canari avec deux Ingress canaris : l'un route par en-tête, l'autre répartit le trafic restant par poids.
Avant d'appliquer les Ingress canaris :
Définissez
alb.ingress.kubernetes.io/canary: "true"sur chaque Ingress canari. Sans cela, l'Ingress canari entre en conflit avec la production.Le champ
hostdoit correspondre exactement à l'hôte de l'Ingress de production (demo.domain.ingress.topdans cet exemple).Les règles basées sur les en-têtes et celles basées sur le poids doivent figurer sur des Ingress distincts.
-
Créez
canary-deploy.yamlet appliquez-le :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 -
Créez
canary-svc.yamlet appliquez-le :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 -
Créez un Ingress canari basé sur l'en-tête. Les requêtes contenant
location: hzsont acheminées verscanary-svc; les autres en-têtes passent à la règle suivante. Créezcanary-header-ingress.yamlet appliquez-le :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 -
Créez un Ingress canari basé sur le poids. Les requêtes ne correspondant pas sont réparties à 50/50 entre les Services de production et canari. Créez
canary-weight-ingress.yamlet appliquez-le :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
Vérifier le déploiement canari
-
Obtenez l'adresse de l'instance ALB :
kubectl get ingRésultat attendu :
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 -
Vérifiez que les requêtes portant
location: hzatteignent toujours le canari :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; doneLes 10 réponses retournent
new. La règle d'en-tête possède la priorité la plus élevée et achemine toutes les requêtes correspondantes vers le canari. -
Vérifiez que les requêtes sans en-tête correspondant sont réparties environ à 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; doneLes réponses alternent entre
new(canari) etold(production), soit environ la moitié pour chacune. Les en-têtes non correspondants (par exemple,location: bj) suivent la même répartition basée sur le poids.
Étape 3 : Promouvoir la nouvelle version
Une fois le canari stabilisé, redirigez tout le trafic de production vers le nouveau Service et supprimez les Ingress canaris.
-
Mettez à jour
tea-ingress.yamlpour pointer verscanary-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 -
Supprimez les Ingress canaris :
kubectl delete ing canary-weight-ingress canary-header-ingress -
Vérifiez que tout le trafic atteint la nouvelle version :
for i in $(seq 1 10); do curl -s -H "Host:demo.domain.ingress.top" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com; doneLes 10 réponses retournent
new. L'ancienne version du Service est entièrement obsolète.
Étapes suivantes
Consultez Configurations avancées des Ingress ALB pour les redirections HTTP vers HTTPS, les règles de routage personnalisées, etc.
Consultez FAQ sur les Ingress pour le dépannage.