Aller au contenu principal

Multi-cluster


Table des matières

  1. Architecture multi-cluster
  2. Ajouter un cluster
  3. Déployer sur plusieurs clusters
  4. Bonnes pratiques
  5. Exercices pratiques

1 - Architecture multi-cluster

Hub and Spoke

Cluster local par défaut

# Le cluster où Argo CD est installé
# URL : https://kubernetes.default.svc

argocd cluster list
# SERVER NAME STATUS
# https://kubernetes.default.svc in-cluster Successful

Cas d'usage

ScénarioDescription
Multi-envDev, staging, prod sur différents clusters
Multi-régionEU, US, Asia pour la latence
Multi-cloudAWS, GCP, Azure
EdgeClusters edge pour IoT

🔝 Retour à la table des matières


2 - Ajouter un cluster

Via CLI

# Lister les contextes kubectl disponibles
kubectl config get-contexts

# Ajouter un cluster
argocd cluster add my-cluster-context

# Avec un nom personnalisé
argocd cluster add my-cluster-context --name production-eu

Via Secret déclaratif

apiVersion: v1
kind: Secret
metadata:
name: prod-cluster
namespace: argocd
labels:
argocd.argoproj.io/secret-type: cluster
type: Opaque
stringData:
name: production-eu
server: https://prod-eu.example.com
config: |
{
"bearerToken": "<service-account-token>",
"tlsClientConfig": {
"insecure": false,
"caData": "<base64-encoded-ca-cert>"
}
}

Créer un ServiceAccount pour Argo CD

# Sur le cluster distant
apiVersion: v1
kind: ServiceAccount
metadata:
name: argocd-manager
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: argocd-manager
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: argocd-manager
namespace: kube-system

Vérifier la connexion

argocd cluster list

# SERVER NAME STATUS
# https://kubernetes.default.svc in-cluster Successful
# https://prod-eu.example.com production-eu Successful

🔝 Retour à la table des matières


3 - Déployer sur plusieurs clusters

Application sur un cluster spécifique

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp-prod-eu
namespace: argocd
spec:
destination:
server: https://prod-eu.example.com # Cluster distant
namespace: production
source:
repoURL: https://github.com/org/gitops.git
path: apps/myapp

ApplicationSet multi-cluster

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: myapp-all-clusters
namespace: argocd
spec:
generators:
- clusters: {} # Tous les clusters enregistrés
template:
metadata:
name: 'myapp-{{name}}'
spec:
project: default
source:
repoURL: https://github.com/org/gitops.git
path: apps/myapp
destination:
server: '{{server}}'
namespace: default
syncPolicy:
automated:
prune: true

Filtrer par labels

spec:
generators:
- clusters:
selector:
matchLabels:
env: production
region: eu

Ajouter des labels aux clusters

# Secret du cluster avec labels
apiVersion: v1
kind: Secret
metadata:
name: prod-eu-cluster
labels:
argocd.argoproj.io/secret-type: cluster
env: production
region: eu

🔝 Retour à la table des matières


4 - Bonnes pratiques

Nommage des clusters

# Convention recommandée
name: <env>-<region>-<provider>

# Exemples
name: prod-eu-aws
name: staging-us-gcp
name: dev-local-kind

Labels standards

labels:
env: production|staging|dev
region: eu|us|asia
provider: aws|gcp|azure|onprem
tier: critical|standard

Moindre privilège

# Au lieu de cluster-admin, limiter les permissions
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: argocd-manager
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["get", "list", "watch"]
- apiGroups: ["apps", ""]
resources: ["deployments", "services", "configmaps", "secrets"]
verbs: ["*"]

Monitoring multi-cluster

# Prometheus scraping Argo CD
# Surveiller les métriques par cluster
argocd_app_info{dest_server="https://prod-eu.example.com"}

Disaster Recovery

# Backup des configurations
argocd admin export > argocd-backup.yaml

# Restaurer
argocd admin import < argocd-backup.yaml

🔝 Retour à la table des matières


5 - Exercices pratiques

Exercice 1 : Ajouter un cluster (simulé)

# Créer un second cluster avec kind
kind create cluster --name staging

# Ajouter à Argo CD
argocd cluster add kind-staging

# Vérifier
argocd cluster list

Exercice 2 : ApplicationSet multi-cluster

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: demo-multi-cluster
namespace: argocd
spec:
generators:
- clusters: {}
template:
metadata:
name: 'demo-{{name}}'
spec:
project: default
source:
repoURL: https://github.com/argoproj/argocd-example-apps.git
path: guestbook
destination:
server: '{{server}}'
namespace: demo
syncPolicy:
automated:
prune: true
syncOptions:
- CreateNamespace=true

Quiz

Q1. Comment ajouter un cluster externe à Argo CD ?

Réponse

Via CLI :

argocd cluster add <kubectl-context-name>

Via Secret : Créer un Secret avec le label argocd.argoproj.io/secret-type: cluster contenant les credentials.

Q2. Comment déployer la même app sur tous les clusters de production ?

Réponse

Utiliser un ApplicationSet avec le Cluster Generator :

generators:
- clusters:
selector:
matchLabels:
env: production

🔝 Retour à la table des matières


Points clés à retenir

  • Architecture hub-spoke : un Argo CD, plusieurs clusters
  • Ajouter via CLI ou Secret déclaratif
  • ApplicationSet avec Cluster Generator pour multi-cluster
  • Utiliser des labels pour filtrer les clusters
  • Appliquer le moindre privilège pour la sécurité

← Chapitre précédent | Chapitre suivant : Sécurité →