Créer un déploiement multicluster pour Spanner Omni sur Kubernetes

Ce document explique comment configurer un déploiement Spanner Omni sur plusieurs clusters Kubernetes. Vous pouvez déployer Spanner Omni avec ou sans chiffrement TLS. Si vous utilisez le chiffrement, Spanner Omni utilise le protocole TLS (Transport Layer Security) 1.3 pour chiffrer et authentifier la communication au sein du déploiement et avec ses clients.

Un déploiement sans chiffrement TLS présente les risques de sécurité suivants :

  • Toute personne peut accéder au déploiement si elle peut atteindre son adresse IP.
  • Il n'y a pas de chiffrement réseau entre le client et le serveur, ni entre les pods.

En raison de ces risques, évitez les déploiements non configurés avec le chiffrement TLS pour les environnements de production.

La version Preview de Spanner Omni n'est pas compatible avec le chiffrement TLS et cesse d'écrire des données 90 jours après la création d'un déploiement. Pour accéder de manière anticipée à l'édition avec toutes les fonctionnalités, contactez Google.

Avant de commencer

Pour préparer le déploiement, remplissez les conditions suivantes :

  • Créez plusieurs clusters Kubernetes dans chaque emplacement pour votre déploiement. Les clusters peuvent être zonaux si vous ne déployez que dans une seule zone de ce cluster. Spanner Omni est compatible avec la configuration des charts Helm pour les environnements Google Kubernetes Engine (GKE) et Amazon Elastic Kubernetes Service (Amazon EKS). D'autres environnements peuvent nécessiter des configurations personnalisées.

  • Accédez à l'image de conteneur hébergée dans Artifact Registry.

  • Installez et configurez l'outil de ligne de commande kubectl et Helm.

  • Si vous configurez l'environnement Kubernetes sur des machines de la plate-forme de virtualisation vSphere, désactivez la virtualisation du compteur de code temporel (TSC) en ajoutant monitor_control.virtual_rdtsc = FALSE au fichier de configuration .vmx de la machine virtuelle. Cela permet à TrueTime de fonctionner correctement.

  • Configurez le réseau du cluster Kubernetes afin que les pods d'un cluster puissent se connecter aux pods d'un autre cluster. Par défaut, Spanner Omni utilise les ports TCP 15000 à 15025 pour la communication interne. Pour permettre la communication entre les pods de ces clusters, ouvrez ces ports pour le trafic.

  • Configurez le DNS du cluster pour résoudre le nom d'hôte d'un pod, tel que spanner-a-0.pod.spanner-ns-r1, en son adresse IP. Spanner Omni nécessite la résolution du nom d'hôte pour les connexions TCP entre les pods de différents clusters.

Préparer la configuration du chart Helm

Créez une configuration Helm. Pour en savoir plus, consultez Créer une configuration Helm.

Le nombre de serveurs racine par zone doit être un nombre impair compris entre un et neuf, inclus, pour assurer le quorum et la cohérence. Si le nombre de serveurs est pair, les déploiements peuvent échouer. Lorsque vous configurez vos zones, désignez des serveurs comme serveurs racine. Nous vous recommandons d'en utiliser un pour le développement ou les tests, et trois pour les zones de production à disponibilité élevée.

Comme il s'agit d'un déploiement multicluster, assurez-vous que votre fichier YAML de configuration Helm inclut les éléments suivants :

# This is required for a multi-cluster deployment setup.

deployment:
  multiCluster: true

Exemple de configuration de chart Helm pour un déploiement multicluster

Vous trouverez ci-dessous un exemple de graphique Helm configuré pour un déploiement multicluster Spanner Omni. Cette configuration crée un déploiement dans trois régions Google Cloud  : us-west1, us-west2 et us-west3. Le déploiement est réparti sur cinq zones, chacune représentant une réplique. Les réplicas dans us-west1 et us-west2 sont en lecture/écriture, tandis que le réplica unique dans us-west3 est un réplica témoin.

# The platform of the deployment
global:
  platform: gke

# This is required for a multi-cluster deployment setup.
deployment:
  multiCluster: true

