Déploiement multirégional sur GKE et GKE On-Prem

Cet article décrit un déploiement multirégional pour Apigee hybrid sur GKE et Anthos GKE déployés sur site.

Voici quelques exemple de topologies pour le déploiement multirégional :

  • Actif/Actif : lorsque des applications sont déployées dans plusieurs emplacements géographiques et que vous avez besoin d'une réponse d'API à faible latence pour vos déploiements. Vous avez la possibilité de déployer un environnement hybride dans plusieurs emplacements géographiques les plus proches de vos clients. Par exemple : la côte ouest des États-Unis, la côte est des États-Unis, l'Europe, l'Asie-Pacifique.
  • Actif/Passif : lorsque vous disposez d'une région principale et d'une région de basculement ou de reprise après sinistre.

Les régions d'un déploiement hybride multirégional communiquent via Cassandra, comme le montre l'image suivante :

Équilibrer la charge de la connexion MART

Chaque cluster régional doit avoir ses propres adresse IP et nom d'hôte MART. Cependant, il vous suffit de connecter le plan de gestion à l'un d'entre eux. Cassandra propage les informations à tous les clusters. La meilleure option en termes de haute disponibilité pour MART consiste à équilibrer la charge des adresses IP MART individuelles et à configurer votre organisation pour qu'elle communique avec l'URL MART à équilibrage de charge.

Prérequis

Avant de configurer un environnement hybride pour plusieurs régions, vous devez remplir les conditions préalables suivantes :

  • Configurez des clusters Kubernetes dans plusieurs régions avec des blocs CIDR différents
  • Configurez la communication interrégionale
  • Ouvrez les ports Cassandra 7 000 et 7 001 entre les clusters Kubernetes dans toutes les régions (7 000 peuvent être utilisées comme option de sauvegarde lors du dépannage). Consultez également la section Configurer les ports.

Pour en savoir plus, consultez la documentation concernant Kubernetes.

Configurer l'hôte source multirégional

Cette section décrit comment étendre le cluster Cassandra existant à une nouvelle région. Cette configuration permet à la nouvelle région d'amorcer le cluster et de rejoindre le centre de données existant. Sans cette configuration, les clusters Kubernetes multirégionaux ne se connaîtraient pas les uns les autres.

  1. Exécutez la commande kubectl suivante pour identifier une adresse d'hôte source pour Cassandra dans la région actuelle.

    Une adresse hôte source permet à une nouvelle instance régionale de trouver le cluster d'origine lors du premier démarrage pour apprendre la topologie du cluster. L'adresse hôte source est désignée comme point de contact dans le cluster.

    kubectl get pods -o wide -n apigee
    
    NAME                      READY   STATUS      RESTARTS   AGE   IP          NODE                                          NOMINATED NODE
    apigee-cassandra-0        1/1     Running     0          5d    10.0.0.11   gke-k8s-dc-2-default-pool-a2206492-p55d
    apigee-cassandra-1        1/1     Running     0          5d    10.0.2.4    gke-k8s-dc-2-default-pool-e9daaab3-tjmz
    apigee-cassandra-2        1/1     Running     0          5d    10.0.3.5    gke-k8s-dc-2-default-pool-e589awq3-kjch
  2. Déterminez laquelle des adresses IP renvoyées par la commande précédente sera l'hôte source multirégional.
  3. La configuration à cette étape dépend de l'utilisation de GKE ou GKE On-Prem :

    GKE uniquement : dans le centre de données 2, configurez cassandra.multiRegionSeedHost et cassandra.datacenter sur la page Gérer les composants du plan d'exécution, où multiRegionSeedHost est l'une des adresses IP renvoyées par la commande précédente :

    cassandra:
      multiRegionSeedHost: seed_host_IP
      datacenter: data_center_name
      rack: rack_name

    Exemple :

    cassandra:
      multiRegionSeedHost: 10.0.0.11
      datacenter: "dc-2"
      rack: "ra-1"

    GKE On-Prem uniquement : dans le centre de données 2, configurez cassandra.multiRegionSeedHost dans le fichier de remplacement, où multiRegionSeedHost est l'une des adresses IP renvoyées par la commande précédente :

    cassandra:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      multiRegionSeedHost: seed_host_IP
    

    Exemple :

    cassandra:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      multiRegionSeedHost: 10.0.0.11
    

  4. Dans le nouveau centre de données/région, avant d'installer un environnement hybride, définissez les mêmes certificats et identifiants TLS dans overrides.yaml que ceux définis dans la première région.

