Gestion des adresses GKE : configuration de ULOGD2 et Cloud SQL pour la journalisation NAT

Ce tutoriel fait partie d'une série destinée aux architectes réseau. Cette série aborde les options de gestion des adresses de Google Kubernetes Engine (GKE) disponibles pour les organisations dont l'adressage IPv4 est limité.

Cette série comprend les parties suivantes :

Ce tutoriel est destiné aux architectes réseau qui rencontrent des difficultés pour allouer des adresses IPv4 RFC 1918 aux pods, nœuds et services GKE en raison de l'épuisement ou de la fragmentation de l'espace d'adressage privé. Ce tutoriel vous explique comment consigner les traductions NAT des blocs CIDR de GKE. Vous utilisez Terraform pour automatiser le build de l'infrastructure, le SDK Cloud pour inspecter les composants associés à la base de données et l'utilitaire client psql pour créer et inspecter les tables.

Le schéma suivant montre la solution globale.

Journalisation NAT d'une passerelle VPC isolée vers Cloud SQL pour PostgreSQL (Pour obtenir une version PDF lisible, cliquez sur l'image.)
Figure 1. Journalisation NAT d'une passerelle VPC isolée vers Cloud SQL pour PostgreSQL (Pour obtenir une version PDF lisible, cliquez sur l'image.)

En règle générale, vous mettez en œuvre l'infrastructure décrite en détail dans NAT pour tous les blocs CIDR de GKE. Ensuite, ajoutez les éléments suivants :

  • Une ressource Cloud SQL pour PostgreSQL
  • Un bloc d'adresse RFC 1918 réservé pour une connexion d'adresse IP privée
  • Une connexion IP privée à la ressource Cloud SQL pour PostgreSQL
  • Le client psql et utilitaire ulog2 de la passerelle de VPC isolé
  • Une configuration iptables permettant de consigner les entrées NAT dans les tables de connexion

Pour ce tutoriel, nous partons du principe que vous connaissez bien les éléments suivants :

  • Commandes sysadmin Linux
  • GKE
  • Compute Engine
  • Cloud SQL pour PostgreSQL
  • L'utilitaire ulogd2
  • Terraform

Objectifs

  • Créer et inspecter une ressource Cloud SQL pour PostgreSQL
  • Créer et inspecter un bloc d'adresses RFC 1918 réservé pour une connexion d'adresse IP privée
  • Créer et inspecter une connexion IP privée à la ressource Cloud SQL pour PostgreSQL
  • Installer le client psql et l'utilitaire ulog2 sur la passerelle de VPC isolé
  • Utiliser une configuration iptables pour consigner les entrées NAT dans la table de connexion de la passerelle de VPC isolé

Coûts

Ce tutoriel utilise les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Une fois que vous avez terminé ce tutoriel, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Consultez la page Effectuer un nettoyage pour en savoir plus.

Avant de commencer

Dans cette section, vous allez préparer Cloud Shell, configurer vos variables d'environnement et déployer l'infrastructure de soutien.

Préparer Cloud Shell

  1. Dans Google Cloud Console, ouvrez Cloud Shell.

    Accéder à Cloud Shell

    La majeure partie de ce tutoriel se fait à partir du terminal Cloud Shell à l'aide de l'outil Terraform de HashiCorp et du SDK Cloud.

  2. À partir du terminal Cloud Shell, clonez le dépôt GitHub de cette solution :

    git clone https://github.com/GoogleCloudPlatform/terraform-gke-nat-connectivity.git kam
    cd kam/logging
    

    Le dépôt contient tous les fichiers dont vous avez besoin pour suivre ce tutoriel. Pour obtenir une description complète de chaque fichier, consultez le fichier README.md dans le dépôt.

  3. Exécutez tous les scripts shell :

    sudo chmod 755 *.sh
    
  4. Configurez Terraform :

    1. Installez Terraform.
    2. Initialisez Terraform :

      terraform init
      

      Le résultat ressemble à ce qui suit :

      ...
      Initializing provider plugins...
      The following providers do not have any version constraints in configuration, so the latest version was installed.
      
      To prevent automatic upgrades to new major versions that may contain breaking changes, it is recommended to add version = "..." constraints to the corresponding provider blocks in configuration, with the constraint strings suggested below.
      
      ∗ provider.google: version = "~> 2.5"
      
      Terraform has been successfully initialized!
      
      You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work.
      
      If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.
      ...
      

