내부 DNS

GCP의 VPC(가상 사설 클라우드) 네트워크에는 동일한 네트워크의 인스턴스 간에 내부 DNS 이름을 사용하여 액세스할 수 있게 해주는 내부 DNS 서비스가 포함되어 있습니다. 내부 DNS 레코드는 .internal 영역에 만들어집니다. 사용자가 VM 인스턴스를 관리할 때 GCP는 자동으로 내부 DNS 레코드를 생성, 업데이트, 삭제합니다.

예를 들어 VM을 삭제하면 GCP가 자동으로 내부 DNS 레코드를 삭제합니다. 같은 이름으로 새로운 VM을 만들면 GCP는 대체를 위한 새 레코드를 만듭니다.

내부 DNS 정보

내부 DNS 이름의 사양은 다음과 같습니다.

  • VM 인스턴스의 내부 DNS 이름은 기본 내부 IP 주소로만 확인됩니다. 내부 DNS 이름은 인스턴스의 외부 IP 주소에 연결하는 데 사용할 수 없습니다.

  • 내부 DNS 이름을 보조 별칭 IP로 확인하도록 구성할 수 없습니다.

  • 내부 DNS 이름은 동일한 프로젝트에 있고 동일한 VPC 또는 레거시 네트워크를 사용하는 다른 VM에서만 확인할 수 있습니다. 동일한 프로젝트에 있더라도 다른 네트워크에 있는 다른 인스턴스에 연결하는 데는 내부 DNS를 사용할 수 없습니다.

내부 DNS, Cloud DNS, 커스텀 호스트 이름

내부 DNS와 Cloud DNS는 서로 다른 제공 서비스입니다. 내부 DNS 이름은 GCP가 자동으로 생성하는 이름입니다. VM의 커스텀 DNS 이름을 만들어야 하는 경우 Cloud DNS 비공개 영역을 사용할 수 있습니다.

또한 VM을 만들 때 VM의 커스텀 호스트 이름을 지정할 수 있습니다. 이러한 방식으로 할당된 커스텀 호스트 이름은 내부 DNS에 의해 확인되지 않습니다. 적절한 영역에 해당 DNS 레코드를 만들어야 합니다(예를 들면 Cloud DNS를 사용하여). 자세한 내용은 커스텀 호스트 이름을 사용하여 VM 인스턴스 만들기를 참조하세요.

내부 DNS 이름의 유형

GCP에는 2가지 유형의 내부 DNS 이름이 있습니다. 기본 내부 DNS 유형은 Compute Engine API를 사용 설정한 시기에 따라 설정됩니다.

내부 DNS 유형 정규화된 도메인 이름(FQDN) 프로젝트의 기본 유형
영역 DNS [INSTANCE_NAME].[ZONE].c.[PROJECT_ID].internal 2018년 9월 6일 이후에 Compute Engine API를 사용 설정한 모든 조직 또는 독립형 프로젝트의 기본값입니다.
전역(프로젝트 전체) DNS [INSTANCE_NAME].c.[PROJECT_ID].internal 2018년 9월 6일 전에 Compute Engine API를 사용 설정한 모든 조직 또는 독립형 프로젝트의 기본값입니다.

각 항목의 의미는 다음과 같습니다.

  • [INSTANCE_NAME]은 인스턴스의 이름입니다.
  • [ZONE]은 인스턴스가 있는 영역입니다.
  • [PROJECT_ID]는 인스턴스가 속한 프로젝트입니다.

프로젝트 또는 인스턴스 수준에서 사용할 내부 DNS 이름의 유형을 제어할 수 있습니다. 자세한 내용은 프로젝트 또는 인스턴스의 DNS 이름 구성을 참조하세요.

내부 DNS 이름 및 공유 VPC

VM의 내부 IP 주소가 호스트 프로젝트의 공유 VPC 네트워크에 있는 경우에도 내부 DNS 이름을 사용하여 이 주소를 참조할 수 있습니다. 공유 VPC를 사용하는 경우 영역 또는 전역(프로젝트 전체) 내부 DNS 이름의 프로젝트 ID 부분이 서비스 프로젝트의 ID입니다.

