Administración de direcciones de GKE: Configura ULOGD2 y Cloud SQL para el registro de NAT

Este instructivo forma parte de una serie destinada a arquitectos de red. En la serie, se analizan las opciones de administración de direcciones de Google Kubernetes Engine (GKE) disponibles para las organizaciones con restricción de dirección IPv4.

La serie consta de las siguientes partes:

Este instructivo está dirigido a los arquitectos de red que tienen dificultades para asignar direcciones IPv4 de RFC 1918 a nodos, servicios y pods de GKE debido al agotamiento o la fragmentación del espacio para direcciones privadas. En este instructivo, se muestra cómo registrar las traducciones NAT de los bloques CIDR de GKE. Usarás Terraform para automatizar la compilación de la infraestructura, el SDK de Cloud para inspeccionar los componentes relacionados con la base de datos, y la utilidad de cliente psql para compilar e inspeccionar las tablas de base de datos asociadas.

En el siguiente diagrama, se muestra la solución general.

Registros de NAT de la puerta de enlace de VPC aislada a Cloud SQL para PostgreSQL (Para obtener una versión en formato PDF legible, haz clic en la imagen).
Figura 1. Registros de NAT de la puerta de enlace de VPC aislada a Cloud SQL para PostgreSQL. (Para obtener una versión en formato PDF legible, haz clic en la imagen).

En un nivel alto, debes implementar la infraestructura que se describe en profundidad en NAT para todos los bloques de CIDR de GKE. Luego, agrega lo que se describe a continuación:

  • Un recurso de Cloud SQL para PostgreSQL
  • Un bloque de direcciones RFC 1918 reservado para una conexión de dirección IP privada
  • Una conexión IP privada al recurso de Cloud SQL para PostgreSQL
  • El cliente psql y la utilidad ulog2 de la puerta de enlace de VPC aislada
  • Una configuración iptables para registrar entradas de NAT en las tablas de conexiones

En este instructivo, suponemos que estás familiarizado con lo siguiente:

  • Comandos de administrador de sistemas de Linux
  • GKE
  • Compute Engine
  • Cloud SQL para PostgreSQL
  • La utilidad ulogd2
  • Terraform

Objetivos

  • Crear e inspeccionar un recurso de Cloud SQL para PostgreSQL
  • Crear e inspeccionar un bloque de direcciones RFC 1918 reservado para una conexión de dirección IP privada
  • Crear e inspeccionar una conexión IP privada para un recurso de Cloud SQL para PostgreSQL
  • Instalar el cliente psql y la utilidad ulog2 en la puerta de enlace de VPC aislada
  • Aplicar una configuración iptables para registrar entradas de NAT en la tabla de conexiones de la puerta de enlace de VPC aislada

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud sean aptos para obtener una prueba gratuita.

Cuando finalices este instructivo, podrás borrar los recursos creados para evitar que se te siga facturando. Para obtener más información, consulta cómo hacer una limpieza.

Antes de comenzar

En esta sección, debes preparar Cloud Shell, configurar las variables de entorno e implementar la infraestructura de respaldo.

Prepara Cloud Shell

  1. En Google Cloud Console, abre Cloud Shell.

    Ir a Cloud Shell

    Completarás la mayor parte de este instructivo desde la terminal de Cloud Shell mediante Terraform de HashiCorp y el SDK de Cloud.

  2. Desde la terminal de Cloud Shell, clona el repositorio de GitHub de esta solución:

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

    El repositorio contiene todos los archivos que necesitas para completar este instructivo. Para obtener una descripción completa de cada archivo, consulta el archivo README.md en el repositorio.

  3. Haz que todas las secuencias de comandos de shell sean ejecutables:

    sudo chmod 755 *.sh
    
  4. Sigue estos pasos para configurar Terraform:

    1. Instala Terraform.
    2. Inicializa Terraform mediante este comando:

      terraform init
      

      El resultado es similar a este:

      ...
      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.
      ...
      

Configura variables de entorno

  1. En Cloud Shell, sigue estos pasos para configurar las variables de entorno:

    1. Configura y verifica la variable TF_VAR_org_id; para ello, reemplaza your-organization-name por el nombre de la organización de Google Cloud que deseas usar en este instructivo:

      export TF_VAR_org_id=$(gcloud organizations list | \
          awk '/your-organization-name/ {print $2}')
      
    2. Verifica que la variable de entorno esté configurada de manera correcta:

      echo $TF_VAR_org_id
      

      El resultado del comando muestra el ID numérico de la organización y es similar al siguiente:

      ...
      123123123123
      ...
      
    3. Configura las variables de entorno para los recursos restantes:

      source set_variables.sh
      

      Verifica que las variables de entorno estén configuradas de manera correcta con el siguiente comando:

      env | grep TF_
      

      El resultado es similar a este:

      ...
      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. Crea un archivo de variable de entorno:

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

    Esta cadena de comandos redirecciona las variables de entorno que creaste a un archivo llamado TF_ENV_VARS. Cada variable está precedida por el comando export. Puedes usar este archivo para restablecer las variables de entorno en caso de que finalice la sesión de Cloud Shell. En este instructivo, las secuencias de comandos de Terraform y de shell, y los comandos de SDK usan estas variables.

    Si necesitas reiniciar las variables, puedes ejecutar el siguiente comando desde el directorio en el que reside el archivo:

    source TF_ENV_VARS
    

