Skip to content

ADR 023 — Exposition publique de l'UI ArgoCD (2026-06-22)

Statut

Accepté (2026-06-22), validé en live le 2026-06-23. Issue #105 (MR2, exposition). Fait suite à l'ADR 022 (MR1, authentification admin via ESO) : on ouvre la porte aprÚs avoir verrouillé l'auth. Sprint 5 (accÚs plateforme).

Contexte

ArgoCD n'était accessible qu'en kubectl port-forward. On veut un accÚs web stable argocd.devopsyouss.com pour la démo portfolio (montrer la console GitOps en entretien).

Exposer ArgoCD = exposer les clés du royaume GitOps. C'est assumé et borné : - l'authentification est durcie au préalable (ADR 022 : mot de passe admin géré par ESO, jamais le défaut) ; - le SSO OIDC (#106) viendra ensuite, aprÚs quoi l'admin deviendra un accÚs break-glass ; - on réutilise la stack d'exposition existante (#76 Grafana, ADR 010) : Gateway partagé + cert wildcard, aucune surface réseau nouvelle.

DĂ©cision 1 — Exposition via le Gateway partagĂ© (HTTPRoute)

Un HTTPRoute argocd.devopsyouss.com (ns argocd) → argocd-server:80, attachĂ© au Gateway fastapi-gateway (ns fastapi) cross-namespace (allowedRoutes:from:All, posĂ© en #76). Le cert wildcard *.devopsyouss.com couvre dĂ©jĂ  le sous-domaine ; ExternalDNS crĂ©e le CNAME automatiquement depuis le hostname (#66).

MĂȘmes choix d'ownership que Grafana (ADR 010) : la route vit avec son service (ns argocd, dossier k8s/platform/argocd/), dĂ©ployĂ©e par l'Application argocd-config. ÉcartĂ© : exposer via un Service LoadBalancer dĂ©diĂ© (ELB en plus, redondant avec le Gateway L7 existant) ou un Ingress sĂ©parĂ© (le projet est tout en Gateway API).

DĂ©cision 2 — server.insecure: true (TLS terminĂ© au Gateway)

Par dĂ©faut argocd-server fait lui-mĂȘme du TLS. DerriĂšre un Gateway qui termine dĂ©jĂ  le TLS, ça donne du TLS-sur-TLS : boucle de redirection HTTP→HTTPS et/ou 502 sur le gRPC. On passe donc le serveur en server.insecure: true : il sert l'UI, l'API et le gRPC-Web en clair sur le port 80, et le Gateway gĂšre le HTTPS public (cert wildcard). C'est le mode recommandĂ© d'ArgoCD derriĂšre un ingress/proxy TLS.

Le trafic public reste chiffrĂ© (HTTPS jusqu'au Gateway) ; le segment Gateway→pod est en clair dans le cluster (rĂ©seau overlay Cilium), acceptable ici (pas de mTLS intra-cluster dans ce projet). Alternative Ă©cartĂ©e : TLS passthrough (le Gateway ne verrait plus le L7, perte des bĂ©nĂ©fices Envoy ; et gestion du cert cĂŽtĂ© ArgoCD).

DĂ©cision 3 — server.insecure vit dans le bootstrap Ansible, la route en GitOps

server.insecure est un paramĂštre d'installation du serveur (clĂ© server.insecure du ConfigMap argocd-cmd-params-cm, posĂ©e par le chart). Il vit donc dans les values du helm install ArgoCD, c'est-Ă -dire dans le bootstrap Ansible (lĂ  oĂč ArgoCD est installĂ©, poule/Ɠuf). Le HTTPRoute, ressource d'exposition, vit en GitOps (k8s/platform/argocd/, Application argocd-config), comme httproute-grafana.yaml cĂŽtĂ© monitoring. Chaque chose Ă  sa place.

PiÚges traités / à valider

  • TLS-sur-TLS : rĂ©glĂ© par server.insecure (cf. DĂ©cision 2).
  • gRPC-Web (CLI argocd) : avec server.insecure et un seul port HTTP, ArgoCD sert le gRPC-Web sur le 80. ValidĂ© live le 2026-06-23 : argocd login argocd.devopsyouss.com --grpc-web passe Ă  travers le Gateway (argocd app list OK).
  • Ordre cert/Gateway : le cert wildcard doit ĂȘtre Ready avant le Gateway (dĂ©jĂ  le cas depuis #76, le listener HTTPS rĂ©fĂ©rence wildcard-devopsyouss-tls).

Conséquences

  • ValidĂ© en live le 2026-06-23 : argocd.devopsyouss.com en HTTPS (cert wildcard, ssl_verify_result: 0), login admin (mot de passe ESO, ADR 022), pas de boucle de redirection, CLI gRPC-Web OK. Hors infra : kustomize build, ansible syntax-check, mkdocs.
  • Aucun ELB nouveau : on rĂ©utilise le NLB du Gateway partagĂ© (#70). Teardown par cascade (le HTTPRoute part avec l'Application, CNAME retirĂ© par ExternalDNS).
  • Surface d'attaque : une UI d'admin de plus en public, mitigĂ©e par l'auth ESO et (Ă  venir) le SSO #106.

Évolution possible

  • SSO OIDC GitHub (#106) : login unique, RBAC readonly par dĂ©faut, admin en break-glass (admin.enabled: false Ă  terme).
  • Keycloak central sur le homelab : IdP cross-cluster (suite de #106).
  • Restreindre l'accĂšs (allowlist IP, SecurityPolicy Envoy) si besoin de durcir.

Date : 2026-06-22 Sprint : 5 Issue : #105