VM의 내부 DNS 이름 확인

다음 절차에 따라 VM에 할당된 내부 DNS 이름을 확인할 수 있습니다. 내부 DNS 이름이 올바른지 여부는 메타데이터 서버에서 확인할 수 있습니다.

  1. 인스턴스에 연결합니다.
  2. 인스턴스 메타데이터에서 호스트 이름을 확인합니다.

    curl "http://metadata.google.internal/computeMetadata/v1/instance/hostname" \
    -H "Metadata-Flavor: Google"
    

호스트 이름의 형식은 VM이 사용하는 내부 DNS 이름의 유형을 나타냅니다.

내부 DNS로 VM 액세스

메타데이터 서버는 VM에서 실행된 DNS 쿼리의 이름 서버 리졸버의 역할도 합니다. 메타데이터 서버는 내부 DNS 이름과 외부 DNS 이름 모두에 대한 DNS 쿼리 전체를 확인합니다. 외부 DNS 쿼리의 경우에는 메타데이터 서버가 Google의 공개 이름 서버로 요청을 전달합니다.

다음 예에서는 ping을 사용하여 영역 DNS를 사용하는 인스턴스에 연결합니다. 이 메소드는 해당 인스턴스로 들어오는 ICMP 트래픽을 허용하는 방화벽 규칙을 만든 경우에 사용할 수 있습니다.

$ ping [INSTANCE_NAME].[ZONE].c.[PROJECT_ID].internal -c 1

PING [INSTANCE_NAME].[ZONE].c.[PROJECT_ID].internal (10.240.0.17) 56(84) bytes of data.
64 bytes from [INSTANCE_NAME].[ZONE].c.[PROJECT_ID].internal (10.240.0.17): icmp_seq=1 ttl=64 time=0.136 ms

각 항목의 의미는 다음과 같습니다.

  • [INSTANCE_NAME]은 인스턴스의 이름입니다.
  • [ZONE]은 인스턴스가 있는 영역입니다.
  • [PROJECT_ID]는 인스턴스가 속한 프로젝트입니다.

내부 DNS와 resolv.conf

기본적으로 대부분의 Linux 배포판은 DHCP 정보를 resolv.conf에 저장합니다. Compute Engine 인스턴스는 24시간마다 DHCP 임대를 갱신하도록 구성됩니다. 영역 DNS에 대해 설정된 인스턴스의 경우 DHCP 임대가 1시간 간격으로 만료됩니다. DHCP를 갱신하면 이 파일을 덮어쓰고 사용자가 적용한 모든 변경사항을 실행 취소하게 됩니다. 영역 DNS를 사용하는 인스턴스는 resolv.conf 파일에 영역 항목과 전역 항목이 모두 포함됩니다.

영역 DNS

샘플 영역 resolv.conf 파일:

# Local domain name. Computed from your project name.
domain [ZONE].c.[PROJECT_ID].internal
# Search list for hostname lookup. Starting with entries that represent
# your project and ending with google.internal to facilitate metadata server requests.
search [ZONE].c.[PROJECT_ID].internal. c.[PROJECT_ID].internal. google.internal.
# Address of the DNS server to resolve project specific, and global domain names.
nameserver 169.254.169.254

각 항목의 의미는 다음과 같습니다.

  • [ZONE]은 인스턴스가 있는 영역입니다.
  • [PROJECT_ID]는 인스턴스가 속한 프로젝트입니다.

샘플 영역 dhcp.lease 파일:

lease {
  # What interface we are using for the network
  interface "eth0";
  fixed-address 10.128.0.9;
  option subnet-mask 255.255.255.255;
  option routers 10.128.0.1;
  # Lease timeout, older VM instances will have this value set to infinite.
  option dhcp-lease-time 3600;
  option dhcp-message-type 5;
  option domain-name-servers 169.254.169.254;
  option dhcp-server-identifier 169.254.169.254;
  option interface-mtu 1460;
  # Search path options that are copied into the resolv.conf
  option domain-search "[ZONE].c.[PROJECT_ID].internal.", "c.[PROJECT_ID].internal.", "google.internal.";
  option ntp-servers 169.254.169.254;
  option rfc3442-classless-static-routes 32,10,128,0,1,0,0,0,0,0,10,128,0,1;
  option host-name "[INSTANCE_NAME].[ZONE].c.[PROJECT_ID].internal";
  option domain-name "[ZONE].c.[PROJECT_ID].internal";
  renew 4 2017/11/16 02:15:52;
  rebind 4 2017/11/16 02:43:59;
  expire 4 2017/11/16 02:51:29;
}