Implementa la infraestructura de respaldo

  • En Cloud Shell, implementa la infraestructura de respaldo de Terraform:

    terraform apply
    

    Terraform solicita la confirmación antes de realizar los cambios. Responde yes (Sí).

    El comando anterior le indica a Terraform que implemente todos los componentes del instructivo. Para comprender mejor cómo se define de forma declarativa la infraestructura, puedes leer los manifiestos de Terraform, es decir, los archivos con la extensión .tf.

    Al final del resultado del comando, verás el siguiente resultado de Terraform:

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

    Anota la contraseña. Esta es la contraseña de la base de datos que luego usarás para conectarte a la instancia de base de datos con el cliente de Postgres.

    Terraform puede mostrar un error y detener la implementación. Este error es el resultado de una condición de carrera en la creación de recursos. Si ves este error, vuelve a ejecutar el comando terraform apply.

Inspecciona la infraestructura de respaldo

Ahora usarás las herramientas de línea de comandos de gcloud para ver y verificar la infraestructura que creó Terraform. La verificación implica ejecutar un comando para ver si el recurso responde y si se creó de manera correcta.

Verifica la configuración de acceso privado

  1. En Cloud Shell, enumera el espacio reservado para direcciones privadas de la siguiente manera:

    gcloud compute addresses list --project=$TF_VAR_isolated_vpc_pid
    

    El resultado es similar a este:

    ...
    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. Enumera el intercambio de tráfico de VPC con este comando:

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

    El resultado es similar a este:

    ...
    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
    ...
    

Verifica la base de datos

  1. En Cloud Shell, usa este comando a fin de configurar el nombre de la instancia de la base de datos:

    export DB_INSTANCE=$(gcloud sql instances list \
         --project=$TF_VAR_isolated_vpc_pid \
       | grep master-instance \
       | awk '{print $1}')
    
  2. Verifica la instancia de la siguiente manera:

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

    El resultado es similar a este:

    ...
    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:
    ...
    

    Anota la ipAddress de la base de datos. En el resultado anterior, la dirección es 10.231.0.3. También, ten en cuenta el bloque CIDR que usa la dirección de Cloud SQL para PostgreSQL. Obtén este bloque mediante la aplicación de una máscara de red /24 al valor ipAddress de Cloud SQL para PostgreSQL. Mediante este resultado, el bloque CIDR sería 10.231.0.0/24. Necesitas esta información para conectarte a la base de datos.

  3. Usa este comando para verificar la base de datos:

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

    El resultado es similar a este:

    ...
    NAME      CHARSET  COLLATION
    postgres  UTF8     en_US.UTF8
    ulog2     UTF8     en_US.UTF8
    ...
    
  4. Verifica el usuario de la base de datos mediante el siguiente comando:

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

    El resultado es similar a este:

    ...
    NAME      HOST
    postgres
    ulog2
    ...
    

Configura el registro de NAT

