Exemple de configuration GKE

Cette page montre comment configurer un exemple de configuration Cloud NAT avec Google Kubernetes Engine (GKE). Avant de configurer Cloud NAT, consultez la page Présentation de Cloud NAT.

Prérequis

Vous devez effectuer les opérations suivantes avant de configurer Cloud NAT.

Obtenir des autorisations IAM

Le rôle roles/compute.networkAdmin vous permet de créer une passerelle NAT sur Cloud Router, de réserver et d'attribuer des adresses IP NAT et de spécifier les sous-réseaux dont le trafic doit utiliser la traduction d'adresse réseau par la passerelle NAT.

Configurer Google Cloud

Avant de commencer, configurez les éléments suivants dans Google Cloud.

  1. Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
  2. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  3. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier que la facturation est activée pour votre projet.

  4. Installez et initialisez le SDK Cloud.

Configurer l'exemple GKE

Utilisez cet exemple si vous souhaitez voir une configuration Cloud NAT simple qui utilise GKE.

Étape 1 : Créer un réseau VPC et un sous-réseau

Si vous disposez déjà d'un réseau et d'un sous-réseau, vous pouvez ignorer cette étape.

Console

  1. Dans Google Cloud Console, accédez à la page Réseaux VPC.

    Accéder à la page Réseaux VPC

  2. Cliquez sur Créer un réseau VPC.

  3. Saisissez le nom custom-network1.

  4. Sous Sous-réseaux, définissez le paramètre Mode de création du sous-réseau sur Personnalisé.

  5. Sous Nouveau sous-réseau, saisissez subnet-us-east-192 pour le paramètre Nom.

  6. Dans le champ Région, sélectionnez us-east4.

  7. Définissez le paramètre Plage d'adresses IP sur 192.168.1.0/24.

  8. Cliquez sur Done (OK), puis sur Create (Créer).

gcloud

  1. Créez un réseau VPC en mode personnalisé dans votre projet :

    gcloud compute networks create custom-network1 \
        --subnet-mode custom

    Sortie :

    NAME             MODE     IPV4_RANGE   GATEWAY_IPV4
    custom-network1  custom

  2. Spécifiez le préfixe de sous-réseau pour la première région. Dans cet exemple, nous attribuons 192.168.1.0/24 à la région us-east4.

    gcloud compute networks subnets create subnet-us-east-192 \
       --network custom-network1 \
       --region us-east4 \
       --range 192.168.1.0/24

    Sortie :

    NAME                REGION    NETWORK          RANGE
    subnet-us-east-192  us-east4  custom-network1  192.168.1.0/24

Terraform

Vous pouvez utiliser un module Terraform pour créer un réseau et un sous-réseau VPC personnalisés.

module "test-vpc-module" {
  source       = "terraform-google-modules/network/google"
  version      = "~> 3.3.0"
  project_id   = var.project_id # Replace this with your project ID in quotes
  network_name = "custom-network1"
  mtu          = 1460

  subnets = [
    {
      subnet_name   = "subnet-us-east-192"
      subnet_ip     = "192.168.1.0/24"
      subnet_region = "us-east4"
    }
  ]
}

Étape 2 : Créer un cluster privé

Console

  1. Dans Cloud Console, accédez à la page des clusters Kubernetes.

    Accéder à la page des clusters Kubernetes

  2. Cliquez sur Créer un cluster.

  3. Dans le champ Nom, saisissez nat-test-cluster.

  4. Définissez le Type d'emplacement sur Zonal.

  5. Définissez le paramètre Zone sur us-east4-c.

  6. Dans le volet de navigation, cliquez sur Mise en réseau.

  7. Sélectionner Cluster privé.

  8. Décochez la case Accéder au maître en utilisant son adresse IP externe.

  9. Définissez le paramètre Plage d'adresses IP maître sur 172.16.0.0/28.

  10. Définissez le paramètre Réseau sur custom-network1.

  11. Pour créer et démarrer le cluster, cliquez sur Créer.

gcloud

gcloud container clusters create "nat-test-cluster" \
    --zone "us-east4-c" \
    --username "admin" \
    --cluster-version "latest" \
    --machine-type "e2-medium" \
    --disk-type "pd-standard" \
    --disk-size "100" \
    --scopes "https://www.googleapis.com/auth/compute","https://www.googleapis.com/auth/devstorage.read_only","https://www.googleapis.com/auth/logging.write","https://www.googleapis.com/auth/monitoring","https://www.googleapis.com/auth/servicecontrol","https://www.googleapis.com/auth/service.management.readonly","https://www.googleapis.com/auth/trace.append" \
    --num-nodes "3" \
    --enable-cloud-logging \
    --enable-cloud-monitoring \
    --enable-private-nodes \
    --enable-private-endpoint \
    --master-ipv4-cidr "172.16.0.0/28" \
    --enable-ip-alias \
    --network "projects/PROJECT_ID/global/networks/custom-network1" \
    --subnetwork "projects/PROJECT_ID/regions/us-east4/subnetworks/subnet-us-east-192" \
    --max-nodes-per-pool "110" \
    --enable-master-authorized-networks \
    --addons HorizontalPodAutoscaling,HttpLoadBalancing,KubernetesDashboard \
    --enable-autoupgrade \
    --enable-autorepair

