[트러블슈팅] OpenStack: VM 간 내부 DNS 설정 (Designate 자동 등록)

2025. 8. 2. 21:15·Infra

1. 목적

  • OpenStack 환경에서 Private 네트워크 내 VM들끼리 IP 주소가 아닌 hostname으로 통신할 수 있도록, 내부 DNS 기능(Designate 연동)을 구성하기
  • 예: ping test-vm

 

2. Designate가 DNS 레코드를 자동 생성하려면?

Designate가 VM의 A 레코드를 자동 등록하기 위해서는 다음 3가지 조건을 모두 만족해야 한다.


① dns_domain 네트워크 또는 서브넷에 설정되어 있어야 함 (예: internal.local.)
② dns_publish_fixed_ip=True Subnet에 설정되어 있어야 함
③ dns_name 포트에 명시된 호스트 이름이어야 함

 

 

3. 구성 및 설정 순서

1) Designate 서비스 설치 및 Zone 생성

  • Designate 서비스가 설치되어 있어야 하며, Keystone에 등록되어 있어야 한다.
openstack endpoint list --service designate
  • DNS Zone 생성:
openstack zone create --email admin@example.com --ttl 3600 --type primary internal.local.

 

2) /etc/resolv.conf에 Designate DNS 서버 등록

Designate DNS 서버를 사용하려면, VM이나 클라이언트가 사용할 네임서버(DNS)를 `/etc/resolv.conf`에 지정해주어야 한다.

  • /etc/resolv.conf
예시

search internal.local # <- 이 설정이 중요함!
# Designate DNS 서버 IP
nameserver 10.0.0.13
# (옵션) 외부 DNS
nameserver 8.8.8.8

search internal.local 을 추가하면 ping vm-test.internal.local 이 아니라
단순히 ping vm-test 로도 내부 호스트 이름을 해석할 수 있다.
즉, FQDN을 생략하고도 VM 간 이름 기반 통신이 가능하다.

 

3) Neutron 확장 기능 설치 여부 확인

Designate 연동을 위해 Neutron에 다음 확장 기능들이 활성화되어 있어야 한다.

openstack extension list --network | grep dns
| DNS Integration                                                                                                                                                | dns-integration                      | Provides integration with DNS.                                                                                                                           |
| dns_domain for ports                                                                                                                                           | dns-domain-ports                     | Allows the DNS domain to be specified for a network port.                                                                                                |
| DNS domain names with keywords allowed                                                                                                                         | dns-integration-domain-keywords      | Allows to use keywords like <project_id>, <project_name>, <user_id> and <user_name> as DNS domain name                                                   |
| Subnet DNS publish fixed IP                                                                                                                                    | subnet-dns-publish-fixed-ip          | Support choosing to publish DNS records for IPs from a subnet

 

 

4) Private 네트워크에 dns_domain 설정

  • Private 네트워크 조회
openstack network list --long

예시에서 private 네트워크 ID가 cc29a0...이면 <network-id>에 해당된다.

  • DNS 도메인을 네트워크에 설정
openstack network set --dns-domain internal.local. <network-id>
  • 설정 확인
openstack network show <network-id> -c dns_domain
+------------+-----------------+
| Field      | Value           |
+------------+-----------------+
| dns_domain | internal.local. |
+------------+-----------------+

 

5) VM 포트에 dns_name 설정

  • 포트에 사용할 호스트 이름을 지정
openstack port set --dns-name test-vm <포트-ID>
  • 설정 확인
openstack port show <포트-ID> -c dns_name 
  • Designate에 A 레코드가 생성되었는지 확인
openstack recordset list internal.local.

 


4. 문제 상황: A 레코드가 등록되지 않음

VM 포트에 dns_name을 지정했음에도 불구하고, recordset list 명령어로 확인 시 레코드셋에 등록되지 않았다.

 

5. 문제 원인

  • 서브넷 설정을 조회한 결과, dns_publish_fixed_ip 값이 False로 되어 있었다.
openstack subnet show <subnet-id>​
+----------------------+--------------------------------------+
| Field                | Value                                |
+----------------------+--------------------------------------+
| ...                  | ...                                  |
| dns_publish_fixed_ip | False                                |

→ 이 상태에서는 Designate가 A 레코드를 생성하지 않는다.

 

6. 해결 방법

1) ML2 설정에서 확장 기능 활성화

`/etc/neutron/plugins/ml2/ml2_conf.ini`에서 extension_drivers 항목에서 아래 부분을 추가한다.

