Blog

Red Hat ACM : gouvernance multi-cluster sur OpenShift

OpenShift
ACM
Multi-cluster
GitOps
Gouvernance

Déploiement et configuration de Red Hat Advanced Cluster Management (ACM) pour gérer, observer et sécuriser plusieurs clusters OpenShift depuis un plan de contrôle centralisé — policies, observability et ApplicationSets.

15 janvier 2025

Pourquoi un gestionnaire multi-cluster ?

À mesure que les organisations adoptent Kubernetes à grande échelle, elles se retrouvent à opérer des dizaines, voire des centaines de clusters — production, staging, dev, par région, par équipe. Sans outil centralisé, la gestion devient rapidement ingérable : configurations divergentes, visibilité fragmentée, application manuelle des politiques de sécurité.

Red Hat Advanced Cluster Management (ACM) répond à ce défi en fournissant un plan de contrôle unique pour :

  • Observer tous les clusters depuis un seul dashboard
  • Appliquer des politiques de configuration et de sécurité sur l’ensemble du parc
  • Déployer des applications sur plusieurs clusters via GitOps
  • Automatiser le provisionnement de nouveaux clusters (Hive)

Architecture ACM

┌─────────────────────────────────────────────┐
│           Hub Cluster (ACM)                  │
│   ┌──────────────────────────────────┐       │
│   │   ACM Console + API              │       │
│   │   Policy Engine                  │       │
│   │   Observability (Thanos/Grafana) │       │
│   │   ApplicationSet Controller      │       │
│   └──────────────────────────────────┘       │
└──────────┬───────────────┬───────────────────┘
           │               │
    ┌──────▼──────┐  ┌──────▼──────┐
    │  Managed    │  │  Managed    │
    │  Cluster A  │  │  Cluster B  │
    │ (prod-paris)│  │ (prod-lyon) │
    └─────────────┘  └─────────────┘

Le Hub Cluster héberge ACM. Les Managed Clusters exécutent un agent léger (klusterlet) qui maintient la connexion avec le Hub et applique les configurations reçues.


Installation de l’Operator ACM

# Créer le namespace dédié
oc create namespace open-cluster-management

# Installer l'Operator ACM
cat <<EOF | oc apply -f -
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: advanced-cluster-management
  namespace: open-cluster-management
spec:
  channel: release-2.11
  installPlanApproval: Automatic
  name: advanced-cluster-management
  source: redhat-operators
  sourceNamespace: openshift-marketplace
EOF

# Créer l'instance MultiClusterHub
cat <<EOF | oc apply -f -
apiVersion: operator.open-cluster-management.io/v1
kind: MultiClusterHub
metadata:
  name: multiclusterhub
  namespace: open-cluster-management
spec:
  availabilityConfig: High
  enableClusterBackup: true
EOF

Attendre que le Hub soit prêt :

oc wait multiclusterhub multiclusterhub \
  -n open-cluster-management \
  --for=condition=Complete \
  --timeout=600s

Importer un cluster existant

# Créer le ManagedCluster
apiVersion: cluster.open-cluster-management.io/v1
kind: ManagedCluster
metadata:
  name: prod-paris
  labels:
    cloud: bare-metal
    region: eu-west-1
    environment: production
    vendor: OpenShift
spec:
  hubAcceptsClient: true
  leaseDurationSeconds: 60
# Générer les manifests d'import à appliquer sur le cluster cible
oc get secret prod-paris-import \
  -n prod-paris \
  -o jsonpath='{.data.crds\.yaml}' | base64 -d | oc apply -f - --kubeconfig=prod-paris.kubeconfig

oc get secret prod-paris-import \
  -n prod-paris \
  -o jsonpath='{.data.import\.yaml}' | base64 -d | oc apply -f - --kubeconfig=prod-paris.kubeconfig

Policies : gouvernance déclarative

Les Policies ACM permettent d’exprimer l’état souhaité de chaque cluster et d’être alerté (ou de remédier automatiquement) en cas de dérive.

Policy : forcer la version TLS minimale

apiVersion: policy.open-cluster-management.io/v1
kind: Policy
metadata:
  name: policy-tls-version
  namespace: policies
  annotations:
    policy.open-cluster-management.io/standards: NIST-CSF
    policy.open-cluster-management.io/categories: PR.PT Protective Technology
