Aller au contenu principal

Concepts fondamentaux


Table des matières

  1. Application
  2. Project
  3. Repository
  4. Sync et Health Status
  5. Resource Hooks
  6. Exercices pratiques

1 - Application

Définition

Une Application Argo CD représente un ensemble de ressources Kubernetes déployées à partir d'une source Git.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
spec:
project: default

source:
repoURL: https://github.com/org/gitops-repo.git
targetRevision: HEAD
path: apps/my-app

destination:
server: https://kubernetes.default.svc
namespace: default

Structure d'une Application

Champs principaux

ChampDescription
projectProjet Argo CD (default par défaut)
source.repoURLURL du repository Git
source.pathChemin vers les manifests
source.targetRevisionBranche, tag ou commit
destination.serverURL du cluster K8s
destination.namespaceNamespace cible

🔝 Retour à la table des matières


2 - Project

Définition

Un Project définit des contraintes et permissions pour un groupe d'applications.

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: production
namespace: argocd
spec:
description: "Production applications"

# Repositories autorisés
sourceRepos:
- https://github.com/org/gitops-prod.git

# Clusters autorisés
destinations:
- namespace: production
server: https://kubernetes.default.svc
- namespace: monitoring
server: https://kubernetes.default.svc

# Ressources autorisées
clusterResourceWhitelist:
- group: ''
kind: Namespace

namespaceResourceWhitelist:
- group: 'apps'
kind: Deployment
- group: ''
kind: Service

Le projet "default"

# Projet default - permet tout
spec:
sourceRepos:
- '*'
destinations:
- namespace: '*'
server: '*'
clusterResourceWhitelist:
- group: '*'
kind: '*'

Cas d'usage des Projects

ScénarioConfiguration
Multi-tenantUn projet par équipe
SécuritéLimiter les clusters/namespaces
ComplianceRestreindre les ressources K8s

🔝 Retour à la table des matières


3 - Repository

Types de sources

TypeDescriptionExemple
DirectoryManifests YAML brutspath: apps/
HelmChart Helmchart: nginx
KustomizeKustomizationpath: overlays/prod
JsonnetFichiers Jsonnetpath: jsonnet/

Source Directory (YAML)

spec:
source:
repoURL: https://github.com/org/gitops.git
path: apps/my-app
directory:
recurse: true
include: '*.yaml'

Source Helm

spec:
source:
repoURL: https://charts.bitnami.com/bitnami
chart: nginx
targetRevision: 15.0.0
helm:
values: |
replicaCount: 3
service:
type: ClusterIP

Source Kustomize

spec:
source:
repoURL: https://github.com/org/gitops.git
path: apps/my-app/overlays/prod
kustomize:
images:
- name: my-app
newTag: v1.2.3

Ajouter un repository privé

# Via CLI - HTTPS avec token
argocd repo add https://github.com/org/private-repo.git \
--username git \
--password ghp_xxxxxxxxxxxx

# Via CLI - SSH
argocd repo add [email protected]:org/private-repo.git \
--ssh-private-key-path ~/.ssh/id_rsa

🔝 Retour à la table des matières


4 - Sync et Health Status

Sync Status

StatusDescription
SyncedÉtat cluster = état Git
OutOfSyncDifférence détectée
UnknownImpossible de déterminer

Health Status

StatusDescription
HealthyToutes les ressources OK
ProgressingEn cours de déploiement
DegradedProblème détecté
SuspendedVolontairement pausé
MissingRessource n'existe pas

Voir le status

# Via CLI
argocd app get my-app

# Résultat
Name: my-app
Project: default
Server: https://kubernetes.default.svc
Namespace: default
URL: https://argocd.example.com/applications/my-app
Sync Status: Synced
Health Status: Healthy

🔝 Retour à la table des matières


5 - Resource Hooks

Types de hooks

HookExécution
PreSyncAvant la synchronisation
SyncPendant la synchronisation
PostSyncAprès la synchronisation
SyncFailSi la sync échoue

Exemple : Migration de base de données

apiVersion: batch/v1
kind: Job
metadata:
name: db-migration
annotations:
argocd.argoproj.io/hook: PreSync
argocd.argoproj.io/hook-delete-policy: HookSucceeded
spec:
template:
spec:
containers:
- name: migrate
image: my-app:latest
command: ["./migrate.sh"]
restartPolicy: Never

Hook Delete Policies

PolicyComportement
HookSucceededSupprime si succès
HookFailedSupprime si échec
BeforeHookCreationSupprime avant recréation

🔝 Retour à la table des matières


6 - Exercices pratiques

Quiz

Q1. Quelle est la différence entre Synced et Healthy ?

Réponse
  • Synced : L'état dans le cluster correspond à l'état dans Git
  • Healthy : Les ressources Kubernetes fonctionnent correctement (pods running, etc.)

Une application peut être Synced mais pas Healthy (ex: pods en CrashLoopBackOff).

Q2. À quoi sert un AppProject ?

Réponse

Un AppProject définit des contraintes de sécurité :

  • Quels repositories peuvent être utilisés
  • Quels clusters/namespaces sont autorisés
  • Quelles ressources K8s peuvent être créées

C'est essentiel pour le multi-tenant et la sécurité.

Exercice : Créer un Project

# production-project.yaml
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: production
namespace: argocd
spec:
description: "Applications de production"
sourceRepos:
- https://github.com/org/gitops-prod.git
destinations:
- namespace: production
server: https://kubernetes.default.svc
clusterResourceWhitelist:
- group: ''
kind: Namespace
kubectl apply -f production-project.yaml

🔝 Retour à la table des matières


Points clés à retenir

  • Application = définition du déploiement
  • Project = contraintes de sécurité
  • Repository = source Git (YAML, Helm, Kustomize)
  • Sync Status = comparaison Git vs Cluster
  • Health Status = état des ressources K8s
  • Hooks = actions pendant le sync

← Chapitre précédent | Chapitre suivant : Applications →