[ml2]
extension_drivers = port_security,dns_domain_ports,dns,subnet_dns_publish_fixed_ip

 

2) `/etc/neutron/neutron.conf`에 Designate 연동 설정

`/etc/neutron/neutron.conf`에서 아래 부분을 추가한다.

[DEFAULT]
# 내부 DNS 기본 도메인
dns_domain = internal.local.
# 외부 DNS 연동 드라이버
external_dns_driver = designate

[designate]
# Designate API Endpoint
url = http://10.0.0.13:9001/v2
auth_type = password
auth_url = http://10.0.0.11:5000
username = designate
password = ********
project_name = service
project_domain_name = Default
user_domain_name = Default

 

3) Neutron 서버 재시작

sudo systemctl restart neutron-server

 

4) Subnet에 dns_publish_fixed_ip 설정 적용

openstack subnet set --dns-publish-fixed-ip <subnet-id>
 
  • 적용 결과 확인
openstack subnet show <subnet-id> -c dns_publish_fixed_ip
+----------------------+--------------------------------------+
| Field                | Value                                |
+----------------------+--------------------------------------+
| ...                  | ...                                  |
| dns_publish_fixed_ip | True                                 |
 
 

7. 결과: A 레코드 등록 확인

위 설정을 모두 적용한 후, 다시 recordset을 확인하면 다음과 같이 A 레코드들이 정상 등록되어 있음을 확인할 수 있다.

openstack recordset list internal.local.
+--------------------------------------+--------------------------------------+------+------------------------------------------------------------------+--------+--------+
| id                                   | name                                 | type | records                                                          | status | action |
+--------------------------------------+--------------------------------------+------+------------------------------------------------------------------+--------+--------+
| eda46aa5-2c38-4400-8fe7-a865f2ac83b8 | test.internal.local.                 | A    | 172.27.1.114                                                     | ACTIVE | NONE   |
+--------------------------------------+--------------------------------------+------+------------------------------------------------------------------+--------+--------+

 

8. 마무리

새로운 VM이 생성될 때 설정해주어야 할 사항은 아래와 같다.

 

1️⃣ 새로운 VM의 dns_name을 hostname으로 자동 지정

  • VM 생성 시 Nova → cloud-init을 통해 hostname 지정
    (Instance Name이 cloud-init을 통해 VM 내부 hostname으로 설정됨)
  • Subnet: dns_publish_fixed_ip=True
  • Network: dns_domain 설정
  • Neutron-Designate 연동: external_dns_driver=designate 설정

위 조건이 충족되면, 새로운 VM 생성 시 dns_name과 FQDN이 자동으로 설정되고, Designate에 A 레코드가 자동 등록된다. (위에서 설정 완료)

 

2️⃣ 새로운 VM의 `/etc/resolv.conf`에 내부 DNS 서버 지정

 

VM 생성 시 user-data에 3-(2)번에서 설정한 `/etc/resolv.conf` 내용을 포함하면 된다.

 

 

 

이렇게 하면 새로 생성된 VM도 내부 DNS를 사용할 수 있고, ping hostname만으로 통신할 수 있다.

'Infra' 카테고리의 다른 글

[트러블슈팅] Keycloak 연동 시 SSL 인증서 오류(PKIX path building failed) 해결  (0) 2025.10.02
'Infra' 카테고리의 다른 글
  • [트러블슈팅] Keycloak 연동 시 SSL 인증서 오류(PKIX path building failed) 해결
oniwon
oniwon
  • oniwon
    눙눙의 개발일지
    oniwon
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Java
      • Spring
      • CS
      • Infra
      • Projects
      • F-Lab
      • Airflow
  • 인기 글

  • 블로그 메뉴

    • 홈
    • 개인정보처리방침 (Privacy Policy)
    • 블로그 소개 (About)
  • 최근 글

  • 태그

    에프랩
    Flab후기
    Flab추천인코드
    dns
    에프랩멘토링
    Flab 추천인코드
    FLAB
    Java
    동시성
    Airflow
    커넥터스2385
    자바 다형성
    https
    병렬 처리
    Flab멘토링
    자바 내부 동작
    자바면접
    Flab 멘토링
    DAG
    Flab커넥터스
    자바백엔드
    Flab 3주차 후기
    tls
    F-Lab
    비동기 처리
    JVM
    네트워크
    SSE
    redis
    inconcert
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.1
oniwon
[트러블슈팅] OpenStack: VM 간 내부 DNS 설정 (Designate 자동 등록)
상단으로

티스토리툴바