Définir des variables d'environnement

  1. Dans Cloud Shell, définissez vos variables d'environnement :

    1. Définissez et validez la variable TF_VAR_org_id en remplaçant your-organization-name par le nom de l'organisation Google Cloud que vous souhaitez utiliser dans ce tutoriel :

      export TF_VAR_org_id=$(gcloud organizations list | \
          awk '/your-organization-name/ {print $2}')
      
    2. Validez la définition de la variable d'environnement :

      echo $TF_VAR_org_id
      

      Le résultat de la commande répertorie votre ID d'organisation numérique et ressemble à ce qui suit :

      ...
      123123123123
      ...
      
    3. Définissez les variables d'environnement pour les ressources restantes :

      source set_variables.sh
      

      Validez la définition des variables d'environnement :

      env | grep TF_
      

      Le résultat ressemble à ce qui suit :

      ...
      TF_VAR_isolated_net_name=isolated-vpc
      TF_VAR_isolated_pname=isolated-vpc-project
      TF_VAR_isolated_pid=isolated-vpc-project-id
      TF_VAR_shared_net_name=routed-domain-vpc
      TF_VAR_shared_pname=routed-domain-project
      TF_VAR_shared_pid=routed-domain-project-id
      TF_VAR_isolated_vpc_gw_host_nic_ip=10.97.0.2
      TF_VAR_isolated_vpc_gw_service_nic_ip=10.32.0.2
      TF_VAR_isolated_vpc_gw_service_dgw_ip=10.32.0.1
      TF_VAR_org_id=123123123123
      TF_VAR_region=us-west1
      TF_VAR_zone=us-west1-b
      TF_VAR_user_account=user@example.com
      TF_VAR_node_cidr=10.32.0.0/19
      TF_VAR_pod_cidr=10.0.0.0/11
      TF_VAR_service_cidr=10.224.0.0/20
      TF_VAR_shared_cidr=10.97.0.0/24
      TF_VAR_test1_cidr=10.0.0.0/11
      TF_VAR_test2_cidr=10.160.0.0/11
      TF_VAR_test3_cidr=10.64.0.0/19
      TF_VAR_ilb_cidr=10.32.31.0/24
      TF_VAR_masquerade=true
      TF_VAR_db_username=ulog2
      TF_VAR_db_password=ThanksForAllTheFish
      TF_VAR_private_access_cidr=192.168.0.0
      ...
      
  2. Créez un fichier de variables d'environnement :

    env | grep TF_ | sed 's/^/export /' > TF_ENV_VARS
    

    Cette chaîne de commande redirige les variables d'environnement que vous avez créées dans un fichier appelé TF_ENV_VARS. Chaque variable est précédée de la commande export. Vous pouvez utiliser ce fichier pour réinitialiser les variables d'environnement au cas où votre session Cloud Shell prendrait fin. Ces variables sont utilisées par les scripts Terraform, les scripts d'interface système et les commandes du SDK de ce tutoriel.

    Si vous avez besoin de réinitialiser les variables, vous pouvez exécuter la commande suivante à partir du répertoire dans lequel se trouve le fichier :

    source TF_ENV_VARS
    

Déployer l'infrastructure d'assistance

  • Déployez l'infrastructure Terraform dans Cloud Shell :

    terraform apply
    

    Terraform vous invite à confirmer l'opération avant de procéder à des modifications. Sélectionnez yes.

    La commande précédente demande à Terraform de déployer tous les composants du tutoriel. Pour mieux comprendre comment l'infrastructure est définie de manière déclarative, vous pouvez lire les fichiers manifestes Terraform, c'est-à-dire ceux avec l'extension .tf.

    À la fin du résultat de la commande, la sortie Terraform suivante s'affiche :

    ...
    Apply complete! Resources: 45 added, 0 changed, 0 destroyed.
    
    Outputs:
    
    password = 5daa52500549753f
    ...
    

    Notez le mot de passe. Il s'agit du mot de passe de la base de données que vous utiliserez plus tard pour vous connecter à l'instance de la base de données avec le client Postgres.

    Terraform peut afficher une erreur et arrêter le déploiement. Ceci est le résultat d'une condition de concurrence lors de la création de la ressource. Si cette erreur s'affiche, réexécutez la commande terraform apply.

Inspecter l'infrastructure d'assistance

