Blog

GitOps avec ArgoCD sur OpenShift

OpenShift
ArgoCD
GitOps
Kubernetes

Déploiement et configuration d'ArgoCD sur OpenShift pour mettre en place une stratégie GitOps robuste : installation via l'Operator, ApplicationSets, RBAC et synchronisation multi-cluster.

15 novembre 2024

Pourquoi GitOps sur OpenShift ?

OpenShift est la plateforme Kubernetes de Red Hat, utilisée massivement en entreprise. Coupler OpenShift avec une approche GitOps — où Git est la source de vérité pour l’état du cluster — apporte des bénéfices concrets : traçabilité des changements, rollback fiable, déploiements reproductibles et réduction du drift de configuration.

ArgoCD est aujourd’hui le standard de facto pour le GitOps sur Kubernetes. Red Hat le propose sous le nom OpenShift GitOps, un Operator certifié intégré nativement à OpenShift.


Installation via l’Operator OpenShift GitOps

La méthode recommandée est d’installer ArgoCD via l’OperatorHub d’OpenShift.

# Via la CLI oc — créer la souscription à l'Operator
cat <<EOF | oc apply -f -
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: openshift-gitops-operator
  namespace: openshift-operators
spec:
  channel: latest
  installPlanApproval: Automatic
  name: openshift-gitops-operator
  source: redhat-operators
  sourceNamespace: openshift-marketplace
EOF

Une fois l’Operator installé, une instance ArgoCD est automatiquement créée dans le namespace openshift-gitops. Elle est accessible via la route créée par l’Operator :

oc get route openshift-gitops-server -n openshift-gitops

Pour récupérer le mot de passe admin initial :

oc extract secret/openshift-gitops-cluster \
  -n openshift-gitops --to=-

Créer une Application ArgoCD

Une Application ArgoCD décrit ce que l’on veut déployer et depuis quel dépôt Git.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: mon-app
  namespace: openshift-gitops
spec:
  project: default
  source:
    repoURL: https://github.com/mon-org/mon-repo.git
    targetRevision: main
    path: deploy/overlays/production
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

Le champ automated active la synchronisation automatique :

  • prune: true — supprime les ressources retirées du dépôt Git
  • selfHeal: true — resynchronise si quelqu’un modifie le cluster manuellement

ApplicationSets : gérer plusieurs clusters ou environnements

L’ApplicationSet est un générateur d’Applications ArgoCD. Il évite de dupliquer des manifests pour chaque environnement ou cluster.

Exemple avec le générateur List (multi-environnements)

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: mon-app-envs
  namespace: openshift-gitops
spec:
  generators:
    - list:
        elements:
          - env: dev
            cluster: https://dev-api.cluster.example.com
            namespace: mon-app-dev
          - env: staging
            cluster: https://staging-api.cluster.example.com
            namespace: mon-app-staging
          - env: production
            cluster: https://prod-api.cluster.example.com
            namespace: mon-app-prod
  template:
    metadata:
      name: "mon-app-{{env}}"
    spec:
      project: default
      source:
        repoURL: https://github.com/mon-org/mon-repo.git
        targetRevision: main
        path: "deploy/overlays/{{env}}"
      destination:
        server: "{{cluster}}"
        namespace: "{{namespace}}"
      syncPolicy:
        automated:
          prune: true
          selfHeal: true

Générateur Git (dossiers comme environnements)

generators:
  - git:
      repoURL: https://github.com/mon-org/mon-repo.git
      revision: main
      directories:
        - path: deploy/clusters/*

RBAC et intégration SSO OpenShift

ArgoCD s’intègre nativement avec le SSO OpenShift via Dex ou directement avec OpenShift OAuth. Les droits dans ArgoCD sont mappés depuis les groupes OpenShift.

# Dans le ConfigMap argocd-rbac-cm
apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-rbac-cm
  namespace: openshift-gitops
data:
  policy.default: role:readonly
  policy.csv: |
    # Les membres du groupe openshift-admins sont admins ArgoCD
    g, openshift-admins, role:admin
    # Les devs peuvent synchroniser leurs apps
    g, dev-team, role:developer
    p, role:developer, applications, sync, */*, allow
    p, role:developer, applications, get, */*, allow

Gestion du drift et notifications

ArgoCD détecte automatiquement le drift (écart entre Git et l’état réel du cluster). Vous pouvez configurer des notifications vers Slack, Teams ou e-mail :

# Installer le contrôleur de notifications ArgoCD
oc apply -n openshift-gitops \
  -f https://raw.githubusercontent.com/argoproj-labs/argocd-notifications/release-1.2/manifests/install.yaml

Exemple de notification Slack sur état OutOfSync :

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
  namespace: openshift-gitops
data:
  trigger.on-sync-status-unknown: |
    - when: app.status.sync.status == 'OutOfSync'
      send: [slack-message]
  template.slack-message: |
    message: |
      Application {{.app.metadata.name}} est OutOfSync !
      Repo: {{.app.spec.source.repoURL}}

Bonnes pratiques

  • Séparer la configuration applicative du code — dépôt Git dédié aux manifests
  • Utiliser Kustomize ou Helm comme outil de templating (ArgoCD supporte les deux nativement)
  • Activer syncOptions: ServerSideApply=true pour les objets volumineux (CRDs, etc.)
  • Définir des AppProjects pour isoler les équipes et restreindre les namespaces/repos autorisés
  • Implémenter des health checks custom pour les CRDs OpenShift (Routes, DeploymentConfigs)
# AppProject restrictif pour une équipe
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: equipe-a
  namespace: openshift-gitops
spec:
  sourceRepos:
    - 'https://github.com/mon-org/equipe-a-*'
  destinations:
    - namespace: 'equipe-a-*'
      server: https://kubernetes.default.svc
  clusterResourceWhitelist:
    - group: ''
      kind: Namespace

Conclusion

ArgoCD sur OpenShift offre une expérience GitOps mature et bien intégrée à l’écosystème Red Hat. L’Operator OpenShift GitOps simplifie considérablement le déploiement et la mise à jour d’ArgoCD. Combiné aux ApplicationSets pour le multi-cluster et au RBAC OpenShift, il constitue un socle solide pour des déploiements à grande échelle.