[CKA] Kubernetes DNS
Kubernetes Service와 Pod의 DNS 이름 구조, 네임스페이스에 따른 조회 방식을 정리합니다.
클러스터 DNS는 Service 이름을 안정적인 접근점으로 만듭니다. 일반 Service의 기본 이름은 다음 구조이며 ClusterIP로 해석됩니다.
<service>.<namespace>.svc.<cluster-domain>
클러스터 도메인이 cluster.local이고 payroll 네임스페이스에 mysql Service가 있다면 FQDN은 mysql.payroll.svc.cluster.local입니다. 같은 네임스페이스에서는 mysql로 조회할 수 있고, 다른 네임스페이스에서는 mysql.payroll처럼 네임스페이스를 포함합니다.
Service와 Pod 레코드
일반 Service는 ClusterIP를 가리키는 A 또는 AAAA 레코드를 얻습니다. Headless Service는 셀렉터에 맞는 Pod IP 집합으로 해석됩니다. Pod 관련 DNS 이름은 Pod의 hostname, subdomain, 연결된 Service와 DNS 구현 설정에 따라 달라지므로 모든 Pod에 항상 독립 레코드가 생긴다고 가정하면 안 됩니다.
실습 풀이
다른 네임스페이스의 웹 애플리케이션이 mysql Service를 찾지 못한다면 먼저 리소스가 속한 네임스페이스를 확인합니다.
kubectl get pods,svc --all-namespaces
kubectl exec <pod> -- nslookup mysql.payroll
애플리케이션의 DB 호스트를 mysql.payroll로 설정하면 검색 도메인이 이를 mysql.payroll.svc.cluster.local로 확장할 수 있습니다. 같은 원리로 보기 중 사용할 수 없는 DNS 이름을 찾을 때는 service.namespace.svc.cluster-domain의 각 부분이 맞는지 확인합니다.