Vous utilisez maintenant l'outil de ligne de commande gcloud pour afficher et vérifier l'infrastructure créée par Terraform. La validation consiste à exécuter une commande pour voir si la ressource répond et a été créée correctement.

Vérifier la configuration de l'accès privé

  1. Dans Cloud Shell, répertoriez l'espace d'adressage privé réservé :

    gcloud compute addresses list --project=$TF_VAR_isolated_vpc_pid
    

    Le résultat ressemble à ce qui suit :

    ...
    NAME                ADDRESS/RANGE  TYPE      PURPOSE      NETWORK          REGION  SUBNET STATUS
    private-ip-address  10.231.0.0/16  INTERNAL  VPC_PEERING  isolated-vpc-net                RESERVED
    ...
    
  2. Répertoriez l'appairage VPC :

    gcloud beta compute networks peerings list --project=$TF_VAR_isolated_vpc_pid
    

    Le résultat ressemble à ce qui suit :

    ...
    NAME                              NETWORK           PEER_PROJECT           PEER_NETWORK                                    IMPORT_CUSTOM_ROUTES  EXPORT_CUSTOM_ROUTES  STATE   STATE_DETAILS
    cloudsql-postgres-googleapis-com  isolated-vpc-net  speckle-umbrella-pg-5  cloud-sql-network-88508764482-eb87f4a6a6dc2193  False                 False                 ACTIVE  [2019-06-06T09:59:57.053-07:00]: Connected.
    servicenetworking-googleapis-com  isolated-vpc-net  k5370e732819230f0-tp   servicenetworking                               False                 False                 ACTIVE  [2019-06-06T09:57:05.900-07:00]: Connected.
    compute.googleapis.com            Compute Engine API
    container.googleapis.com          Google Kubernetes Engine API
    ...
    

Vérifier la base de données

  1. Dans Cloud Shell, définissez le nom de l'instance de base de données :

    export DB_INSTANCE=$(gcloud sql instances list \
         --project=$TF_VAR_isolated_vpc_pid \
       | grep master-instance \
       | awk '{print $1}')
    
  2. Vérifiez l'instance :

    gcloud sql instances describe $DB_INSTANCE --project=$TF_VAR_isolated_vpc_pid
    

    Le résultat ressemble à ce qui suit :

    ...
    backendType: SECOND_GEN
    connectionName: ivpc-pid-1812005657:us-west1:master-instance-b2aab5f6
    databaseVersion: POSTGRES_9_6
    etag: 6e3f96efff84e69da0a0c10e5e6cab7232aa2f4b2b803080950685a2a2517747
    gceZone: us-west1-b
    instanceType: CLOUD_SQL_INSTANCE
    ipAddresses:
    ‐ ipAddress: 10.231.0.3
      type: PRIVATE
    kind: sql#instance
    name: master-instance-b2aab5f6
    project: ivpc-pid-1812005657
    region: us-west1
    selfLink: https://www.googleapis.com/sql/v1beta4/projects/ivpc-pid-1812005657/instances/master-instance-b2aab5f6
    serverCaCert:
    ...
    

    Notez l'adresse IP (ipAddress) de la base de données. Dans le résultat précédent, l'adresse est 10.231.0.3. Notez aussi le bloc CIDR utilisé par l'adresse Cloud SQL pour PostgreSQL. Vous obtenez ce bloc en appliquant un masque de réseau /24 à la valeur ipAddress de Cloud SQL pour PostgreSQL. En utilisant cette sortie, le bloc CIDR serait 10.231.0.0/24. Vous avez besoin de ces informations pour vous connecter à la base de données.

  3. Vérifiez la base de données :

    gcloud sql databases list \
      --project=$TF_VAR_isolated_vpc_pid \
      --instance=$DB_INSTANCE
    

    Le résultat ressemble à ce qui suit :

    ...
    NAME      CHARSET  COLLATION
    postgres  UTF8     en_US.UTF8
    ulog2     UTF8     en_US.UTF8
    ...
    
  4. Vérifiez l'utilisateur de la base de données :

    gcloud sql users list \
      --project=$TF_VAR_isolated_vpc_pid \
      --instance=$DB_INSTANCE
    

    Le résultat ressemble à ce qui suit :

    ...
    NAME      HOST
    postgres
    ulog2
    ...
    

Configurer la journalisation NAT

