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 | 포트에 명시된 호스트 이름이어야 함 |
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 |
|---|