Gerenciamento de endereços do GKE: configuração de ULOGD2 e Cloud SQL para geração de registros NAT

Este tutorial faz parte de uma série destinada a arquitetos de rede. A série discute as opções de gerenciamento de endereços do Google Kubernetes Engine (GKE) disponíveis para organizações restritas a endereços IPv4.

A série consiste nas partes a seguir:

Este tutorial destina-se a arquitetos de rede com dificuldades para alocar endereços IPv4 RFC 1918 para pods, nós e serviços do GKE devido ao esgotamento ou à fragmentação do espaço de endereço privado. O tutorial mostra como registrar as traduções NAT dos blocos CIDR do GKE. Use o Terraform para automatizar o build de infraestrutura, o SDK do Cloud para inspecionar os componentes relacionados ao banco de dados e o utilitário cliente psql para criar e inspecionar as tabelas de banco de dados associadas.

O diagrama a seguir mostra a solução geral.

Geração de registros NAT do gateway da VPC isolado para o Cloud SQL para PostgreSQL. Para uma versão em PDF legível na tela, clique na imagem.
Figura 1. Geração de registros NAT do gateway da VPC isolado para o Cloud SQL para PostgreSQL. Para uma versão em PDF legível na tela, clique na imagem.

Em um nível alto, você implementa a infraestrutura descrita em detalhes em NAT para todos os blocos CIDR do GKE. Em seguida, adicione o seguinte:

  • Um recurso do Cloud SQL para PostgreSQL.
  • Um bloco de endereços RFC 1918 reservado para uma conexão de endereço IP privado.
  • Uma conexão IP privada com o recurso do Cloud SQL para PostgreSQL.
  • O cliente psql e o utilitário ulog2 para o gateway da VPC isolado.
  • Uma configuração iptables para registrar entradas NAT nas tabelas de conexão.

Neste tutorial, presume-se que você tenha familiaridade com o seguinte:

  • Comandos sysadmin do Linux
  • GKE
  • Compute Engine
  • Cloud SQL para PostgreSQL
  • O utilitário ulogd2
  • Terraform

Objetivos

  • Criar e inspecionar um recurso do Cloud SQL para PostgreSQL
  • Criar e inspecionar um bloco de endereços RFC 1918 reservado para uma conexão de endereço IP privado
  • Criar e inspecionar uma conexão IP particular com o recurso do Cloud SQL para PostgreSQL
  • Instalar o cliente psql e o utilitário ulog2 no gateway da VPC isolado
  • Aplicar uma configuração iptables para registrar entradas NAT na tabela de conexão no gateway VPC isolado

Custos

Neste tutorial, usamos os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem ser qualificados para uma avaliação gratuita.

Ao concluir este tutorial, exclua os recursos criados para evitar o faturamento contínuo. Para mais informações, consulte Como fazer a limpeza.

Antes de começar

Nesta seção, você prepara o Cloud Shell, configura suas variáveis de ambiente e implanta a infraestrutura de suporte.

Preparar o Cloud Shell

  1. No Console do Google Cloud, abra o Cloud Shell.

    Acessar o Cloud Shell

    Você conclui a maior parte deste tutorial a partir do terminal do Cloud Shell usando o Terraform da HashiCorp e o SDK do Cloud.

  2. No terminal do Cloud Shell, clone o repositório do GitHub desta solução:

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

    O repositório contém todos os arquivos necessários para concluir este tutorial. Para obter uma descrição completa de cada arquivo, consulte o arquivo README.md no repositório.

  3. Torne executáveis todos os scripts de shell:

    sudo chmod 755 *.sh
    
  4. Configure o Terraform:

    1. Instale o Terraform.
    2. Inicialize o Terraform:

      terraform init
      

      A saída será assim:

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