Dans cette section, vous vous connectez à la passerelle de VPC isolé, puis installez les utilitaires et les bases de données que vous utilisez pour le reste de ce tutoriel.

  1. Dans Cloud Shell, connectez-vous à la passerelle de VPC isolé à l'aide de ssh :

    gcloud compute ssh isolated-vpc-gw \
        --project=$TF_VAR_isolated_vpc_pid \
        --zone=$TF_VAR_zone
    
  2. Installez l'utilitaire ulogd2 :

    sudo apt-get install -y ulogd2 ulogd2-pgsql nfacct
    

    Le résultat ressemble à ce qui suit :

    ...
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    The following additional packages will be installed:
      libnetfilter-acct1 libnetfilter-log1
    Suggested packages:
      ulogd2-dbi ulogd2-json ulogd2-mysql ulogd2-pcap ulogd2-pgsql ulogd2-sqlite3
    The following NEW packages will be installed:
      libnetfilter-acct1 libnetfilter-log1 ulogd2
    0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
    Need to get 125 kB of archives.
    After this operation, 529 kB of additional disk space will be used.
    Get:1 http://deb.debian.org/debian stretch/main amd64 libnetfilter-log1 amd64 1.0.1-1.1 [9,582 B]
    Get:2 http://deb.debian.org/debian stretch/main amd64 libnetfilter-acct1 amd64 1.0.2-1.1 [6,724 B]
    Get:3 http://deb.debian.org/debian stretch/main amd64 ulogd2 amd64 2.0.5-5 [109 kB]
    Fetched 125 kB in 0s (1,604 kB/s)
    Selecting previously unselected package libnetfilter-log1:amd64.
    (Reading database ... 35862 files and directories currently installed.)
    Preparing to unpack .../libnetfilter-log1_1.0.1-1.1_amd64.deb ...
    Unpacking libnetfilter-log1:amd64 (1.0.1-1.1) ...
    Selecting previously unselected package libnetfilter-acct1:amd64.
    Preparing to unpack .../libnetfilter-acct1_1.0.2-1.1_amd64.deb ...
    Unpacking libnetfilter-acct1:amd64 (1.0.2-1.1) ...
    Selecting previously unselected package ulogd2.
    Preparing to unpack .../ulogd2_2.0.5-5_amd64.deb ...
    Unpacking ulogd2 (2.0.5-5) ...
    Setting up libnetfilter-log1:amd64 (1.0.1-1.1) ...
    Processing triggers for systemd (232-25+deb9u11) ...
    Processing triggers for man-db (2.7.6.1-2) ...
    Setting up libnetfilter-acct1:amd64 (1.0.2-1.1) ...
    Setting up ulogd2 (2.0.5-5) ...
    adduser: Warning: The home directory `/var/log/ulog' does not belong to the user you are currently creating.
    Created symlink /etc/systemd/system/ulogd.service → /lib/systemd/system/ulogd2.service.
    Created symlink /etc/systemd/system/multi-user.target.wants/ulogd2.service → /lib/systemd/system/ulogd2.service.
    Processing triggers for systemd (232-25+deb9u11) ...
    ...
    
  3. Installez le client Postgres :

    sudo apt-get install -y postgresql-client
    

    Le résultat ressemble à ce qui suit :

    ...
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    The following additional packages will be installed:
      libpq5 postgresql-client-9.6 postgresql-client-common
    Suggested packages:
      postgresql-9.6 postgresql-doc-9.6
    The following NEW packages will be installed:
      libpq5 postgresql-client postgresql-client-9.6 postgresql-client-common
    0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
    Need to get 1,549 kB of archives.
    After this operation, 6,624 kB of additional disk space will be used.
    Get:1 http://deb.debian.org/debian stretch/main amd64 postgresql-client-common all 181+deb9u2 [79.2 kB]
    Get:2 http://security.debian.org stretch/updates/main amd64 libpq5 amd64 9.6.13-0+deb9u1 [136 kB]
    Get:3 http://deb.debian.org/debian stretch/main amd64 postgresql-client all 9.6+181+deb9u2 [55.8 kB]
    Get:4 http://security.debian.org stretch/updates/main amd64 postgresql-client-9.6 amd64 9.6.13-0+deb9u1 [1,278 kB]
    Fetched 1,549 kB in 0s (2,609 kB/s)
    Selecting previously unselected package libpq5:amd64.
    (Reading database ... 35927 files and directories currently installed.)
    Preparing to unpack .../libpq5_9.6.13-0+deb9u1_amd64.deb ...
    Unpacking libpq5:amd64 (9.6.13-0+deb9u1) ...
    Selecting previously unselected package postgresql-client-common.
    Preparing to unpack .../postgresql-client-common_181+deb9u2_all.deb ...
    Unpacking postgresql-client-common (181+deb9u2) ...
    Selecting previously unselected package postgresql-client-9.6.
    Preparing to unpack .../postgresql-client-9.6_9.6.13-0+deb9u1_amd64.deb ...
    Unpacking postgresql-client-9.6 (9.6.13-0+deb9u1) ...
    Selecting previously unselected package postgresql-client.
    Preparing to unpack .../postgresql-client_9.6+181+deb9u2_all.deb ...
    Unpacking postgresql-client (9.6+181+deb9u2) ...
    Setting up libpq5:amd64 (9.6.13-0+deb9u1) ...
    Processing triggers for libc-bin (2.24-11+deb9u4) ...
    Setting up postgresql-client-common (181+deb9u2) ...
    Processing triggers for man-db (2.7.6.1-2) ...
    Setting up postgresql-client-9.6 (9.6.13-0+deb9u1) ...
    update-alternatives: using /usr/share/postgresql/9.6/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode
    Setting up postgresql-client (9.6+181+deb9u2) ...
    ...
    
  4. Ajoutez un itinéraire vers le sous-réseau d'accès privé en remplaçant replace-with-cloud-sql-cidr par le bloc CIDR Cloud SQL pour PostgreSQL 10.231.0.0/24 que vous avez obtenu précédemment.

    sudo ip route add to replace-with-cloud-sql-cidr \
        via 10.32.0.1 dev eth1 table routed-domain
    ip route show table routed-domain
    

    Le résultat ressemble à ce qui suit :

    ...
    10.0.0.0/8 via 10.97.0.1 dev eth0
    10.32.31.0/24 via 10.32.0.1 dev eth1
    10.231.0.0/24 via 10.32.0.1 dev eth1
    172.16.0.0/12 via 10.97.0.1 dev eth0
    192.168.0.0/16 via 10.97.0.1 dev eth0
    ...
    
  5. Configurez la table de base de données en remplaçant la valeur replace-with-cloud-sql-ip-address par la valeur ipAddress de Cloud SQL pour PostgreSQL 10.231.0.3 que vous avez notée précédemment :

    cd /usr/share/doc/ulogd2
    sudo gzip -d /usr/share/doc/ulogd2/pgsql-ulogd2-flat.sql.gz
    psql -h replace-with-cloud-sql-ip-address -U ulog2 -f pgsql-ulogd2-flat.sql
    

    Lorsque vous y êtes invité, saisissez le mot de passe de la base de données que vous avez noté à partir du résultat Terraform.

  6. Connectez-vous à la base de données et ajoutez la langue plpgsql pour ulog2, en remplaçant replace-with-cloud-sql-ip-address par la valeur 10.231.0.3 :

    psql -h replace-with-cloud-sql-ip-address -U ulog2
    

    Lorsque vous y êtes invité, saisissez le mot de passe de la base de données que vous avez noté à partir du résultat Terraform.

  7. Ajoutez le langage procédural Postgres à la table ulog :

    CREATE EXTENSION plpgsql FROM unpackaged;
    
  8. Vérifiez la table de la base de données :

    select * from ulog2_ct;
    

    Le résultat ressemble à ce qui suit :

    ...
    --------+------------+-------------------+-------------------+------------------+---------------+---------------+-----------------+-------------------+--------------------+--------------------+-------------------+----------------+----------------+------------------+--------------------+-----------+-----------+---------+----------------+-----------------+--------------+---------------+----------
     _ct_id | oob_family | orig_ip_saddr_str | orig_ip_daddr_str | orig_ip_protocol | orig_l4_sport | orig_l4_dport | orig_raw_pktlen | orig_raw_pktcount | reply_ip_saddr_str | reply_ip_daddr_str | reply_ip_protocol | reply_l4_sport | reply_l4_dport | reply_raw_pktlen | reply_raw_pktcount | icmp_code | icmp_type | ct_mark | flow_start_sec | flow_start_usec | flow_end_sec | flow_end_usec | ct_event
    --------+------------+-------------------+-------------------+------------------+---------------+---------------+-----------------+-------------------+--------------------+--------------------+-------------------+----------------+----------------+------------------+--------------------+-----------+-----------+---------+----------------+-----------------+--------------+---------------+----------
    (0 rows)
    ...
    
  9. Fermez la base de données :

    \q
    
  10. Configurez l'utilitaire ulogd2 :

    sudo sed -i 's/^#plugin="\/usr\/lib\/x86_64-linux-gnu\/ulogd\/ulogd_output_PGSQL.so"/plugin="\/usr\/lib\/x86_64-linux-gnu\/ulogd\/ulogd_output_PGSQL.so"/' /etc/ulogd.conf
    
    sudo sed -i 's/#stack=ct1:NFCT,ip2str1:IP2STR,pgsql2:PGSQL/stack=ct2:NFCT,ip2str1:IP2STR,pgsql2:PGSQL/' /etc/ulogd.conf
    
    sudo sed -i 's/^stack=log1:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,emu1:LOGEMU/#stack=log1:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,emu1:LOGEMU/' /etc/ulogd.conf
    
    sudo iptables -A OUTPUT -m state --state NEW -j NFLOG --nflog-group 1
    
  11. Modifiez le fichier /etc/ulogd.conf à l'aide d'un éditeur de texte et de la commande sudo. Remplacez la section [pgsql2] par ce qui suit :

    [pgsql2]
    db="ulog2"
    host="replace-with-cloud-sql-ip-address"
    user="ulog2"
    table="ulog2_ct"
    #schema="public"
    pass="replace-with-database-password"
    procedure="INSERT_CT"
    connstring="hostaddr=replace-with-cloud-sql-ip-address port=5432 dbname=ulog2 user=ulog2 password=replace-with-database-password"
    
    [ct2]
    event_mask=0x00000001
    hash_enable=0
    
  12. Démarrez le daemon ulogd2 et activez-le lors des redémarrages du système :

    sudo systemctl start ulogd2
    sudo systemctl enable ulogd2
    

    Le résultat ressemble à ce qui suit :

    ...
    Synchronizing state of ulogd2.service with SysV service script with /lib/systemd/systemd-sysv-install.
    Executing: /lib/systemd/systemd-sysv-install enable ulogd2
    ...
    

Valider la solution

Dans cette section, vous testez l'application et vérifiez la journalisation NAT.

Tester l'application

  1. Démarrez un nouveau terminal Cloud Shell.
  2. Connectez-vous à l'instance Compute Engine test-10-11-vm à l'aide de ssh, puis accédez au répertoire de travail du dépôt Git :

    cd kam\logging
    source TF_ENV_VARS
    gcloud compute ssh test-10-11-vm \
        --project=$TF_VAR_shared_vpc_pid \
        --zone=$TF_VAR_zone
    
  3. Connectez-vous à l'application :

    curl http://10.32.31.49:8080/
    

    Le résultat ressemble à ce qui suit :

    ...
    Hello, world!
    Version: 1.0.0
    Hostname: my-app-6597cdc789-d6phf
    ...
    

    Cette commande récupère la page Web à partir de l'application exécutée sur le cluster GKE.

Vérifier la journalisation NAT

  1. Dans Cloud Shell, connectez-vous à l'instance Cloud SQL pour PostgreSQL :

    psql -h replace-with-cloud-sql-ip-address -U ulog2
    

    Lorsque vous y êtes invité, saisissez le mot de passe de la base de données que vous avez noté précédemment.

  2. Interrogez la base de données :

    SELECT * FROM ulog2_ct WHERE orig_ip_saddr_str='10.0.0.2';
    

    Le résultat ressemble à ce qui suit :

    ...
     _ct_id | oob_family | orig_ip_saddr_str | orig_ip_daddr_str | orig_ip_protocol | orig_l4_sport | orig_l4_dport | orig_raw_pktlen | orig_raw_pktcount | reply_ip_saddr_str | reply_ip_daddr_str | reply_ip_protocol | reply_l4_sport | reply_l4_dport | reply_raw_pktlen | reply_raw_pktcount | icmp_code | icmp_type | ct_mark | flow_start_sec | flow_start_usec | flow_end_sec | flow_end_usec | ct_event
    --------+------------+-------------------+-------------------+------------------+---------------+---------------+-----------------+-------------------+--------------------+--------------------+-------------------+----------------+----------------+------------------+--------------------+-----------+-----------+---------+----------------+-----------------+--------------+---------------+----------
      12113 |          2 | 10.0.0.2          | 10.32.31.1        |                6 |         58404 |          8080 |               0 |                 0 | 10.32.31.1         | 10.32.0.2          |                 6 |           8080 |          58404 |                0 |                  0 |           |           |       0 |     1560205157 |          950165 |              |               |        1
         63 |          2 | 10.0.0.2          | 10.32.31.1        |                6 |         35510 |          8080 |               0 |                 0 | 10.32.31.1         | 10.32.0.2          |                 6 |           8080 |          35510 |                0 |                  0 |           |           |       0 |     1559949207 |          180828 |              |               |        1
         14 |          2 | 10.0.0.2          | 10.32.31.1        |                6 |         35428 |          8080 |               0 |                 0 | 10.32.31.1         | 10.32.0.2          |                 6 |           8080 |          35428 |                0 |                  0 |           |           |       0 |     1559948312 |          193507 |              |               |        1
    (3 rows)
    ...
    

    Fermez la base de données :

    \q
    

    Si vous ne voyez pas d'entrées dans la base de données, exécutez les commandes suivantes :

    \q
    sudo systemctl stop ulogd2
    sudo systemctl disable ulogd2
    sudo systemctl start ulogd2
    sudo systemctl enable ulogd2
    

    Revérifiez ensuite les entrées en commençant par l'étape 2 de cette section. Ces commandes redémarrent le daemon ulogd2.

Nettoyer

Détruire l'infrastructure

  1. Depuis la première fenêtre du terminal Cloud Shell, arrêtez le daemon ulogd2 et déconnectez-le de la ressource Cloud SQL pour PostgreSQL :

    sudo systemctl stop ulogd
    sudo systemctl disable ulogd
    
  2. Quittez la session SSH vers la passerelle de VPC isolé :

    exit
    
  3. Dans Cloud Shell, détruisez la configuration et tous les composants du tutoriel :

    terraform destroy
    

    Terraform vous invite à confirmer l'opération avant de procéder à la modification. Sélectionnez yes lorsque vous y êtes invité.

    Vous constatez peut-être l'affichage de l'erreur Terraform suivante :

    ...
    ∗ google_compute_network.ivpc (destroy): 1 error(s) occurred:
    ∗ google_compute_network.ivpc: Error waiting for Deleting Network: The network resource 'projects/ivpc-pid--1058675427/global/networks/isolated-vpc-net' is already being used by 'projects/ivpc-pid--1058675427/global/firewalls/k8s-05693142c93de80e-node-hc'
    ...
    

    Cette erreur se produit lorsque la commande tente de détruire le réseau VPC isolé avant de détruire les règles de pare-feu GKE.

  4. Corrigez l'erreur en supprimant les règles de pare-feu autres que celles par défaut du VPC isolé :

    ../allnat/k8-fwr.sh
    

    Ce script indique les règles de pare-feu à supprimer.

  5. Examinez la liste et saisissez yes lorsque vous y êtes invité.

  6. Une fois le script terminé, relancez la commande destroy.

    Vous constatez peut-être l'affichage de l'erreur Terraform suivante :

    ...
    Error: Error applying plan:
    
    1 error(s) occurred:
    
    ∗ google_sql_user.users (destroy): 1 error(s) occurred:
    ∗ google_sql_user.users: Error, failed to delete user ulog2 in instance master-instance-b2aab5f6: googleapi: Error 400: Invalid request: Failed to delete user ulog2. Detail: pq: role "ulog2" cannot be dropped because some objects depend on it
    ., invalid
    ...
    

    Cette erreur se produit lorsque Terraform tente de détruire l'utilisateur de la base de données avant que la base de données Cloud SQL pour PostgreSQL ait été entièrement supprimée. Attendez deux minutes après l'apparition de l'erreur, puis passez à l'étape suivante.

  7. À partir du terminal Cloud Shell d'origine, réexécutez la commande destroy :

    terraform destroy
    

    Terraform vous invite à confirmer l'opération avant de procéder à la modification.

  8. Répondez yes pour détruire la configuration.

  9. Supprimez tous les fichiers créés lors de ce tutoriel :

    cd ../..
    rm -rf kam
    

Étapes suivantes