# Locations and zones where clusters are created for the deployment
locations:
  - name: us-west1
    namespace: spanner-ns-usw1
    zones:
      - name: "us-west1-a"
        shortName: "a"
      - name: "us-west1-b"
        shortName: "b"
  - name: us-west2
    namespace: spanner-ns-usw2
    zones:
      - name: "us-west2-a"
        shortName: "a"
      - name: "us-west2-b"
        shortName: "b"
  - name: us-west3
    namespace: spanner-ns-usw3
    zones:
      - name: "us-west3-a"
        shortName: "a"
        replicaType: WITNESS

# Remaining configuration like storage, resources, isn't included in this sample.

Configurer kubectl pour se connecter à plusieurs clusters

Avant de continuer, créez des clusters avec des contextes kubectl. Par exemple, dans votre fichier YAML de configuration Helm, vous pouvez nommer les contextes en fonction de l'emplacement, comme ctx-usw1, ctx-usw2 et ctx-usw3.

Configurer le chiffrement TLS

Si vous configurez un déploiement sans chiffrement, passez à Installer un graphique Helm pour chaque cluster.

Pour configurer le chiffrement TLS dans un déploiement multicluster, vous devez créer une autorité de certification (CA) et générer des certificats pour chaque cluster. Pour en savoir plus, consultez Ajouter le chiffrement TLS à votre déploiement Kubernetes.

Générez les certificats.

Créez l'autorité de certification et les certificats pour le serveur et l'API. Les certificats de serveur et d'API doivent inclure les hôtes de tous les clusters.

Créer le certificat de serveur Spanner Omni

Les serveurs Spanner Omni utilisent des certificats serveur pour chiffrer la communication entre les serveurs.

Pour créer le certificat de serveur, exécutez la commande suivante. Remplacez SERVER_LIST par une liste de noms de domaine complets (FQDN) de pods de serveur Spanner Omni séparés par une virgule, ou utilisez des caractères génériques.

SERVER_NAMES=*.pod.spanner-ns-usw1,*.pod.spanner-ns-usw2,*.pod.spanner-ns-usw3
Spanner Omni CLI certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

Créer le certificat d'API

Les certificats d'API chiffrent la communication des systèmes interagissant avec le déploiement.

Pour créer le certificat d'API, exécutez la commande suivante. Remplacez OMNI_ENDPOINT par les points de terminaison de service pour chaque cluster.

OMNI_ENDPOINT=spanner.spanner-ns-usw1,spanner.spanner-ns-usw2,spanner.spanner-ns-usw3
Spanner Omni CLI certificates create-server --filename-prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output-directory certs

Transférer les certificats vers chaque cluster Kubernetes

Pour chaque cluster, créez l'espace de noms et un secret générique contenant les certificats.

# Repeat for each context (for example, ctx-usw1, ctx-usw2, ctx-usw3)
# Replace NAMESPACE with the appropriate namespace for each region

kubectl create namespace <var>NAMESPACE</var> --context <var>CONTEXT</var>
kubectl create secret generic tls-certs \
  --from-file=ca.crt="certs/ca.crt" \
  --from-file=ca-api.crt="certs/ca-api.crt" \
  --from-file=server.crt="certs/server.crt" \
  --from-file=server.key="certs/server.key" \
  --from-file=api.crt="certs/api.crt" \
  --from-file=api.key="certs/api.key" \
  -n <var>NAMESPACE</var> \
  --context <var>CONTEXT</var>

Installer un chart Helm pour chaque cluster

Créez une configuration Helm. Pour en savoir plus, consultez Créer une configuration Helm.

Pour un déploiement multicluster, appliquez la configuration du graphique Helm à partir de votre fichier de configuration Helm à chaque cluster Kubernetes. Dans chaque commande, ciblez un emplacement spécifique et son espace de noms pour l'associer au déploiement Spanner Omni. Appliquez la configuration à chaque emplacement dans le même ordre que celui indiqué dans votre fichier de configuration Helm. Lorsque vous appliquez la configuration à l'emplacement final, le système crée un job d'amorçage du déploiement dans ce cluster.

Avant d'installer Helm pour chaque cluster, créez l'espace de noms de surveillance sur le cluster où vous prévoyez d'héberger la pile d'observabilité :

