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.
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)
Étape | Commandes / actions | Explications |
---|---|---|
1) Vérifier Helm | helm version # Helm ≥ 3.8.0 : support OCI natif # Helm 3.7.x et antérieurs : # export HELM_EXPERIMENTAL_OCI=1 | Helm 3.8+ active OCI par défaut. En versions antérieures, il faut activer la variable expérimentale. |
2) (Optionnel) S’authentifier sur MCR | helm registry login mcr.microsoft.com # L’accès est public pour les charts ; utile si proxy/filtrage d’entreprise | L’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.3 | Toutes les versions ≥ 1.5.0 (hors RC) sont publiées dans MCR. |
4) Installer / mettre à niveau | helm 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 repo | helm repo remove application-gateway-kubernetes-ingress || true | Élimine la source obsolète qui provoque l’erreur 409. |
6) Vérifier l’exécution | kubectl get pods -n agic | grep ingress-azure kubectl logs -n agic deploy/ingress-azure --tail=200 | Confirmez 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ôme | Cause probable | Correctif |
---|---|---|
409 Public access is not permitted... | Ancienne URL Blob encore référencée | Supprimer l’ancien repo et utiliser l’URI OCI MCR. |
not found sur une version (ex. 1.7.5) | Mauvais chemin OCI ou version inexistante | Chemin correct : oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure . Vérifier la version. |
Erreur unknown command registry | Helm trop ancien | Mettre à jour Helm ≥ 3.8.0 ou activer HELM_EXPERIMENTAL_OCI pour 3.7.x. |
Timeout d’installation | Probes qui échouent, quotas, RBAC | Augmenter --timeout , revoir les values , vérifier les Events et les limites de ressources. |
CI/CD derrière proxy d’entreprise | Blocage vers mcr.microsoft.com | Autoriser 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
- Inventaire : localiser tous les scripts/pipelines utilisant AGIC (références Helm, Terraform, Flux, Argo CD).
- Remplacement : mettre à jour les URI vers le chemin OCI MCR.
- Sécurité : valider les règles de sortie (egress) vers MCR et activer la journalisation.
- Reproductibilité : consigner version de chart, digest/tarball,
values.yaml
. - Surveillance : créer des alertes sur les erreurs d’ingress et les codes 5xx en amont de Gateway.
- 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
- Constater : reproduire l’erreur avec la commande historique et archiver la sortie de l’outil CI.
- Mettre à jour : remplacer les références par l’URI OCI et supprimer l’ancien repo Helm.
- Tester : exécuter
helm pull
, puishelm install/upgrade
sur un namespace de pré‑production. - Valider : contrôler pods, logs, Events et la connectivité de l’Application Gateway.
- Déployer : propager les changements à tous les environnements et verrouiller la version.
- 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é.