Terraform

Vous pouvez utiliser une ressource Terraform pour créer un cluster privé.

resource "google_container_cluster" "primary" {
  project            = var.project_id
  name               = "nat-test-cluster"
  location           = "us-east4-c"
  initial_node_count = 3
  network            = var.network # Replace with a reference or self link to your network, in quotes
  subnetwork         = var.subnet  # Replace with a reference or self link to your subnet, in quotes
  private_cluster_config {
    master_ipv4_cidr_block  = "172.16.0.0/28"
    enable_private_endpoint = true
    enable_private_nodes    = true
  }
  ip_allocation_policy {
  }
  master_authorized_networks_config {
  }
}

Étape 3 : Créer une règle de pare-feu qui autorise les connexions SSH

Console

  1. Dans Cloud Console, accédez à la page Pare-feu.

    Accéder à la page Pare-feu

  2. Cliquez sur Créer une règle de pare-feu.

  3. Saisissez le nom allow-ssh.

  4. Définissez le paramètre Réseau sur custom-network1.

  5. Définissez le paramètre Sens du trafic sur Entrée.

  6. Définissez Action en cas de correspondance sur Autoriser.

  7. Définissez le paramètre Cibles sur Toutes les instances du réseau.

  8. Définissez Filtre source sur Plages d'adresses IP.

  9. Définissez le paramètre Plages d'adresses IP sources sur 35.235.240.0/20.

  10. Définissez Protocoles et ports sur Protocoles et ports spécifiés.

  11. Cochez la case tcp et saisissez comme port 22.

  12. Cliquez sur Create (Créer).

gcloud

gcloud compute firewall-rules create allow-ssh \
    --network custom-network1 \
    --source-ranges 35.235.240.0/20 \
    --allow tcp:22

Terraform

Vous pouvez utiliser une ressource Terraform pour créer une règle de pare-feu.

resource "google_compute_firewall" "rules" {
  project = var.project_id
  name    = "allow-ssh"
  network = var.network
  allow {
    protocol = "tcp"
    ports    = ["22"]
  }
  source_ranges = ["35.235.240.0/20"]
}

Étape 4 : Créer des autorisations SSH IAP sur l'un de vos nœuds

Lors d'une prochaine étape, utilisez IAP pour vous connecter à votre nœud.

Console

  1. Dans Cloud Console accédez à la page Identity-Aware Proxy.

    Accéder à la page Identity-Aware Proxy

  2. Sélectionnez l'onglet Ressources SSH et TCP.

  3. Cochez la case située à côté du premier nœud de la liste sous Toutes les ressources de tunnels > us-east4-c. Son nom sera semblable au suivant : gke-nat-test-cluster-default-pool-b50db58d-075t.

  4. Notez le nom du nœud. Vous en aurez besoin pour tester la connectivité.

  5. Dans le volet de droite, cliquez sur Ajouter un membre.

  6. Pour accorder aux utilisateurs, aux groupes ou aux comptes de service l'accès aux ressources, spécifiez leur adresse e-mail dans le champ Nouveaux membres.

    Si vous ne testez que cette fonctionnalité, vous pouvez saisir votre propre adresse e-mail.

  7. Pour accorder aux membres l'accès aux ressources via la fonctionnalité de transfert TCP de Cloud IAP, dans la liste déroulante Rôle, sélectionnez Cloud IAP > Utilisateur de tunnels sécurisés par IAP.

  8. Cliquez sur Enregistrer.

gcloud

Pour cette étape, suivez les instructions relatives à la console.

Étape 5 : Se connecter au nœud et confirmer qu'il ne peut pas accéder à Internet

Console

  1. Dans Cloud Console, accédez à la page Instances de VM.

    Accéder à la page "Instances de VM"

  2. Recherchez le nœud pour lequel vous avez créé des autorisations SSH IAP. Dans la colonne Connecter, cliquez sur la flèche du menu déroulant SSH, puis sélectionnez Ouvrir dans la fenêtre du navigateur.

    Si vous vous connectez pour la première fois à l'instance, Google Cloud génère les clés SSH.

  3. À partir de l'invite du nœud, recherchez l'ID de processus du conteneur kube-dns :

    ps aux | grep -i "\s/kube-dns"

    La ligne de sortie ressemble à ceci : L'ID du processus se trouve dans la deuxième colonne. Dans cet exemple, l'ID du processus est 2387.

    root      2387  0.0  0.6  38812 24792 ?        Ssl  01:27   0:03 /kube-dns --domain=cluster.local. --dns-port=10053 --config-dir=/kube-dns-config --v=2
  4. Accédez au conteneur :

    sudo nsenter --target PROCESS_ID --net /bin/bash
  5. À partir de kube-dns, essayez de vous connecter à Internet :

    curl example.com

    Vous ne devriez obtenir aucun résultat. Dans le cas contraire, vous n'avez peut-être pas créé votre cluster en tant que cluster privé, ou il existe un autre problème. Pour résoudre le problème, consultez la section Les machines virtuelles peuvent accéder à Internet de façon inattendue sans Cloud NAT.

    Pour arrêter la commande, vous devrez peut-être saisir Ctrl+C.

