Multi-cluster
Table des matières
- Architecture multi-cluster
- Ajouter un cluster
- Déployer sur plusieurs clusters
- Bonnes pratiques
- 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énario | Description |
|---|---|
| Multi-env | Dev, staging, prod sur différents clusters |
| Multi-région | EU, US, Asia pour la latence |
| Multi-cloud | AWS, GCP, Azure |
| Edge | Clusters 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é