Configurer la nouvelle région

Après avoir configuré l'hôte source, vous pouvez configurer la nouvelle région.

Pour configurer la nouvelle région, procédez comme suit :

  1. Copiez votre certificat à partir du cluster existant vers le nouveau cluster. Le nouveau certificat racine CA est utilisé par Cassandra et d'autres composants hybrides pour mTLS. Par conséquent, il est essentiel de disposer de certificats cohérents dans l'ensemble du cluster.
    1. Définissez le contexte sur l'espace de noms d'origine :
      kubectl config use-context original-cluster-name
    2. Exportez la configuration actuelle de l'espace de noms dans un fichier :
      $ kubectl get namespace  -o yaml > apigee-namespace.yaml
    3. Exportez le secret apigee-ca vers un fichier :
      kubectl -n cert-manager get secret apigee-ca -o yaml > apigee-ca.yaml
    4. Définissez le contexte sur le nom du cluster de la nouvelle région :
      kubectl config use-context new-cluster-name
    5. Importez la configuration de l'espace de noms dans le nouveau cluster. Veillez à mettre à jour l'espace de noms dans le fichier si vous utilisez un espace de noms différent dans la nouvelle région :
      kubectl apply -f apigee-namespace.yaml
    6. Importez le secret dans le nouveau cluster :

      kubectl -n cert-manager apply -f apigee-ca.yaml
  2. Installez la version hybride dans la nouvelle région. Assurez-vous que le fichier overrides-DC_name.yaml inclut les mêmes certificats TLS que ceux configurés dans la première région, comme expliqué dans la section précédente.

    Exécutez les deux commandes suivantes pour installer un environnement hybride dans la nouvelle région :

    apigeectl init -f overrides/overrides-DC_name.yaml
    apigeectl apply -f overrides/overrides-DC_name.yaml
  3. Développez tous les espaces de clés Apigee.

    Les étapes suivantes permettent de développer les données Cassandra vers le nouveau centre de données :

    1. Ouvrez une interface système dans le pod Cassandra :
      kubectl run -i --tty --restart=Never --rm --image google/apigee-hybrid-cassandra-client:1.0.0 cqlsh
    2. Connectez-vous au serveur Cassandra :
      cqlsh apigee-cassandra-0.apigee-cassandra.apigee.svc.cluster.local -u ddl_user --ssl
      Password:
      
      Connected to apigeecluster at apigee-cassandra-0.apigee-cassandra.apigee.svc.cluster.local:9042.
      [cqlsh 5.0.1 | Cassandra 3.11.3 | CQL spec 3.4.4 | Native protocol v4]
      Use HELP for help.
    3. Obtenez les espaces de clés disponibles :
      SELECT * from system_schema.keyspaces ;
       keyspace_name              | durable_writes | replication
      ----------------------------+----------------+--------------------------------------------------------------------------------------------------------
         rtc_hybrid_test_7_hybrid |           True |                  {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
                      system_auth |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '1', 'dc-2': '1'}
                    system_schema |           True |                                                {'class': 'org.apache.cassandra.locator.LocalStrategy'}
       cache_hybrid_test_7_hybrid |           True |                  {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
         kms_hybrid_test_7_hybrid |           True |                  {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
         kvm_hybrid_test_7_hybrid |           True |                  {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
               system_distributed |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '1', 'dc-2': '1'}
                           system |           True |                                                {'class': 'org.apache.cassandra.locator.LocalStrategy'}
                           perses |           True |                  {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
       quota_hybrid_test_7_hybrid |           True |                  {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
                    system_traces |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '1', 'dc-2': '1'}
      
      (10 rows)
    4. Mettez à jour/développez les espaces de clés Apigee :
      ALTER KEYSPACE cache_hybrid_test_7_hybrid WITH replication = {'class': 'NetworkTopologyStrategy', 'dc-1':3, 'dc-2':3};
      ALTER KEYSPACE kms_hybrid_test_7_hybrid WITH replication = {'class': 'NetworkTopologyStrategy', 'dc-1':3, 'dc-2':3};
      ALTER KEYSPACE kvm_hybrid_test_7_hybrid WITH replication = {'class': 'NetworkTopologyStrategy', 'dc-1':3, 'dc-2':3};
      ALTER KEYSPACE perses WITH replication = {'class': 'NetworkTopologyStrategy', 'dc-1':3, 'dc-2':3};
      ALTER KEYSPACE quota_hybrid_test_7_hybrid  WITH replication = {'class': 'NetworkTopologyStrategy', 'dc-1':3, 'dc-2':3};
      ALTER KEYSPACE rtc_hybrid_test_7_hybrid  WITH replication = {'class': 'NetworkTopologyStrategy', 'dc-1':3, 'dc-2':3};
    5. Validez l'expansion de l'espace de clés :
      SELECT * from system_schema.keyspaces ;
       keyspace_name              | durable_writes | replication
      ----------------------------+----------------+--------------------------------------------------------------------------------------------------------
                      system_auth |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '1', 'dc-2': '1'}
                    system_schema |           True |                                                {'class': 'org.apache.cassandra.locator.LocalStrategy'}
       cache_hybrid_test_7_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3', 'dc-2': '3'}
         kms_hybrid_test_7_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3', 'dc-2': '3'}
         kvm_hybrid_test_7_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3', 'dc-2': '3'}
               system_distributed |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '1', 'dc-2': '1'}
                           system |           True |                                                {'class': 'org.apache.cassandra.locator.LocalStrategy'}
                           perses |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3', 'dc-2': '3'}
       quota_hybrid_test_7_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3', 'dc-2': '3'}
       rtc_hybrid_test_7_hybrid   |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3', 'dc-2': '3'}
                    system_traces |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '1', 'dc-2': '1'}
      
      (10 rows)
      ddl@cqlsh>
  4. Exécutez nodetool rebuild de manière séquentielle sur tous les pods du nouveau centre de données. Cette opération peut prendre de quelques minutes à quelques heures en fonction de la taille de vos données.
    kubectl exec apigee-cassandra-0 -n apigee  -- nodetool rebuild -- dc-1
  5. Vérifiez les processus de recompilation des journaux. Vérifiez également la taille des données à l'aide de la commande nodetool status :
    kubectl logs apigee-cassandra-0 -f -n apigee

    L'exemple suivant montre des entrées de journal :

    INFO  01:42:24 rebuild from dc: dc-1, (All keyspaces), (All tokens)
    INFO  01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Executing streaming plan for Rebuild
    INFO  01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.1.45
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.1.45
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.4.36
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.432KiB), sending 0 files(0.000KiB)
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.1.45 is complete
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.4.36
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.5.22
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.693KiB), sending 0 files(0.000KiB)
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.4.36 is complete
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.5.22
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 3 files(0.720KiB), sending 0 files(0.000KiB)
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.5.22 is complete
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] All sessions completed
  6. Mettez à jour les hôtes sources. Supprimez multiRegionSeedHost: 10.0.0.11 de overrides-DC_name.yaml, puis recommencez la même opération.
    apigeectl apply -f overrides/overrides-DC_name.yaml

Vérifier l'état du cluster Cassandra

La commande suivante permet de voir si la configuration du cluster a réussi dans deux centres de données. La commande vérifie l'état de nodetool pour les deux régions.

kubectl exec apigee-cassandra-0 -n apigee -- nodetool status


Datacenter: us-central1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.12.1.45  112.09 KiB  256          100.0%            3c98c816-3f4d-48f0-9717-03d0c998637f  ra-1
UN  10.12.4.36  95.27 KiB  256          100.0%            0a36383d-1d9e-41e2-924c-7b62be12d6cc  ra-1
UN  10.12.5.22  88.7 KiB   256          100.0%            3561f4fa-af3d-4ea4-93b2-79ac7e938201  ra-1
Datacenter: us-west1
====================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.0.4.33   78.69 KiB  256          0.0%              a200217d-260b-45cd-b83c-182b27ff4c99  ra-1
UN  10.0.0.21   78.68 KiB  256          0.0%              9f3364b9-a7a1-409c-9356-b7d1d312e52b  ra-1
UN  10.0.1.26   15.46 KiB  256          0.0%              1666df0f-702e-4c5b-8b6e-086d0f2e47fa  ra-1