En esta sección, te conectarás a la puerta de enlace de VPC aislada e instalarás las utilidades y las bases de datos que necesitarás para el resto del instructivo.

  1. En Cloud Shell, conéctate a la puerta de enlace de VPC aislada mediante ssh:

    gcloud compute ssh isolated-vpc-gw \
        --project=$TF_VAR_isolated_vpc_pid \
        --zone=$TF_VAR_zone
    
  2. Instala la utilidad ulogd2:

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

    El resultado es similar a este:

    ...
    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. Usa este comando para instalar el cliente de Postgres:

    sudo apt-get install -y postgresql-client
    

    El resultado es similar a este:

    ...
    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. Agrega una ruta a la subred de acceso privado. Para esto, debes reemplazar replace-with-cloud-sql-cidr por el bloque CIDR 10.231.0.0/24 de Cloud SQL para PostgreSQL que obtuviste antes.

    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
    

    El resultado es similar a este:

    ...
    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. A fin de configurar la tabla de la base de datos, reemplaza el valor replace-with-cloud-sql-ip-address por el valor 10.231.0.3 de la ipAddress de Cloud SQL para PostgreSQL que anotaste antes:

    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
    

    Cuando se te solicite, ingresa la contraseña de la base de datos que anotaste en el resultado de Terraform.

  6. Accede a la base de datos y reemplaza replace-with-cloud-sql-ip-address por el valor 10.231.0.3 a fin de agregar el lenguaje plpgsql para ulog2:

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

    Cuando se te solicite, ingresa la contraseña de la base de datos que anotaste en el resultado de Terraform.

  7. Agrega el lenguaje de procedimiento de Postgres a la tabla ulog:

    CREATE EXTENSION plpgsql FROM unpackaged;
    
  8. Usa este comando para verificar la tabla de la base de datos:

    select * from ulog2_ct;
    

    El resultado es similar a este:

    ...
    --------+------------+-------------------+-------------------+------------------+---------------+---------------+-----------------+-------------------+--------------------+--------------------+-------------------+----------------+----------------+------------------+--------------------+-----------+-----------+---------+----------------+-----------------+--------------+---------------+----------
     _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. Sal de la base de datos con lo siguiente:

    \q
    
  10. Configura la utilidad 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. Modifica el archivo /etc/ulogd.conf mediante un editor de texto y el comando sudo. Cambia la sección [pgsql2] por la que se muestra a continuación:

    [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. Inicia el daemon ulogd2 y habilítalo en los reinicios del sistema de la siguiente manera:

    sudo systemctl start ulogd2
    sudo systemctl enable ulogd2
    

    El resultado es similar a este:

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

Verifica la solución

En esta sección, probarás la app y verificarás el registro de NAT.

Prueba la app

  1. Inicia una terminal de Cloud Shell nueva.
  2. Conéctate a la instancia test-10-11-vm de Compute Engine mediante ssh y cambia al directorio de trabajo del repositorio de 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. Conéctate a la app:

    curl http://10.32.31.49:8080/
    

    El resultado es similar a este:

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

    Este comando recupera la página web de la app que se ejecuta en el clúster de GKE.

Verifica el registro de NAT

  1. En Cloud Shell, conéctate a la instancia de Cloud SQL para PostgreSQL:

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

    Cuando se te solicite, ingresa la contraseña de la base de datos que anotaste antes.

  2. Consulta la base de datos con este comando:

    SELECT * FROM ulog2_ct WHERE orig_ip_saddr_str='10.0.0.2';
    

    El resultado es similar al que se muestra a continuación:

    ...
     _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)
    ...
    

    Sal de la base de datos con lo siguiente:

    \q
    

    Si no ves entradas en la base de datos, ejecuta los siguientes comandos:

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

    Luego, vuelve a revisar las entradas desde el paso 2 de esta sección. Estos comandos reinician el daemon ulogd2.

Realiza una limpieza

Destruye la infraestructura

  1. Desde la primera terminal de Cloud Shell, detén el daemon ulogd2 y desconéctalo del recurso de Cloud SQL para PostgreSQL:

    sudo systemctl stop ulogd
    sudo systemctl disable ulogd
    
  2. Sal de la sesión SSH a la puerta de enlace de VPC aislada:

    exit
    
  3. En Cloud Shell, destruye la configuración y todos los componentes del instructivo:

    terraform destroy
    

    Terraform solicita la confirmación antes de realizar el cambio. Responde yes (Sí) cuando se te solicite.

    Es posible que veas el siguiente error de Terraform:

    ...
    ∗ 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'
    ...
    

    Este error se produce cuando el comando intenta destruir la red de VPC aislada antes que las reglas de firewall de GKE.

  4. Para corregir el error, quita las reglas de firewall no predeterminadas de la VPC aislada:

    ../allnat/k8-fwr.sh
    

    Esta secuencia de comandos muestra qué reglas de firewall se quitarán.

  5. Revisa la lista y, cuando se te solicite, ingresa yes.

  6. Cuando se complete la secuencia de comandos, vuelve a ejecutar el comando destroy.

    Es posible que veas el siguiente error de Terraform:

    ...
    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
    ...
    

    Este error ocurre cuando Terraform intenta destruir al usuario de la base de datos antes de que la base de datos de Cloud SQL para PostgreSQL esté borrada por completo. Espera dos minutos después de que aparezca el error y, luego, ve al paso siguiente.

  7. Desde la terminal de Cloud Shell original, vuelve a ejecutar el comando destroy:

    terraform destroy
    

    Terraform solicita la confirmación antes de realizar el cambio.

  8. Responde yes para destruir la configuración.

  9. Quita todos los archivos creados durante este instructivo:

    cd ../..
    rm -rf kam
    

Próximos pasos