GKE 주소 관리: NAT 로깅용 ULOGD2 및 Cloud SQL 구성

이 가이드는 네트워크 설계자용 시리즈의 일부입니다. 이 시리즈에서는 IPv4 주소를 제한하는 조직에 사용할 수 있는 Google Kubernetes Engine(GKE) 주소 관리 옵션을 설명합니다.

이 시리즈는 다음 문서로 구성됩니다.

이 가이드는 비공개 주소 공간의 고갈 또는 파편화로 인해 GKE pod, 노드, 서비스에 RFC 1918 IPv4 주소를 할당하는 데 어려움을 겪고 있는 네트워크 설계자를 대상으로 합니다. 이 가이드에서는 GKE CIDR 블록의 NAT 번역을 로깅하는 방법을 보여줍니다. Terraform을 사용하여 인프라 빌드를 자동화하고, Cloud SDK를 사용하여 데이터베이스 관련 구성요소를 검사하고, psql 클라이언트 유틸리티를 사용하여 연결된 데이터베이스 테이블을 빌드하고 검사합니다.

다음 다이어그램은 전체 솔루션을 보여줍니다.

PostgreSQL용 Cloud SQL에 대한 격리된 VPC 게이트웨이 NAT 로깅 (화면에서 읽을 수 있는 PDF 버전을 보려면 이미지를 클릭하세요.)
그림 1. PostgreSQL용 Cloud SQL에 대한 격리된 VPC 게이트웨이 NAT 로깅 (화면에서 읽을 수 있는 PDF 버전을 보려면 이미지를 클릭하세요.)

대략적으로 모든 GKE CIDR 블록의 NAT에 자세히 설명된 인프라를 구현합니다. 그리고 다음을 추가합니다.

  • PostgreSQL용 Cloud SQL 리소스
  • 비공개 IP 주소 연결을 위한 예약된 RFC 1918 주소 블록
  • PostgreSQL용 Cloud SQL 리소스에 대한 비공개 IP 연결
  • 격리된 VPC 게이트웨이에 대한 psql 클라이언트 및 ulog2 유틸리티
  • 연결 테이블에 NAT 항목을 로깅하는 iptables 구성

이 가이드에서는 다음 사항을 잘 알고 있다고 가정합니다.

  • Linux sysadmin 명령어
  • GKE
  • Compute Engine
  • PostgreSQL용 Cloud SQL
  • ulogd2 유틸리티
  • Terraform

목표

  • PostgreSQL용 Cloud SQL 리소스를 만들고 검사합니다.
  • 비공개 IP 주소 연결을 위한 예약된 RFC 1918 주소 블록 만들고 검사합니다.
  • PostgreSQL용 Cloud SQL 리소스에 대한 비공개 IP 연결을 만들고 검사합니다.
  • 격리된 VPC 게이트웨이에 psql 클라이언트와 ulog2 유틸리티를 설치합니다.
  • iptables 구성을 적용하여 격리된 VPC 게이트웨이의 연결 테이블에 NAT 항목을 로깅합니다.

비용

이 가이드에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 가이드를 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않게 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

이 섹션에서는 Cloud Shell을 준비하고, 환경 변수를 설정하고, 지원 인프라를 배포합니다.

Cloud Shell 준비

  1. Google Cloud Console에서 Cloud Shell을 엽니다.

    Cloud Shell로 이동

    이 가이드의 대부분 작업은 Cloud Shell 터미널에서 HashiCorp Terraform과 Cloud SDK를 사용하여 완료합니다.

  2. Cloud Shell 터미널에서 이 솔루션의 GitHub 저장소를 클론합니다.

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

    저장소에는 이 가이드를 완료하는 데 필요한 모든 파일이 있습니다. 각 파일에 대한 자세한 설명은 저장소의 README.md 파일을 참조하세요.

  3. 모든 셸 스크립트를 실행 가능하게 만듭니다.

    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. your-organization-name을 이 가이드에서 사용할 Google Cloud 조직 이름으로 바꿔 TF_VAR_org_id 변수를 설정하고 확인합니다.

      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 스크립트, 셸 스크립트, 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입니다. 또한 PostgreSQL용 Cloud SQL 주소에서 사용하는 CIDR 블록을 확인합니다. PostgreSQL용 Cloud SQL ipAddress 값에 /24 넷마스크를 적용하여 이 블록을 파생합니다. 이 출력을 사용하면 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을 PostgreSQL용 Cloud SQL 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 값을 이전에 적어 둔 PostgreSQL용 Cloud SQL 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. 데이터베이스에 로그인하고 ulog2plpgsql 언어를 추가하고 replace-with-cloud-sql-ip-address10.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에서 PostgreSQL용 Cloud SQL 인스턴스에 연결합니다.

    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 데몬을 중지하고 PostgreSQL용 Cloud SQL 리소스에서 연결을 해제합니다.

    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에서 PostgreSQL용 Cloud SQL 데이터베이스가 완전히 삭제되기 전에 데이터베이스 사용자를 삭제하려고 할 때 발생합니다. 오류가 표시된 후 2분 정도 기다린 후 다음 단계로 이동합니다.

  7. 원래 Cloud Shell 터미널에서 destroy 명령어를 다시 실행합니다.

    terraform destroy
    

    Terraform에서 변경하기 전에 확인 메시지를 표시합니다.

  8. yes를 입력하여 구성을 삭제합니다.

  9. 이 가이드에서 만든 모든 파일을 삭제합니다.

    cd ../..
    rm -rf kam
    

다음 단계