GKE 地址管理:为 NAT 日志记录配置 ULOGD2 和 Cloud SQL

本教程属于面向网络架构师的系列教程。该系列介绍了 IPv4 地址紧缺的组织可用的 Google Kubernetes Engine (GKE) 地址管理方案。

该系列包含以下部分:

本教程适用于那些由于专用地址空间用尽或碎片化而难以为 GKE Pod、节点和服务分配 RFC 1918 IPv4 地址的网络架构师。本教程介绍如何记录 GKE CIDR 块的 NAT 转换。您可以使用 Terraform 自动构建基础架构、使用 Cloud SDK 检查数据库相关组件,并使用 psql 客户端实用程序构建和检查关联的数据库表。

下图显示了整体解决方案。

记录到 Cloud SQL for PostgreSQL 的独立 VPC 网关 NAT。(如需支持屏幕阅读功能的 PDF 版本,请点击图片)。
图 1.记录到 Cloud SQL for PostgreSQL 的独立 VPC 网关 NAT。(如需支持屏幕阅读功能的 PDF 版本,请点击图片。)

概括来讲,您需要实现所有 GKE CIDR 块的 NAT 中所详述的基础架构。然后,需要添加以下内容:

  • Cloud SQL for PostgreSQL 资源。
  • 用于专用 IP 地址连接的预留 RFC 1918 地址块。
  • 与 Cloud SQL for PostgreSQL 资源的专用 IP 连接。
  • 独立 VPC 网关的 psql 客户端和 ulog2 实用程序。
  • 用于在连接表中记录 NAT 条目的 iptables 配置。

本教程假定您熟悉以下内容:

  • Linux 系统管理员命令
  • GKE
  • Compute Engine
  • Cloud SQL for PostgreSQL
  • ulogd2 实用程序
  • Terraform

目标

  • 创建并检查 Cloud SQL for PostgreSQL 资源。
  • 为专用 IP 地址连接创建并检查预留的 RFC 1918 地址块。
  • 创建并检查与 Cloud SQL for PostgreSQL 资源的专用 IP 连接。
  • 在独立 VPC 网关上安装 psql 客户端和 ulog2 实用程序。
  • 应用 iptables 配置以在独立 VPC 网关上的连接表中记录 NAT 条目。

费用

本教程使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用量来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

准备工作

在本部分中,您需要准备 Cloud Shell,设置环境变量并部署辅助基础架构。

准备 Cloud Shell

  1. 在 Google Cloud Console 中,打开 Cloud Shell。

    转到 Cloud Shell

    您可以使用 HashiCorp 的 Terraform 和 Cloud SDK 从 Cloud Shell 终端完成本教程的大部分内容。

  2. 从 Cloud Shell 终端克隆此解决方案的 GitHub 代码库:

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

    该代码库包含完成本教程所需的所有文件。如需查看每个文件的完整说明,请参阅代码库中的 README.md 文件。

  3. 将所有 Shell 脚本设置为可执行脚本:

    sudo chmod 755 *.sh
    
  4. 设置 Terraform:

    1. 安装 Terraform
    2. 初始化 Terraform:

      terraform init
      

      输出类似于以下内容:

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

设置环境变量

  1. 在 Cloud Shell 中,设置环境变量:

    1. 设置并验证 TF_VAR_org_id 变量,将 your-organization-name 替换为您要在本教程中使用的 Google Cloud 组织名称:

      export TF_VAR_org_id=$(gcloud organizations list | \
          awk '/your-organization-name/ {print $2}')
      
    2. 验证是否已正确设置环境变量:

      echo $TF_VAR_org_id
      

      命令输出会以数字形式列出您的组织 ID,如下所示:

      ...
      123123123123
      ...
      
    3. 为其余资源设置环境变量:

      source set_variables.sh
      

      验证是否已正确设置环境变量:

      env | grep TF_
      

      输出类似于以下内容:

      ...
      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. 创建环境变量文件:

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

    此命令链会将您创建的环境变量重定向到名为 TF_ENV_VARS 的文件中。每个变量前面都会附加 export 命令。如果 Cloud Shell 会话终止,您可以使用此文件来重置环境变量。这些变量可供本教程中的 Terraform 脚本、Shell 脚本和 SDK 命令使用。

    如果您需要重新初始化这些变量,则可以从该文件所在的目录运行以下命令:

    source TF_ENV_VARS
    

部署辅助基础架构

  • 在 Cloud Shell 中,部署 Terraform的辅助基础架构:

    terraform apply
    

    在进行任何更改之前,Terraform 会先提示您进行确认。回答 yes

    上述命令指示 Terraform 部署本教程的所有组件。要详细了解如何通过声明定义基础结构,您可以浏览 Terraform 清单,即扩展名为 .tf 的文件。

    命令输出结束时,您会看到以下 Terraform 输出:

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

    记下密码。这是您稍后用于通过 Postgres 客户端连接到数据库实例的数据库密码。

    Terraform 可能会显示错误并停止部署。此错误是资源创建过程中出现竞态条件导致的。如果出现此错误,请重新运行 terraform apply 命令。

检查辅助基础架构

现在您可以使用 gcloud 命令行工具来查看和验证 Terraform 创建的基础架构。在验证时,您需要运行一条命令,以查看资源是否响应以及是否已正确创建。

验证专用访问权限配置

  1. 在 Cloud Shell 中,列出预留的专用地址空间:

    gcloud compute addresses list --project=$TF_VAR_isolated_vpc_pid
    

    输出类似于以下内容:

    ...
    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. 列出 VPC 对等互连:

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

    输出类似于以下内容:

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

