Erreur Helm 409 sur AGIC : migration OCI MCR, correctifs et bonnes pratiques AKS

Depuis septembre 2024, la récupération du chart Helm d’AGIC échoue avec « 409 Public access… ». Cause : fin d’accès anonyme à l’ancien dépôt et migration des charts vers le registre OCI de MCR. Voici comment corriger rapidement et fiabiliser durablement vos pipelines AKS.

Sommaire

Impossibilité de récupérer le chart Helm application‑gateway‑kubernetes‑ingress (AGIC)

Vue d’ensemble du problème

À partir du 10 septembre 2024, la commande historique :

helm pull application-gateway-kubernetes-ingress/ingress-azure

retourne l’erreur :

409 Public access is not permitted on this storage account

Conséquence : tout déploiement AKS s’appuyant sur AGIC via l’ancien repo Helm se retrouve bloqué (CI/CD, installeurs scripts, IaC).

Cause identifiée

  • Microsoft a désactivé l’accès anonyme au conteneur Blob historique appgwingress.blob.core.windows.net qui servait les charts AGIC.
  • Les charts ont été migrés vers un registre OCI dans Microsoft Container Registry (MCR). L’installation et les mises à jour doivent désormais cibler oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure.

Solution express : basculer vers le registre OCI (MCR)

ÉtapeCommandes / actionsExplications
1) Vérifier Helmhelm version # Helm ≥ 3.8.0 : support OCI natif # Helm 3.7.x et antérieurs : # export HELM_EXPERIMENTAL_OCI=1Helm 3.8+ active OCI par défaut. En versions antérieures, il faut activer la variable expérimentale.
2) (Optionnel) S’authentifier sur MCRhelm registry login mcr.microsoft.com # L’accès est public pour les charts ; utile si proxy/filtrage d’entrepriseL’authentification n’est pas toujours requise, mais peut être nécessaire avec des proxys d’entreprise.
3) Récupérer le chart depuis MCR (OCI)helm pull oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure \ --version 1.7.3 # Inspection tar tvf ingress-azure-1.7.3.tgz helm show chart oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure \ --version 1.7.3 helm show values oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure \ --version 1.7.3Toutes les versions ≥ 1.5.0 (hors RC) sont publiées dans MCR.
4) Installer / mettre à niveauhelm install ingress-azure \ oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure \ --version 1.7.3 -f values.yaml --namespace agic --create-namespace # ou mise à niveau : helm upgrade ingress-azure oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure --version 1.7.3 -f values.yaml --namespace agic --atomic--atomic garantit un rollback automatique en cas d’échec.
5) Nettoyer l’ancien repohelm repo remove application-gateway-kubernetes-ingress || trueÉlimine la source obsolète qui provoque l’erreur 409.
6) Vérifier l’exécutionkubectl get pods -n agic | grep ingress-azure kubectl logs -n agic deploy/ingress-azure --tail=200Confirmez que le pod se redémarre sur la nouvelle version et que les probes sont au vert.

Mise à jour des pipelines CI/CD et des outils IaC

Recherches à effectuer dans le code

  • Chaînes à supprimer/mettre à jour : application-gateway-kubernetes-ingress/ingress-azure, appgwingress.blob.core.windows.net, helm repo add ...appgwingress....
  • Remplacer par l’URI OCI : oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure.

GitHub Actions : exemple

name: agic-helm-deploy
on: [push]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: azure/setup-helm@v4
      - name: Helm login (optionnel)
        run: helm registry login mcr.microsoft.com
      - name: Deploy AGIC (OCI)
        run: |
          helm upgrade --install ingress-azure \
            oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure \
            --version 1.7.3 -f helm/values.yaml \
            --namespace agic --create-namespace --atomic

Azure DevOps Pipeline (YAML)

steps:
- task: HelmInstaller@1
  inputs:
    helmVersionToInstall: '3.13.0'
- script: helm registry login mcr.microsoft.com
  displayName: 'Helm login (optionnel)'
- script: |
    helm upgrade --install ingress-azure \
      oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure \
      --version 1.7.3 -f values.yaml --namespace agic --create-namespace --atomic
  displayName: 'Deploy AGIC via OCI'

Terraform (Helm provider)

Déclarez le dépôt OCI directement dans la ressource helm_release :