각 항목의 의미는 다음과 같습니다.

  • [INSTANCE_NAME]은 인스턴스의 이름입니다.
  • [ZONE]은 인스턴스가 있는 영역입니다.
  • [PROJECT_ID]는 인스턴스가 속한 프로젝트입니다.

전역 DNS

샘플 전역 resolv.conf 파일:

# Local domain name. Computed from your project name.
domain c.[PROJECT_ID].internal
# Search list for hostname lookup. Starting with entries that represent
# your project and ending with google.internal to facilitate metadata server requests.
search c.[PROJECT_ID].internal google.internal.
# Address of the DNS server to resolve project specific, and global domain names.
nameserver 169.254.169.254

여기서 [PROJECT_ID]는 인스턴스가 속하는 프로젝트입니다.

샘플 전역 dhcp.lease 파일:

lease {
  # What interface we are using for the network
  interface "eth0";
  fixed-address 10.128.0.8;
  option subnet-mask 255.255.255.255;
  option routers 10.128.0.1;
  # Lease timeout, older VM instances will have this value set to infinite.
  option dhcp-lease-time 86400;
  option dhcp-message-type 5;
  option domain-name-servers 169.254.169.254;
  option dhcp-server-identifier 169.254.169.254;
  option interface-mtu 1460;
  # Search path options that are copied into the resolv.conf
  option domain-search "c.[PROJECT_ID].internal.", "google.internal.";
  option ntp-servers 169.254.169.254;
  option rfc3442-classless-static-routes 32,10,128,0,1,0,0,0,0,0,10,128,0,1;
  option host-name "[INSTANCE_NAME].c.[PROJECT_ID].internal";
  option domain-name "c.[PROJECT_ID].internal";
  renew 4 2017/11/16 12:07:00;
  rebind 4 2017/11/16 22:44:53;
  expire 5 2017/11/17 01:44:53;
}

각 항목의 의미는 다음과 같습니다.

  • [INSTANCE_NAME]은 인스턴스의 이름입니다.
  • [PROJECT_ID]는 인스턴스가 속한 프로젝트입니다.

이러한 파일은 다음과 같은 제한사항을 갖습니다.

  • 검색 경로는 레코드를 6개만 처리할 수 있고, 이러한 레코드 중 3개는 Compute Engine에서 제공됩니다. 총 항목 수가 6개를 초과하는 검색 경로에 항목을 추가하면 6번째 항목 이후에는 검색 규칙이 OS에서 적용되지 않습니다. 그 결과 인스턴스 이름을 통한 인스턴스 액세스 등의 Compute Engine 기능의 작동이 중지됩니다.
  • resolv.conf를 수동으로 편집하면 인스턴스에서 24시간 DHCP 임대가 만료될 때마다 기본 DHCP로 되돌아갑니다. 영역 DNS를 사용하는 인스턴스에서는 DHCP 임대가 1시간마다 만료됩니다. resolv.conf 파일에서 정적 수정을 수행하기 위해 일부 Linux 배포판에서는 항목을 DHCP 정책 앞이나 뒤에 붙일 수 있습니다.

Debian 9

샘플 /etc/dhcp/dhclient.conf 파일:

# Configuration file for /sbin/dhclient.
#
...
append domain-search "mydomain.com";
prepend domain-name-servers 172.16.1.1;

여기서 mydomain.com은 새로운 검색 도메인이고 172.16.1.1은 DNS 서버의 IP입니다.

영역 DNS 이름