kubectl create namespace monitoring --context ctx-usw1

Exemples de commandes d'installation de chart Helm

Les commandes suivantes installent un graphique Helm sur les clusters. Dans chaque commande, PATH_TO_HELM_CONFIG_FILE correspond au chemin d'accès au fichier YAML de configuration du graphique Helm que vous avez créé pour votre déploiement.

Installer un graphique dans us-west1 avec la surveillance activée

helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 0.1.0 \
  -f PATH_TO_HELM_CONFIG_FILE \
  --namespace spanner-ns-usw1 \
  --set currentLocation=us-west1 \
  --set monitoring.enabled=true \
  --create-namespace \
  --kube-context ctx-usw1

Installer un graphique dans us-west2 sans surveillance

helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 0.1.0 \
  -f  PATH_TO_HELM_CONFIG_FILE \
  --namespace spanner-ns-usw2 \
  --set currentLocation=us-west2 \
  --create-namespace \
  --kube-context ctx-usw2

Installer un graphique dans us-west3 sans surveillance

helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 0.1.0 \
  -f  PATH_TO_HELM_CONFIG_FILE \
  --namespace spanner-ns-usw3 \
  --set currentLocation=us-west3 \
  --create-namespace \
  --kube-context ctx-usw3

Suivre la progression de votre déploiement

Une fois la configuration du graphique Helm appliquée, une tâche d'amorçage démarre dans chaque cluster Kubernetes. Une fois le job d'amorçage démarré dans le dernier cluster, exécutez la commande suivante pour suivre le processus de déploiement :

kubectl logs -n spanner-ns-usw3 -l app.kubernetes.io/component=bootstrap -f

Si les journaux indiquent que le déploiement ne peut pas atteindre tous les serveurs, assurez-vous que le service DNS de chaque cluster est correctement configuré.

Configurer le service DNS du cluster

Si vous utilisez un DNS externe avec votre cluster Kubernetes et qu'il gère les entrées DNS pour les services sans adresse, vous pouvez ignorer cette étape.

Spanner utilise le nom d'hôte du pod pour toutes les communications internes. Configurez le DNS pour que les pods puissent résoudre les noms d'hôte, même lorsqu'ils s'exécutent dans différents clusters Kubernetes. Pour ce faire, exposez le service kube-dns dans chaque cluster afin que les autres clusters puissent l'atteindre en exécutant le script dns-setup.sh.

Ce script déploie un service d'équilibreur de charge dans chaque cluster pour l'application kube-dns et met à jour la configuration DNS pour qu'elle pointe vers les services d'équilibreur de charge. Bien que dns-setup.sh configure kube-dns et CoreDNS sur GKE et Amazon EKS, vous devrez peut-être le configurer pour votre environnement.

Pour configurer le service DNS du cluster :

  1. Si vous ne l'avez pas déjà fait, téléchargez le script dns-setup.sh à partir du bucket Cloud Storage spanner-omni.

    Accéder au bucket Spanner Omni

  2. Exécutez le script dns-setup.sh :

    dns-setup.sh -n CSV_NAME_SPACE_LIST CONTEXTS
    
    • Remplacez CSV_NAME_SPACE_LIST par une liste de vos espaces de noms, séparés par une virgule.

    • Remplacez CONTEXTS par la liste de vos contextes.

    Voici un exemple d'utilisation du script dns-setup.sh :

    dns-setup.sh -n spanner-ns-usw1,spanner-ns-usw2,spanner-ns-usw3 ctx-usw1 ctx-usw2 ctx-usw3
    

Après avoir exécuté le script, vérifiez les journaux du job de déploiement. Des messages indiquent que le déploiement est en cours et un message Deployment created successfully s'affiche.

Mettre à jour le certificat de l'API

Si vous configurez le déploiement sans chiffrement TLS, passez à Interagir avec Spanner Omni.