Definir variáveis de ambiente

  1. No Cloud Shell, defina as variáveis de ambiente:

    1. Defina e verifique a variável TF_VAR_org_id, substituindo your-organization-name pelo nome da organização do Google Cloud que você quer usar neste tutorial:

      export TF_VAR_org_id=$(gcloud organizations list | \
          awk '/your-organization-name/ {print $2}')
      
    2. Verifique se a variável de ambiente está definida corretamente:

      echo $TF_VAR_org_id
      

      A resposta ao comando lista seu código numérico da organização e é semelhante a esta:

      ...
      123123123123
      ...
      
    3. Defina as variáveis de ambiente para os recursos restantes:

      source set_variables.sh
      

      Verifique se as variáveis de ambiente estão definidas corretamente:

      env | grep TF_
      

      A saída será assim:

      ...
      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. Crie um arquivo de variável de ambiente:

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

    Essa cadeia de comando redireciona as variáveis de ambiente que você criou para um arquivo chamado TF_ENV_VARS. Cada variável é precedida pelo comando export. É possível usar esse arquivo para redefinir as variáveis de ambiente caso a sessão do Cloud Shell seja encerrada. Neste tutorial, essas variáveis são usadas pelos scripts do Terraform, scripts de shell e comandos do SDK.

    Se você precisar reinicializar as variáveis, execute o seguinte comando no diretório em que o arquivo está localizado:

    source TF_ENV_VARS
    

Implantar a infraestrutura de suporte

  • No Cloud Shell, implante a infraestrutura de suporte do Terraform:

    terraform apply
    

    O Terraform solicita a confirmação antes de fazer qualquer alteração. Resposta yes.

    O comando anterior instrui o Terraform a implantar todos os componentes do tutorial. Para entender melhor como a infraestrutura é declarativamente definida, leia os manifestos do Terraform, ou seja, os arquivos com as extensões .tf.

    No final da resposta ao comando, você verá a seguinte saída do Terraform:

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

    Anote a senha. Essa é a senha do banco de dados que você usará posteriormente para se conectar à instância do banco de dados com o cliente Postgres.

    É possível que o Terraform exiba um erro e pare a implantação. Esse erro é o resultado de uma disputa na criação de recursos. Se você vir esse erro, execute novamente o comando terraform apply.

Como inspecionar a infraestrutura de suporte

Agora você usa a ferramenta de linha de comando gcloud para visualizar e verificar a infraestrutura criada pelo Terraform. A verificação envolve a execução de um comando para ver se o recurso responde e foi criado corretamente.

Verificar a configuração de acesso privado

  1. No Cloud Shell, liste o espaço de endereço privado reservado:

    gcloud compute addresses list --project=$TF_VAR_isolated_vpc_pid
    

    A saída será assim:

    ...
    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. Liste o peering de VPC:

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

    A saída será assim:

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

Verificar o banco de dados

  1. No Cloud Shell, defina o nome da instância do banco de dados:

    export DB_INSTANCE=$(gcloud sql instances list \
         --project=$TF_VAR_isolated_vpc_pid \
       | grep master-instance \
       | awk '{print $1}')
    
  2. Verifique a instância:

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

    A saída será assim:

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

    Anote o ipAddress do banco de dados. Na saída anterior, o endereço é 10.231.0.3. Observe também o bloco CIDR usado pelo endereço do Cloud SQL para PostgreSQL. Você deriva esse bloco aplicando uma máscara de rede /24 ao valor ipAddress do Cloud SQL para PostgreSQL. Usando essa saída, o bloco CIDR seria 10.231.0.0/24. Você precisa dessas informações para se conectar ao banco de dados.

  3. Verifique o banco de dados:

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

    A saída será assim:

    ...
    NAME      CHARSET  COLLATION
    postgres  UTF8     en_US.UTF8
    ulog2     UTF8     en_US.UTF8
    ...
    
  4. Verifique o usuário do banco de dados:

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

    A saída será assim:

    ...
    NAME      HOST
    postgres
    ulog2
    ...
    

Configurar a geração de registros NAT