spec:
  remediationAction: enforce          # ou "inform" pour audit seulement
  disabled: false
  policy-templates:
    - objectDefinition:
        apiVersion: policy.open-cluster-management.io/v1
        kind: ConfigurationPolicy
        metadata:
          name: tls-version-config
        spec:
          remediationAction: enforce
          severity: high
          object-templates:
            - complianceType: musthave
              objectDefinition:
                apiVersion: config.openshift.io/v1
                kind: APIServer
                metadata:
                  name: cluster
                spec:
                  tlsSecurityProfile:
                    type: Custom
                    custom:
                      ciphers:
                        - ECDHE-RSA-AES256-GCM-SHA384
                        - ECDHE-RSA-AES128-GCM-SHA256
                      minTLSVersion: VersionTLS12
---
# Appliquer la policy à tous les clusters de production
apiVersion: policy.open-cluster-management.io/v1
kind: PlacementBinding
metadata:
  name: binding-tls-version
  namespace: policies
spec:
  placementRef:
    name: placement-production
    kind: PlacementRule
    apiGroup: apps.open-cluster-management.io
  subjects:
    - name: policy-tls-version
      kind: Policy
      apiGroup: policy.open-cluster-management.io
---
apiVersion: apps.open-cluster-management.io/v1
kind: PlacementRule
metadata:
  name: placement-production
  namespace: policies
spec:
  clusterSelector:
    matchLabels:
      environment: production

Policy : namespace obligatoire avec labels

apiVersion: policy.open-cluster-management.io/v1
kind: Policy
metadata:
  name: policy-namespace-labels
  namespace: policies
spec:
  remediationAction: enforce
  disabled: false
  policy-templates:
    - objectDefinition:
        apiVersion: policy.open-cluster-management.io/v1
        kind: ConfigurationPolicy
        metadata:
          name: ns-required-labels
        spec:
          remediationAction: enforce
          severity: medium
          namespaceSelector:
            exclude: ["kube-*", "openshift-*", "open-cluster-*"]
            include: ["*"]
          object-templates:
            - complianceType: musthave
              objectDefinition:
                apiVersion: v1
                kind: Namespace
                metadata:
                  labels:
                    team: ""          # label obligatoire
                    environment: ""   # label obligatoire

Observabilité multi-cluster

ACM inclut un stack d’observabilité basé sur Thanos et Grafana pour centraliser les métriques de tous les clusters.

apiVersion: observability.open-cluster-management.io/v1beta2
kind: MultiClusterObservability
metadata:
  name: observability
spec:
  enableDownsampling: true
  observabilityAddonSpec:
    enableMetrics: true
    interval: 30                    # Scrape toutes les 30s
  storageConfig:
    metricObjectStorage:
      name: thanos-object-storage
      key: thanos.yaml
    storageClass: longhorn-fast
    alertmanagerStorageSize: 1Gi
    compactStorageSize: 100Gi
    receiveStorageSize: 20Gi
    ruleStorageSize: 1Gi
    storeStorageSize: 10Gi

Déploiement d’applications multi-cluster avec ApplicationSets

ACM intègre ArgoCD via GitOpsCluster pour déployer des applications sur plusieurs clusters depuis Git.

# Enregistrer les clusters managed dans ArgoCD
apiVersion: apps.open-cluster-management.io/v1beta1
kind: GitOpsCluster
metadata:
  name: gitops-cluster
  namespace: openshift-gitops
spec:
  argoServer:
    cluster: local-cluster
    argoNamespace: openshift-gitops
  placementRef:
    kind: Placement
    apiVersion: cluster.open-cluster-management.io/v1beta1
    name: all-clusters
    namespace: openshift-gitops
# ApplicationSet ciblant les clusters par label ACM
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: mon-app-multi-cluster
  namespace: openshift-gitops
spec:
  generators:
    - clusterDecisionResource:
        configMapRef: acm-placement
        labelSelector:
          matchLabels:
            cluster.open-cluster-management.io/placement: placement-production
        requeueAfterSeconds: 180
  template:
    metadata:
      name: "mon-app-{{name}}"
    spec:
      project: default
      source:
        repoURL: https://github.com/mon-org/mon-app.git
        targetRevision: main
        path: deploy/overlays/production
      destination:
        server: "{{server}}"
        namespace: mon-app
      syncPolicy:
        automated:
          prune: true
          selfHeal: true

Conclusion

Red Hat ACM transforme la gestion d’un parc multi-cluster d’une tâche manuelle et risquée en un processus déclaratif, auditable et automatisé. Les Policies permettent d’enforcer la conformité à grande échelle, l’observabilité centralisée donne une vue unifiée du parc, et l’intégration ArgoCD via ApplicationSets complète le tableau pour des déploiements GitOps multi-cluster cohérents.