resource "helm_release" "agic" {
  name       = "ingress-azure"
  namespace  = "agic"
  create_namespace = true

repository = "oci://mcr.microsoft.com/azure-application-gateway/charts"
chart      = "ingress-azure"
version    = "1.7.3"

values = [file("${path.module}/values.yaml")]
wait   = true
atomic = true
}

Flux CD (HelmRepository de type OCI)

apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: HelmRepository
metadata:
  name: agic-oci
  namespace: flux-system
spec:
  type: oci
  interval: 10m
  url: oci://mcr.microsoft.com/azure-application-gateway/charts
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: ingress-azure
  namespace: agic
spec:
  interval: 10m
  chart:
    spec:
      chart: ingress-azure
      version: "1.7.3"
      sourceRef:
        kind: HelmRepository
        name: agic-oci
        namespace: flux-system
  values:
    # vos valeurs...

Argo CD (source OCI)

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: agic
spec:
  project: default
  destination:
    server: https://kubernetes.default.svc
    namespace: agic
  source:
    repoURL: oci://mcr.microsoft.com/azure-application-gateway/charts
    chart: ingress-azure
    targetRevision: 1.7.3
    helm:
      values: |
        # vos valeurs...
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

Contrôles post‑migration

  • Pod et déploiement : kubectl -n agic get deploy,rs,pods.
  • Probes : vérifier les événements : kubectl -n agic describe pod <pod>.
  • Ingress : kubectl get ingress -A et valider les annotations Application Gateway.
  • Logs : kubectl logs -n agic deploy/ingress-azure --tail=500.
  • Routage : tests de santé HTTP/HTTPS côté Application Gateway.

Contournements rapides si la bascule OCI n’est pas immédiate

  • Chart local vendorisé : extraire et versionner le chart dans un registre interne (Artifactory, Harbor, ChartMuseum). Exemple : helm pull oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure \ --version 1.7.3 --untar # Commiter dans un repo interne ou publier dans votre registre privé
  • Gel de version : conserver la révision AGIC déjà installée et empêcher les upgrades automatiques : helm upgrade ingress-azure ... --version 1.7.3 --reset-values

Bonnes pratiques pour des déploiements Helm robustes

  • Versionnement strict : toujours fixer --version pour éviter l’« upgrade » implicite.
  • Épinglage des dépendances : si le chart AGIC référence d’autres charts, verrouiller leurs versions.
  • Paramètres critiques en values.yaml : ressource Application Gateway, subscriptionId, resourceGroup, watchNamespace, règles WAF, etc.
  • Atomicité : utiliser --atomic et --timeout adaptés pour éviter les états intermédiaires.
  • Observabilité : exposer des métriques et logs (Azure Monitor, Prometheus/Grafana) pour détecter précocement les régressions.
  • Reproductibilité : archiver le chart tgz et le values.yaml effectif au moment de chaque release.
  • Conformité réseau : autoriser les flux sortants vers mcr.microsoft.com si egress filtré (pare‑feu, proxy).

Erreurs fréquentes et correctifs

SymptômeCause probableCorrectif
409 Public access is not permitted...Ancienne URL Blob encore référencéeSupprimer l’ancien repo et utiliser l’URI OCI MCR.
not found sur une version (ex. 1.7.5)Mauvais chemin OCI ou version inexistanteChemin correct : oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure. Vérifier la version.
Erreur unknown command registryHelm trop ancienMettre à jour Helm ≥ 3.8.0 ou activer HELM_EXPERIMENTAL_OCI pour 3.7.x.
Timeout d’installationProbes qui échouent, quotas, RBACAugmenter --timeout, revoir les values, vérifier les Events et les limites de ressources.
CI/CD derrière proxy d’entrepriseBlocage vers mcr.microsoft.comAutoriser le domaine dans le proxy/pare‑feu, tester via curl et helm registry login.

Lister les versions disponibles (facultatif)

Helm ne liste pas nativement les tags d’un repo OCI. Deux options courantes :

  • ORAS CLI : oras repo tags mcr.microsoft.com/azure-application-gateway/charts/ingress-azure
  • crane (go-containerregistry) : crane ls mcr.microsoft.com/azure-application-gateway/charts/ingress-azure

Ensuite, installez la version retenue avec helm install ... --version <tag>.