Nesta seção, você se conecta ao gateway da VPC isolado e instala os utilitários e bancos de dados usados para o restante do tutorial.

  1. No Cloud Shell, conecte-se ao gateway da VPC isolado usando ssh:

    gcloud compute ssh isolated-vpc-gw \
        --project=$TF_VAR_isolated_vpc_pid \
        --zone=$TF_VAR_zone
    
  2. Instale o utilitário ulogd2:

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

    A saída será assim:

    ...
    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. Instale o cliente Postgres:

    sudo apt-get install -y postgresql-client
    

    A saída será assim:

    ...
    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. Adicione uma rota à sub-rede de acesso privado, substituindo replace-with-cloud-sql-cidr pelo bloco CIDR do Cloud SQL para PostgreSQL 10.231.0.0/24 derivado anteriormente.

    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
    

    A saída será assim:

    ...
    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. Configure a tabela do banco de dados, substituindo o valor replace-with-cloud-sql-ip-address pelo ipAddress valor 10.231.0.3 do Cloud SQL para PostgreSQL que você anotou anteriormente:

    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
    

    Quando solicitado, digite a senha do banco de dados que você anotou na saída do Terraform.

  6. Faça login no banco de dados e adicione a linguagem plpgsql para ulog2, substituindo replace-with-cloud-sql-ip-address pelo valor 10.231.0.3:

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

    Quando solicitado, digite a senha do banco de dados que você anotou na saída do Terraform.

  7. Adicione a linguagem processual do Postgres à tabela ulog:

    CREATE EXTENSION plpgsql FROM unpackaged;
    
  8. Verifique a tabela do banco de dados:

    select * from ulog2_ct;
    

    A saída será assim:

    ...
    --------+------------+-------------------+-------------------+------------------+---------------+---------------+-----------------+-------------------+--------------------+--------------------+-------------------+----------------+----------------+------------------+--------------------+-----------+-----------+---------+----------------+-----------------+--------------+---------------+----------
     _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. Saia do banco de dados:

    \q
    
  10. Configure o utilitário 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. Modifique o arquivo /etc/ulogd.conf usando um editor de texto e o comando sudo. Altere a seção [pgsql2] para o seguinte:

    [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. Inicie o daemon ulogd2 e ative-o nas reinicializações do sistema:

    sudo systemctl start ulogd2
    sudo systemctl enable ulogd2
    

    A saída será assim:

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

Como verificar a solução

Nesta seção, você testará o aplicativo e verificará a geração de registros NAT.

Testar o app

  1. Inicie um novo terminal do Cloud Shell.
  2. Conecte-se à instância test-10-11-vm do Compute Engine usando ssh e mude para o diretório de trabalho do repositório 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. Conecte-se ao aplicativo:

    curl http://10.32.31.49:8080/
    

    A saída será assim:

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

    Esse comando recupera a página da Web do aplicativo em execução no cluster do GKE.

Verificar a geração de registros NAT

  1. No Cloud Shell, conecte-se à instância do Cloud SQL para PostgreSQL:

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

    Quando solicitado, digite a senha do banco de dados que você anotou anteriormente.

  2. Consulte o banco de dados:

    SELECT * FROM ulog2_ct WHERE orig_ip_saddr_str='10.0.0.2';
    

    A saída será assim

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

    Saia do banco de dados:

    \q
    

    Se você não vir entradas no banco de dados, execute os seguintes comandos:

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

    Em seguida, verifique novamente as entradas começando na etapa 2 desta seção. Esses comandos reiniciam o daemon ulogd2.

Limpeza

Destruir a infraestrutura

  1. No primeiro terminal do Cloud Shell, pare o daemon ulogd2 e desconecte-o do recurso do Cloud SQL para PostgreSQL:

    sudo systemctl stop ulogd
    sudo systemctl disable ulogd
    
  2. Saia da sessão SSH para o gateway VPC isolado:

    exit
    
  3. No Cloud Shell, destrua a configuração e todos os componentes do tutorial:

    terraform destroy
    

    O Terraform solicita a confirmação antes de fazer a alteração. Responda yes quando solicitado.

    É possível ver o seguinte erro do 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 erro ocorre quando o comando tenta destruir a rede VPC isolada antes de destruir as regras de firewall do GKE.

  4. Corrija o erro removendo as regras de firewall não padrão da VPC isolada:

    ../allnat/k8-fwr.sh
    

    Esse script mostra quais regras de firewall serão removidas.

  5. Revise a lista e, quando solicitado, digite yes.

  6. Quando o script estiver concluído, execute novamente o comando destroy.

    É possível ver o seguinte erro do 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
    ...
    

    Esse erro ocorre quando o Terraform tenta destruir o usuário do banco de dados antes que o banco de dados do Cloud SQL para PostgreSQL seja totalmente excluído. Aguarde dois minutos após o erro aparecer e vá para a próxima etapa.

  7. No terminal original do Cloud Shell, execute novamente o comando destroy:

    terraform destroy
    

    O Terraform solicita a confirmação antes de fazer a alteração.

  8. Responda yes para destruir a configuração.

  9. Remova todos os arquivos criados durante este tutorial:

    cd ../..
    rm -rf kam
    

A seguir