영역 DNS 이름에는 인스턴스의 이름, 사용자의 인스턴스가 있는 영역, 인스턴스를 소유하는 프로젝트가 포함됩니다. 인스턴스가 있는 영역은 전역 DNS 이름에 포함되지 않습니다. 한 위치에 있는 영역 DNS 이름은 다른 위치와 독립적으로 작동하므로, 더 많은 가용성 특성을 이용해서 내결함성이 뛰어난 다중 지역 애플리케이션을 빌드할 수 있습니다.

기존 프로젝트 및 조직은 전역 DNS 이름을 계속 사용할 수 있지만 가급적 영역 DNS 이름으로 이전하는 것이 좋습니다.

프로젝트 또는 인스턴스의 DNS 이름 구성

프로젝트 또는 인스턴스 메타데이터에서 VmDnsSetting 변수를 설정하여 인스턴스에서 영역 DNS 또는 전역 DNS 검색 경로를 사용 설정할 수 있습니다. 특정 인스턴스의 메타데이터에서 VmDnsSetting 변수를 설정하면 해당 인스턴스의 프로젝트 메타데이터에서 상속된 모든 VmDnsSetting 변수가 재정의됩니다.

  • 해당 영역 DNS 이름으로만 인스턴스 주소를 확인할 수 있도록 VmDnsSetting=ZonalOnly를 설정합니다. 인스턴스는 영역 및 전역 검색 경로를 계속 유지하지만, 해당 전역 DNS 이름은 더 이상 작동하지 않습니다. 다른 인스턴스는 영역 DNS 이름만 사용해서 이 설정으로 인스턴스의 주소를 지정할 수 있으며, 해당 전역 DNS 이름 또는 검색 경로를 사용해서는 이러한 인스턴스에 주소를 지정할 수 없습니다. 이는 애플리케이션에서 지원한다면 권장되는 옵션입니다. 2018년 9월 6일 이후에 Compute Engine API를 사용 설정한 조직에서 만든 프로젝트와 독립형 프로젝트의 경우 인스턴스에 이 설정이 기본적으로 적용됩니다. 프로젝트가 조직으로 이전되는 경우에는 해당 프로젝트의 기본 DNS 이름이 변경되지 않습니다.
  • 전역 DNS 이름을 보존하면서 영역 DNS 검색 경로를 사용하도록 VmDnsSetting=ZonalPreferred를 설정합니다. 이렇게 설정한 인스턴스는 영역 또는 전역 DNS 이름을 사용해서 서로의 주소를 확인할 수 있으며, 전역 DNS 이름으로만 구성된 인스턴스의 주소를 계속 확인할 수 있습니다.
  • 인스턴스가 전역 이름만 도메인 이름 및 검색 경로 항목으로 사용하도록 VmDnsSetting=GlobalOnly를 설정합니다. 프로젝트 전체 영역 DNS 설정에서 인스턴스를 제외하거나, 전역 DNS 이름만 사용하도록 인스턴스를 복원하려는 경우에 이 값을 사용합니다. 2018년 9월 6일 전에 Compute Engine API를 사용 설정한 조직에서 만든 프로젝트와 독립형 프로젝트의 경우 인스턴스에 이 설정이 기본적으로 적용됩니다. 프로젝트가 조직으로 이전되는 경우에는 해당 프로젝트의 기본 DNS 이름이 변경되지 않습니다.

프로젝트 메타데이터 또는 인스턴스 메타데이터 값을 설정하는 방법을 알아보려면 커스텀 메타데이터 설정을 읽어보세요.

인스턴스의 VmDnsSetting 변수를 구성한 후에는 해당 인스턴스에서 DHCP 임대를 새로 고칩니다. 인스턴스를 다시 시작하거나, 임대가 만료되기를 기다리거나, 다음 명령어 중 하나를 실행하여 임대를 새로 고칠 수 있습니다.

  • Linux 인스턴스: sudo dhclient -v -r
  • Windows Server 인스턴스: ipconfig /renew

기존 애플리케이션을 영역 DNS 이름으로 이전