Checklist de migration pour équipes Plateforme

  1. Inventaire : localiser tous les scripts/pipelines utilisant AGIC (références Helm, Terraform, Flux, Argo CD).
  2. Remplacement : mettre à jour les URI vers le chemin OCI MCR.
  3. Sécurité : valider les règles de sortie (egress) vers MCR et activer la journalisation.
  4. Reproductibilité : consigner version de chart, digest/tarball, values.yaml.
  5. Surveillance : créer des alertes sur les erreurs d’ingress et les codes 5xx en amont de Gateway.
  6. Plan B : préparer un vendor interne du chart si la conformité l’exige.

FAQ technique

Faut‑il encore définir un helm repo ?

Non pour AGIC. Avec OCI, on référence directement l’artefact via oci://.... L’usage d’un repo Helm classique n’est plus requis.

Puis‑je vérifier l’intégrité du chart ?

Oui, vous pouvez calculer et stocker l’empreinte du .tgz extrait :

sha256sum ingress-azure-1.7.3.tgz > ingress-azure-1.7.3.tgz.sha256

Conservez ces artefacts avec vos releases pour assurer la traçabilité.

Quid des environnements déconnectés ?

Publiez le chart dans un registre privé interne compatible OCI (Harbor, Artifactory) ou dans un repository Git interne si la politique le permet, puis pointez vos pipelines vers cette source.

AGIC vs Application Gateway for Containers (AGC)

Pour les nouveaux projets, Microsoft recommande désormais AGC. AGIC reste supporté, mais planifiez une trajectoire de migration quand AGC couvre vos cas d’usage. La bascule AGIC→AGC implique un modèle opérateur différent ; commencez par cartographier vos Ingress et annotations spécifiques.

Exemple de values.yaml minimal (à adapter)

appGateway:
  subscriptionId: <SUBSCRIPTION_ID>
  resourceGroup: <RG_NAME>
  name: <APPGW_NAME>
  shared: true
armAuth:
  type: servicePrincipal
  secretJSON: <json-credentials>
watchNamespace:
  - default
  - production
verbosityLevel: 3
# Ajoutez vos annotations/règles, probes et paramètres WAF

Runbook : résolution immédiate de l’erreur 409

  1. Constater : reproduire l’erreur avec la commande historique et archiver la sortie de l’outil CI.
  2. Mettre à jour : remplacer les références par l’URI OCI et supprimer l’ancien repo Helm.
  3. Tester : exécuter helm pull, puis helm install/upgrade sur un namespace de pré‑production.
  4. Valider : contrôler pods, logs, Events et la connectivité de l’Application Gateway.
  5. Déployer : propager les changements à tous les environnements et verrouiller la version.
  6. Documenter : consigner la procédure et les versions déployées pour audit.

Dépannage avancé

  • Conflits de CRD : si vous migrez depuis une version très ancienne, validez la compatibilité des CRD Kubernetes et nettoyez les CR obsolètes si nécessaire.
  • RBAC : assurez‑vous que le ServiceAccount d’AGIC dispose des rôles nécessaires (list/watch sur Ingress, Services, Endpoints, Secrets, etc.).
  • Ressources : ajustez resources.requests/limits pour éviter l’éviction du pod AGIC sous charge.
  • Paramètres App Gateway : confirmez la cohérence du SKU (WAF/WAF_v2), du mode, des règles et des probes.
  • Compatibilité API : surveillez les dépréciations d’API Kubernetes (changement de versions networking.k8s.io).

Escalade et support

Le canal support recommandé est Microsoft Q&A. Les discussions communautaires historiques renvoyant à l’erreur 409 (issue #1644) et aux erreurs d’URI OCI (issue #1695) offrent également un contexte utile. Centralisez vos journaux et captures d’écran lors de l’ouverture d’un ticket.

Résumé exécutif

L’erreur « 409 Public access is not permitted… » provient du retrait de l’accès public au conteneur Blob historique des charts AGIC. La résolution consiste à basculer vers la distribution OCI hébergée sur MCR et à mettre à jour l’ensemble des pipelines et outils IaC. En appliquant la redirection OCI, vos déploiements AGIC reprennent normalement, tout en préparant la transition vers Application Gateway for Containers si/when approprié.

Sommaire