Connecter votre cluster Elasticsearch avec Google Kubernetes Engine

Dans cet article, nous allons connecter un cluster GKE (Google Kubernetes Engine) avec notre cluster Elasticsearch. La connexion sera réalisée en mettant en place un Private Service Connect.

Ce dernier permet la connexion entre réseaux VPC différents. Dans notre cas, il va nous permettre de connecter 2 clusters GKE, chacun d'une organisation différente, ensemble.

Objectif

L'objectif est de créer une connexion privée entre les 2 clusters dans le but de sécuriser vos clusters Elasticsearch en rendant leur accès privé.

Pré-requis

Pour reproduire les différentes étapes de cet article, vous aurez besoin de déployer un cluster Elasticsearch dans Elastic Cloud et d'un cluster GKE, exemple avec le déploiement d'un cluster GKE pour Magento 2.

En plus de cela, vous devez installer le Google Cloud SDK sur votre ordinateur, machine virtuelle ou WSL.

GCP - Google Cloud Platform

Pour créer un PSC (Private Service Connect), nous avons besoin d'un sous-réseau où l'accès privé est activé, d'une adresse IP interne liée au sous-réseau et d'une zone DNS.

Activation du réseau privé

Nous devons commencer par vérifier que le sous-réseau du VPC autorise les connexions privées. Sachant qu'un VPC peut contenir plusieurs sous-réseaux, nous devons déjà récupérer le réseau VPC utilisé par le cluster Kubernetes.

Commençons par récupérer la liste des clusters actifs :

gcloud container clusters list

Exécuter ensuite la commande ci-dessous, en remplaçant <mon-cluster> et <ma-region> par les valeurs récupérées avec la commande précédente pour le cluster sélectionné :

gcloud container clusters describe <mon-cluster> --region=<ma-region> --format="get(network)"

Vous devriez récupérer le nom du VPC utilisé par votre cluster GKE, par défaut la valeur est : default. Ensuite, nous devons récupérer la liste des sous-réseaux du VPC :

gcloud compute networks subnets list --network=<mon-vpc>

Avec le VPC default, vous devriez récupérer un sous-réseau nommé default pour chaque région Google. Sélectionner un sous-réseau, puis exécuter la commande :

gcloud compute networks subnets describe <mon-sous-reseau> --region=<ma-region> --format="get(privateIpGoogleAccess)"

La sortie de cette commande doit être : True. Dans le cas où la sortie est False, vous devrez activer l'accès privé en lançant la commande suivante :

gcloud compute networks subnets update <mon-sous-reseau> --region=<ma-region> --enable-private-ip-google-access

Réservation d'une adresse IP interne

La réservation d'une adresse IP interne est très simple, il suffit d'exécuter la commande ci-dessous :

gcloud compute addresses create <nom-de-mon-adresse-ip-interne> --region=<ma-region> --subnet=<mon-sous-reseau>

Vous pouvez récupérer l'adresse IP en lançant la commande :

gcloud compute addresses describe <nom-de-mon-adresse-ip-interne> --region=<ma-region> --format="get(address)"

Création du Private Service Connect

Avant de se lancer dans la création du PSC, nous devons récupérer l'URI du PSC Elastic Cloud de la région de notre cluster Elasticsearch.

Naviguer sur la page GCP Private Service Connect traffic filters pour afficher la liste des URI Elastic.

Dans cette liste, récupérer la valeur de la colonne Service Attachment URI correspondant à la région de votre cluster Elasticsearch. Pour un cluster en europe-west1, l'URI est projects/cloud-production-168820/regions/europe-west1/serviceAttachments/proxy-psc-production-europe-west1-v1-attachment.

Dans votre terminal, lancer la commande de création du PSC :

gcloud compute forwarding-rules create <nom-de-mon-psc> --region=<ma-region> --network=<mon-vpc> --address=<nom-de-mon-adresse-ip-interne> --target-service-attachment=<service-attachment-uri>