gcloud

  1. Recherchez le nom de l'un de vos nœuds de cluster :

    gcloud compute instances list

    Un nom de nœud ressemble à ceci : gke-nat-test-cluster-default-pool-1a4cbd06-3m8v. Notez le nom du nœud et utilisez-le là où s'affiche NODE_NAME dans les commandes suivantes.

  2. Ajoutez une clé SSH Compute Engine à votre hôte local :

    ssh-add ~/.ssh/google_compute_engine
    
  3. Connectez-vous au nœud :

    gcloud compute ssh NODE_NAME \
        --zone us-east4-c \
        --tunnel-through-iap
  4. À partir de l'invite du nœud, recherchez l'ID de processus du conteneur kube-dns :

    ps aux | grep -i "\s/kube-dns"

    La ligne de sortie ressemble à ceci : L'ID du processus se trouve dans la deuxième colonne. Dans cet exemple, l'ID du processus est 2387. Dans les commandes suivantes, remplacez PROCESS_ID par ce numéro.

    root      2387  0.0  0.6  38812 24792 ?        Ssl  01:27   0:03 /kube-dns --domain=cluster.local. --dns-port=10053 --config-dir=/kube-dns-config --v=2
  5. Accédez au conteneur :

    sudo nsenter --target PROCESS_ID --net /bin/bash
  6. À partir de kube-dns, essayez de vous connecter à Internet :

    curl example.com

    Vous ne devriez obtenir aucun résultat. Pour arrêter la commande, vous devrez peut-être saisir Ctrl+C.

Étape 6 : Créer une configuration NAT à l'aide de Cloud Router

Vous devez créer le routeur Cloud Router dans la même région que les instances qui utilisent Cloud NAT. Cloud NAT sert uniquement à placer les informations NAT sur les VM. Ce service ne fait pas partie de la passerelle NAT.

Cette configuration permet à toutes les instances de la région d'utiliser Cloud NAT pour toutes les plages d'adresses IP primaires et d'adresses IP d'alias. De plus, elle attribue automatiquement les adresses IP externes de la passerelle NAT. Pour plus d'options, consultez la documentation de l'interface de ligne de commande gcloud.

Console

  1. Dans Cloud Console, accédez à la page Cloud NAT.

    Accéder à la page Cloud NAT

  2. Cliquez sur Commencer ou Créer une passerelle NAT.

  3. Définissez le paramètre Nom de la passerelle sur nat-config.

  4. Définissez le paramètre Réseau VPC sur custom-network1.

  5. Définissez le paramètre Région sur us-east4.

  6. Sous Cloud Router, sélectionnez Créer un routeur.

    1. Saisissez le nom nat-router.
    2. Cliquez sur Créer.
  7. Cliquez sur Créer.

gcloud

  1. Créez un routeur Cloud Router :

    gcloud compute routers create nat-router \
        --network custom-network1 \
        --region us-east4
  2. Ajoutez une configuration au routeur :

    gcloud compute routers nats create nat-config \
        --router-region us-east4 \
        --router nat-router \
        --nat-all-subnet-ip-ranges \
        --auto-allocate-nat-external-ips

Terraform

Vous pouvez utiliser une ressource Terraform pour créer un routeur Cloud Router.

resource "google_compute_router" "router" {
  project = var.project_id
  name    = "nat-router"
  network = var.network
  region  = "us-east4"
}

Vous pouvez utiliser un module Terraform pour créer une configuration NAT.

module "cloud-nat" {
  source                             = "terraform-google-modules/cloud-nat/google"
  version                            = "~> 2.0.0"
  project_id                         = var.project_id
  region                             = "us-east4"
  router                             = google_compute_router.router.name
  name                               = "nat-config"
  source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
}

Étape 7 : Essayer de se reconnecter à Internet

La propagation de la configuration NAT peut prendre jusqu'à trois minutes. Vous devez donc attendre au moins une minute avant d'essayer d'accéder de nouveau à Internet.

Si vous n'êtes toujours pas connecté à kube-dns, reconnectez-vous en suivant la procédure décrite à l'étape 5. Une fois connecté, exécutez de nouveau la commande curl :

curl example.com

Le résultat devrait contenir ce qui suit :


<html>
<head>
<title>Example Domain</title>
...
...
...
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is established to be used for illustrative examples in documents. You can use this
    domain in examples without prior coordination or asking for permission.</p>
    <p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>

Étape suivante