验证数据库

  1. 在 Cloud Shell 中,设置数据库实例名称:

    export DB_INSTANCE=$(gcloud sql instances list \
         --project=$TF_VAR_isolated_vpc_pid \
       | grep master-instance \
       | awk '{print $1}')
    
  2. 验证实例:

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

    输出类似于以下内容:

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

    记下数据库的 ipAddress。在上面的输出中,地址为 10.231.0.3。另请注意 Cloud SQL for PostgreSQL 地址使用的 CIDR 块。您可以通过将 /24 网络掩码应用于 Cloud SQL for PostgreSQL ipAddress 值来派生此块。使用此输出时,CIDR 块将为 10.231.0.0/24。您需要使用此信息才能连接到数据库。

  3. 验证数据库:

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

    输出类似于以下内容:

    ...
    NAME      CHARSET  COLLATION
    postgres  UTF8     en_US.UTF8
    ulog2     UTF8     en_US.UTF8
    ...
    
  4. 验证数据库用户:

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

    输出类似于以下内容:

    ...
    NAME      HOST
    postgres
    ulog2
    ...
    

配置 NAT 日志记录

在本部分中,您将连接到独立 VPC 网关并安装本教程其余部分使用的实用程序和数据库。

  1. 在 Cloud Shell 中,使用 ssh 连接到独立 VPC 网关:

    gcloud compute ssh isolated-vpc-gw \
        --project=$TF_VAR_isolated_vpc_pid \
        --zone=$TF_VAR_zone
    
  2. 安装 ulogd2 实用程序:

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

    输出类似于以下内容:

    ...
    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. 安装 Postgres 客户端:

    sudo apt-get install -y postgresql-client
    

    输出类似于以下内容:

    ...
    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. 向专用访问子网添加路由,将 replace-with-cloud-sql-cidr 替换为您之前派生的 Cloud SQL for PostgreSQL CIDR 块 10.231.0.0/24

    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
    

    输出类似于以下内容:

    ...
    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. 配置数据库表,将 replace-with-cloud-sql-ip-address 值替换为您之前记下的 Cloud SQL for PostgreSQL ipAddress10.231.0.3

    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
    

    出现提示时,输入您记下的来自 Terraform 输出的数据库密码。

  6. 登录数据库并为 ulog2 添加 plpgsql 语言,将 replace-with-cloud-sql-ip-address 替换为值 10.231.0.3

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

    出现提示时,输入您记下的来自 Terraform 输出的数据库密码。

  7. 将 Postgres 程序语言添加到 ulog 表中:

    CREATE EXTENSION plpgsql FROM unpackaged;
    
  8. 验证数据库表:

    select * from ulog2_ct;
    

    输出类似于以下内容:

    ...
    --------+------------+-------------------+-------------------+------------------+---------------+---------------+-----------------+-------------------+--------------------+--------------------+-------------------+----------------+----------------+------------------+--------------------+-----------+-----------+---------+----------------+-----------------+--------------+---------------+----------
     _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. 退出数据库:

    \q
    
  10. 配置 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. 使用文本编辑器和 sudo 命令修改 /etc/ulogd.conf 文件。将 [pgsql2] 部分更改为以下内容:

    [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. 启动 ulogd2 守护程序并在系统重新启动时启用它:

    sudo systemctl start ulogd2
    sudo systemctl enable ulogd2
    

    输出类似于以下内容:

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

验证解决方案

在本部分中,您将测试应用并验证 NAT 日志记录。

测试应用

  1. 启动新的 Cloud Shell 终端
  2. 使用 ssh 连接到 test-10-11-vm Compute Engine 实例,然后切换到 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. 连接到该应用:

    curl http://10.32.31.49:8080/
    

    输出类似于以下内容:

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

    此命令会从 GKE 集群上运行的应用中检索网页。

验证 NAT 日志记录

  1. 在 Cloud Shell 中,连接到 Cloud SQL for PostgreSQL 实例:

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

    出现提示时,输入您之前记下的数据库密码。

  2. 查询数据库:

    SELECT * FROM ulog2_ct WHERE orig_ip_saddr_str='10.0.0.2';
    

    输出类似于以下内容

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

    退出数据库:

    \q
    

    如果您在数据库中没有看到条目,请运行以下命令:

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

    然后从本部分的第 2 步开始重新检查条目。这些命令会重启 ulogd2 守护程序。

清除数据

销毁基础架构

  1. 在第一个 Cloud Shell 终端中,停止 ulogd2 守护程序并断开它与 Cloud SQL for PostgreSQL 资源的连接:

    sudo systemctl stop ulogd
    sudo systemctl disable ulogd
    
  2. 从 SSH 会话退出到独立 VPC 网关:

    exit
    
  3. 在 Cloud Shell 中,销毁相应配置和本教程中的所有组件:

    terraform destroy
    

    在进行该更改之前,Terraform 会先提示您进行确认。出现提示时回答 yes

    您可能会看到以下 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'
    ...
    

    如果该命令在销毁 GKE 防火墙规则之前试图销毁独立 VPC 网络,则会出现此错误。

  4. 请通过从独立 VPC 中移除非默认防火墙规则来修复错误:

    ../allnat/k8-fwr.sh
    

    此脚本显示要移除的防火墙规则。

  5. 查看列表并在出现提示时输入 yes

  6. 脚本完成后,重新运行 destroy 命令。

    您可能会看到以下 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
    ...
    

    如果 Terraform 在 Cloud SQL for PostgreSQL 数据库被完全删除之前尝试销毁数据库用户,则会出现此错误。错误出现后等待两分钟,然后继续执行下一步。

  7. 在原始 Cloud Shell 终端中,重新运行 destroy 命令:

    terraform destroy
    

    在进行该更改之前,Terraform 会先提示您进行确认。

  8. 回答 yes 即可销毁此配置。

  9. 移除在本教程中创建的所有文件:

    cd ../..
    rm -rf kam
    

后续步骤