기존 프로젝트에서 전역 DNS 이름을 계속 사용할 수도 있지만, 영역 DNS 이름을 사용하도록 기존 인스턴스 및 애플리케이션을 이전하면 영역 DNS 시스템의 이점을 활용할 수 있습니다. 일반적으로 다음과 같은 이전 프로세스를 사용할 수 있습니다.

  1. 애플리케이션을 확인하고 업데이트해서 영역 전용 설정과의 호환성 문제를 해결합니다.
    • 인스턴스 이름 또는 전역 정규화된 도메인 이름을 사용하여 인스턴스 주소를 확인하는 애플리케이션: 영역 전용 환경에서 인스턴스 이름과 전역 인스턴스 이름이 항상 확인되지는 않습니다. 권장사항으로서 영역 정규화된 도메인 이름을 사용하도록 이름을 업데이트하세요.
    • 특정한 전역 정규화된 도메인 이름 형식을 사용하는 애플리케이션: 도메인 이름 형식을 사용할 경우 일반적으로 애플리케이션 디자인에서 근본적인 문제가 발생합니다. Google은 애플리케이션이 도메인 이름 형식에 상관없이 작동하도록 설계하는 것을 권장합니다.
    • 도메인 이름 변경을 예상하지 않는 애플리케이션: 일부 애플리케이션은 도메인 이름 변경을 예상하지 않을 수 있으며, 새로운 이름을 선택하려면 완전히 다시 시작해야 할 수 있습니다. 가능하면 인스턴스의 도메인 이름 변경을 식별하고 처리하도록 애플리케이션을 업데이트하세요.
  2. 내부 VPC 네트워크의 인스턴스에서 전역 DNS 이름과 영역 DNS 이름을 모두 사용하는 VmDnsSetting=ZonalPreferred 설정을 사용하도록 구성합니다. 이러한 전환 단계에는 애플리케이션이 영역 이름만 사용할 준비가 될 때까지 인스턴스가 전역 이름을 계속 사용할 수 있습니다.
    1. 커스텀 메타데이터에서 해당 값을 설정하여 한 인스턴스에서 VmDnsSetting=ZonalPreferred를 사용 설정합니다.
    2. 해당 인스턴스에서 DHCP 임대를 새로 고쳐서 영역 DNS 이름을 사용하기 시작하도록 합니다.
      • Linux 인스턴스: sudo dhclient -v -r
      • Windows Server 인스턴스: ipconfig /renew
    3. 해당 인스턴스에서 애플리케이션을 테스트하여 예상대로 작동하는지 확인합니다. 일부 애플리케이션은 도메인 이름 변경을 예상하지 않을 수 있으며, 새로운 이름을 선택하려면 완전히 다시 시작해야 할 수 있습니다.
    4. 이 프로세스를 반복하여 VmDnsSetting=ZonalPreferred를 사용 설정하고 VPC 네트워크에서 나머지 인스턴스가 모두 영역 DNS 이름만 사용하여 예상한 대로 작동할 때까지 나머지 인스턴스에서 DHCP 임대를 새로 고칩니다. 또는 프로젝트 메타데이터에서 VmDnsSetting=ZonalPreferred를 설정하여 프로젝트의 모든 인스턴스가 영역 DNS 이름을 사용하도록 구성할 수 있습니다.
  3. VmDnsSetting=ZonalPreferred 설정으로 애플리케이션이 영역 도메인 이름만 사용하여 올바르게 실행하게 된 후에는 해당 VPC 네트워크에서 전역 이름을 사용하지 않도록 설정할 수 있습니다. 영역 DNS 이름만 사용하는 VmDnsSetting=ZonalOnly 설정을 사용하도록 내부 VPC 네트워크의 인스턴스를 구성합니다.
    1. 커스텀 메타데이터에서 해당 값을 설정하여 한 인스턴스에서 VmDnsSetting=ZonalOnly를 사용 설정합니다.
    2. 해당 인스턴스에서 DHCP 임대를 새로 고쳐서 영역 DNS 이름을 사용하기 시작하도록 합니다.
      • Linux 인스턴스: sudo dhclient -v -r
      • Windows Server 인스턴스: ipconfig /renew
    3. 해당 인스턴스에서 애플리케이션을 테스트하여 예상대로 작동하는지 확인합니다.
    4. 이 프로세스를 반복하여 VmDnsSetting=ZonalOnly를 사용 설정하고 VPC 네트워크에서 나머지 인스턴스가 모두 영역 DNS 이름만 사용하여 예상한 대로 작동할 때까지 나머지 인스턴스에서 DHCP 임대를 새로 고칩니다.
  4. 프로젝트의 모든 인스턴스가 VmDnsSetting=ZonalOnly 설정을 사용할 때까지 각 VPC 네트워크에서 이 프로세스를 반복합니다. 프로젝트 수준 메타데이터에서 VmDnsSetting=ZonalOnly를 설정하여 해당 프로젝트에서 사용자가 만드는 모든 인스턴스에 자동으로 적용되도록 할 수 있습니다. 또는 프로젝트 메타데이터에서 VmDnsSetting=ZonalOnly를 설정하여 프로젝트의 모든 인스턴스가 영역 DNS 이름을 사용하도록 구성할 수 있습니다.