Une fois la création effectuée, vous pouvez afficher la description du PSC en lançant la commande :

gcloud compute forwarding-rules describe <nom-de-mon-psc> --region=<ma-region>

Dans la sortie, vérifier que la connexion au PSC Elastic Cloud est bien acceptée en vérifiant la valeur pscConnectionStatus ou avec la commande :

gcloud compute forwarding-rules describe <nom-de-mon-psc> --region=<ma-region> --format="get(pscConnectionStatus)"

Création de la zone DNS

La zone DNS est indispensable pour pointer sur l'URL privée du cluster Elasticsearch.

Avant de créer la zone DNS, il est nécessaire de récupérer la zone DNS Elastic que l'on retrouve dans la 3ᵉ colonne de la liste des URI. La zone DNS doit correspondre à celle de la région de votre cluster Elasticsearch. Pour un cluster en europe-west1, la zone DNS est psc.europe-west1.gcp.cloud.es.io. À cette valeur, il faut ajouter un ., ce caractère est très important. Il ne faut pas l'oublier lors de la création de la zone DNS.

Pour créer une zone DNS (Cloud DNS) dans Google Cloud Platform, nous devons lancer la commande :

gcloud dns managed-zones create <ma-zone-dns-privee> --description="<Ma description>" --dns-name=<zone-dns-elasticcloud>. --visibility=private --networks=<mon-reseau>

Maintenant que nous avons une zone DNS, nous devons ajouter une entrée DNS de type A qui pointera sur l'adresse IP interne que nous avons précédemment créée en lançant une suite de 3 commandes :

gcloud dns record-sets transaction start --zone="<ma-zone-dns-privee>"

gcloud dns record-sets transaction add $(gcloud compute addresses describe <nom-de-mon-adresse-ip-interne> --region=<ma-region> --format="get(address)") --name="*.<zone-dns-elasticcloud>." --ttl="30" --type="A" --zone="<ma-zone-dns-privee>"

gcloud dns record-sets transaction execute --zone="<ma-zone-dns-privee>"

Elastic Cloud

Côté Elastic Cloud, c'est très simple. Nous devons filtrer le trafic en créant un filtre. Vous pouvez créer autant de filtre que vous le souhaitez pour votre ou vos clusters.

Création du filtre de trafic

Nous allons déployer le filtre de trafic avec Terraform. Suivez l'article, que j'ai rédigé récemment, sur le déploiement d'un cluster Elasticsearch et ajouter la ressource ci-dessous avant la ressource ec_deployment :

resource "ec_deployment_traffic_filter" "traffic-filter" {
  name   = "traffic-filter"
  region = var.elasticsearch_region
  type   = "gcp_private_service_connect_endpoint"

  rule {
    source = "<mon-psc-connection-id>"
  }
}

Remplacer la valeur <mon-psc-connection-id> par la valeur retournée par la commande :

gcloud compute forwarding-rules describe <nom-de-mon-psc> --region=<ma-region> --format="get(pscConnectionId)"

Appliquer le filtre de trafic

Dans la ressource ec_deployment, ajouter la directive :

traffic_filter = [
    ec_deployment_traffic_filter.traffic-filter.id
]

La ressource complète doit être :

resource "ec_deployment" "elasticsearch_cluster" {
    name = "mon-cluster"

    region                 = data.ec_stack.stack.region
    version                = data.ec_stack.stack.version_regex
    deployment_template_id = "gcp-storage-optimized"

    elasticsearch {
        autoscale = "false"

        topology {
            id            = "hot_content"
            size_resource = "memory"
            size          = "1g"
            zone_count    = 1
        }
    }

    kibana {
        topology {
            size_resource = "memory"
            size          = "1g"
            zone_count    = 1
        }
    }

    traffic_filter = [
        ec_deployment_traffic_filter.traffic-filter.id
    ]
}

Déployer votre cluster Elasticsearch en lançant la commande :

terraform apply

Liens utiles