Pour implémenter le chiffrement TLS, vous devez mettre à jour le certificat d'API avec les adresses IP externes ou les noms DNS des équilibreurs de charge pour chaque cluster. Cela garantit que les clients peuvent se connecter au déploiement via des canaux sécurisés.

  1. Obtenez les détails du service pour chaque cluster :

    kubectl get service spanner -n spanner-ns-usw1 --context ctx-usw1
    kubectl get service spanner -n spanner-ns-usw2 --context ctx-usw2
    kubectl get service spanner -n spanner-ns-usw3 --context ctx-usw3
    
  2. Mettez à jour le certificat de l'API avec les adresses IP externes :

    # Replace <var>EXTERNAL_IP_USW1</var>, <var>EXTERNAL_IP_USW2</var>, and <var>EXTERNAL_IP_USW3</var>
    # with the actual external IP addresses or DNS names.
    
    OMNI_ENDPOINT=<var>EXTERNAL_IP_USW1</var>,<var>EXTERNAL_IP_USW2</var>,<var>EXTERNAL_IP_USW3</var>,spanner.spanner-ns.svc
    Spanner Omni CLI certificates update --filename_prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output_directory certs --overwrite
    
  3. Mettez à jour les secrets de chaque cluster Kubernetes avec le nouveau certificat d'API :

    # Repeat for each context
    kubectl patch secret tls-certs -n spanner-ns-usw1 --context ctx-usw1 -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"
    kubectl patch secret tls-certs -n spanner-ns-usw2 --context ctx-usw2 -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"
    kubectl patch secret tls-certs -n spanner-ns-usw3 --context ctx-usw3 -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"
    

Interagir avec Spanner Omni

Chaque cluster d'une configuration multicluster dispose d'un service d'équilibreur de charge. Vous pouvez utiliser n'importe quelle adresse IP externe du service pour interagir avec Spanner Omni. Pour les écritures et les lectures fortes, utilisez l'adresse qui sert de région principale. Pour les requêtes de lecture non actualisées, utilisez la région la plus proche de votre application pour obtenir des performances optimales.

  1. Exécutez la commande suivante pour obtenir l'adresse du service :

    kubectl get service spanner -n spanner-ns-usw1 --context ctx-usw1
    

    EXTERNAL-IP:PORT est le DEPLOYMENT_ENDPOINT de votre déploiement.

  2. Si ce n'est pas déjà fait, téléchargez la CLI Spanner Omni depuis le bucket Cloud Storage spanner-omni.

    Accéder au bucket Spanner Omni

  3. Si vous avez créé un déploiement avec chiffrement TLS, vous devez inclure le certificat de l'autorité de certification avec chaque commande pour établir une connexion chiffrée. Si vous avez activé mTLS pour les clients, incluez également le répertoire des certificats client.

    • --ca-certificate-file=certs/ca-api.crt
    • --client-certificate-directory=clientcerts
  4. Utilisez la CLI Spanner Omni pour créer une base de données GoogleSQL ou PostgreSQL et interagir avec elle.

    GoogleSQL

    Pour créer une base de données GoogleSQL et interagir avec elle, exécutez les commandes suivantes :

    Spanner Omni CLI databases create DATABASE_NAME \
      --deployment-endpoint=dns:///DEPLOYMENT_ENDPOINT \
      --ca-certificate-file=certs/ca-api.crt
    Spanner Omni CLI sql --database=DATABASE_NAME \
      --deployment-endpoint=dns:///DEPLOYMENT_ENDPOINT \
      --ca-certificate-file=certs/ca-api.crt
    

    PostgreSQL

    Pour créer une base de données PostgreSQL et interagir avec elle, exécutez la commande suivante :

    Spanner Omni CLI databases create POSTGRESQL_DATABASE_NAME \
      --database_dialect POSTGRESQL \
      --deployment-endpoint=dns:///DEPLOYMENT_ENDPOINT \
      --ca-certificate-file=certs/ca-api.crt
    Spanner Omni CLI sql --database=POSTGRESQL_DATABASE_NAME \
      --deployment-endpoint=dns:///DEPLOYMENT_ENDPOINT \
      --ca-certificate-file=certs/ca-api.crt
    

    Vous pouvez également interagir avec une base de données PostgreSQL en suivant les instructions de la section Se connecter à l'aide de PGAdapter pour configurer PGAdapter et utiliser des outils PostgreSQL, tels que psql, avec vos bases de données utilisant le dialecte PostgreSQL.

Étapes suivantes