프로젝트 또는 인스턴스에서 영역 DNS 사용 중지

특정 인스턴스에서 영역 DNS를 사용하지 않도록 설정하려면 해당 인스턴스의 메타데이터에서 VmDnsSetting=GlobalOnly를 설정합니다. 프로젝트에서 영역 DNS를 사용하지 않도록 설정하려면 프로젝트 메타데이터에서 VmDnsSetting=GlobalOnly를 설정하고 인스턴스 중 어느 것도 VmDnsSetting 값으로 개별적으로 구성되지 않았는지 확인합니다. 프로젝트 메타데이터 또는 인스턴스 메타데이터 값을 설정하는 방법을 알아보려면 커스텀 메타데이터 설정을 읽어보세요.

DHCP 임대를 즉시 새로 고치도록 강제해야 하는 경우 다음 명령어 중 하나를 사용할 수 있습니다.

  • 컨테이너 최적화된 OS(Google Kubernetes Engine): sudo systemctl restart systemd-networkd
  • Debian/Google App Engine Flex 인스턴스: sudo dhclient -r -v eth0 && sudo rm /var/lib/dhcp/dhclient.* ; sudo dhclient -v eth0
  • Ubuntu 15.04 이상: sudo dhclient -r -v ens4 && sudo rm /var/lib/dhcp/dhclient.* ; sudo dhclient -v ens4
  • Ubuntu 15.04 이전: sudo dhclient -r -v eth0 && sudo rm /var/lib/dhcp/dhclient.* ; sudo dhclient -v eth0
  • Windows: ipconfig /renew

일부 운영체제는 DHCP 임대 갱신 후에도 DNS 구성이 완전히 변경되지 않습니다. 이러한 경우 DNS 구성 변경을 강제하려면 VM 인스턴스의 네트워크를 다시 시작합니다.

  • Ubuntu: sudo ifdown --exclude=lo -a && sudo ifup --exclude=lo -a
  • CentOS: sudo /etc/init.d/network restart
  • CoreOS: sudo systemctl restart systemd-networkd
  • 컨테이너 최적화된 OS: sudo systemctl restart systemd-networkd

컨테이너, Kubernetes Engine, 또는 App Engine Flexible Environment에서 애플리케이션을 실행할 경우 컨테이너를 다시 시작할 때까지 컨테이너 설정의 DNS 구성이 자동으로 업데이트되지 않을 수 있습니다. 이러한 컨테이너 애플리케이션에서 영역 DNS를 사용하지 않도록 설정하려면 프로젝트 및 인스턴스에서 VmDnsSetting=GlobalOnly를 설정한 후 컨테이너를 다시 시작해서 DNS 설정이 원래 상태로 되돌아가도록 해야 합니다.

다음 단계

  • VPC 개요에서 GCP VPC 네트워크에 관한 정보를 확인하세요.
  • VPC 네트워크를 만들고 수정하는 방법에 대한 안내는 VPC 사용을 참조하세요.
이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Compute Engine 문서