Istio Hands-on Study [1기]

[8주차] 가상 머신 워크로드를 Mesh 에 통합 : DNS Proxy 이해

구구달스 2025. 5. 26. 16:00

🌐 Istio DNS Proxy의 비밀 풀기


🔍 DNS Proxy의 역할과 동작 원리

  • DNS proxy는 istio-agent의 일부로, 클러스터 내 서비스 호스트 이름을 IP 주소로 해석합니다. 이를 통해 VM과 같은 외부 워크로드가 service mesh 내 서비스와 통신할 수 있습니다. DNS proxy의 동작을 이해하려면, webapp.istioinaction 호스트 이름이 해석되는 과정을 따라가 보겠습니다.

호스트 이름 해석 단계

  • 클라이언트 DNS 쿼리: 애플리케이션이 webapp.istioinaction 호스트 이름을 해석하기 위해 DNS 쿼리를 보냅니다.
  • 운영 체제 처리: 운영 체제는 /etc/hosts 파일에서 호스트 이름을 확인합니다. 일치하는 항목이 없으면 기본 DNS 리졸버로 쿼리를 전달합니다.
  • 기본 리졸버와 iptables: Ubuntu의 기본 리졸버는 systemd-resolved로, 127.0.0.53:53에서 수신합니다. 하지만 istio-agent가 설정한 iptables 규칙은 이 쿼리를 DNS proxy(127.0.0.1:15053)로 리다이렉트합니다.
  • DNS proxy 처리: DNS proxy는 control plane에서 받은 서비스 정보를 기반으로 호스트 이름을 해석합니다. webapp.istioinaction이 메시 내 서비스라면 IP 주소를 반환합니다.
  • 외부 서비스 처리: 메시 내 서비스가 아닌 경우, DNS proxy는 /etc/resolv.conf에 지정된 네임서버로 쿼리를 전달해 해석하거나 실패를 반환합니다.
DNS proxy는 iptables로 리다이렉트된 DNS 쿼리를 처리해 
클러스터 내 서비스 호스트 이름을 IP 주소로 해석합니다.

✅ DNS Proxy 동작 검증

1️⃣ iptables 규칙 확인

  • istio-agent가 DNS 쿼리를 127.0.0.53:53에서 127.0.0.1:15053으로 리다이렉트하도록 iptables 규칙을 설정했는지 확인합니다:
root@forum-vm:~# iptables-save | grep 'to-ports 15053'
-A OUTPUT -d 127.0.0.53/32 -p udp -m udp --dport 53 -j REDIRECT --to-ports 15053
-A ISTIO_OUTPUT -d 127.0.0.53/32 -p tcp -m tcp --dport 53 -j REDIRECT --to-ports 15053
  • 출력은 UDP와 TCP 트래픽이 포트 15053(DNS proxy)으로 리다이렉트됨을 보여줍니다.
iptables 규칙이 DNS 쿼리를 DNS proxy 포트(15053)으로 리다이렉트함을 확인했습니다.

2️⃣ DNS Proxy 포트 확인

  • istio-agent(pilot-agent)가 포트 15053에서 DNS 쿼리를 수신하는지 확인합니다:
root@forum-vm:~# netstat -ltunp | egrep 'PID|15053'
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:15053         0.0.0.0:*               LISTEN      5049/pilot-agent
udp        0      0 127.0.0.1:15053         0.0.0.0:*                           5049/pilot-agent
  • pilot-agent가 TCP와 UDP 프로토콜로 127.0.0.1:15053에서 수신 대기 중임을 확인했습니다.
istio-agent가 포트 15053에서 DNS 쿼리를 수신하도록 설정되었습니다.

3️⃣ DNS 쿼리 테스트

  • dig 유틸리티를 사용해 DNS proxy가 webapp.istioinaction 호스트 이름을 올바르게 해석하는지 테스트합니다:
root@forum-vm:~# dig +short @localhost -p 15053 webapp.istioinaction
10.10.200.79
root@forum-vm:~# dig +short @localhost -p 15053 catalog.istioinaction
10.10.200.140
root@forum-vm:~# dig +short @localhost -p 15053 forum.forum-services
10.10.200.244
  • DNS proxy가 호스트 이름을 IP 주소로 성공적으로 해석했습니다.
    애플리케이션에서는 이 과정을 수동으로 지정할 필요 없이 iptables 규칙에 의해 자동으로 리다이렉트됩니다.
dig 명령어로 DNS proxy가 클러스터 내 호스트 이름을 IP 주소로 해석함을 확인했습니다. 

📌 핵심 요약

  • DNS Proxy 역할: 클러스터 내 서비스 호스트 이름을 IP 주소로 해석해 VM이 메시 내 서비스와 통신하도록 돕습니다.
  • 해석 과정: DNS 쿼리가 iptables로 DNS proxy(15053)로 리다이렉트되어 메시 내 서비스를 해석하거나 외부 네임서버로 전달됩니다.
  • DNS proxy는 메시 통합에 필수적인 컴포넌트로, 투명한 호스트 이름 해석을 제공합니다.

🌐 DNS Proxy가 인식하는 호스트 이름 알아보기


🔍 DNS Proxy의 호스트 이름 정보 확인

  • DNS proxy가 인식하는 호스트 이름을 알아보려면 istiod의 디버그 엔드포인트를 사용해야 합니다.
    이를 통해 특정 워크로드의 NDS 설정을 조회할 수 있습니다. 여기서는 forum-vm 워크로드의 설정을 확인합니다.

1️⃣ 워크로드 이름 확인

  • 먼저, 클러스터에서 실행 중인 워크로드 목록을 확인해 forum-vm의 이름을 찾습니다:
(⎈|default:N/A) root@k3s-s:~# istioctl proxy-status | awk '{print $1}'
NAME
catalog-77fdb4997c-clkq8.istioinaction
forum-vm.forum-services
istio-eastwestgateway-86f6cb4699-5cj9r.istio-system
istio-ingressgateway-7b7ccd6454-w696t.istio-system
webapp-684c568c59-fqp2k.istioinaction
proxy-status 명령어로 forum-vm 워크로드 이름을 확인했습니다.

2️⃣ NDS 설정 조회

  • forum-vm의 NDS 설정을 조회하기 위해 istiod의 디버그 엔드포인트를 호출합니다.
(⎈|default:N/A) root@k3s-s:~# kubectl -n istio-system exec deploy/istiod -- curl -Ls "localhost:8080/debug/ndsz?proxyID=forum-vm.forum-services" | jq
{
  "resource": {
    "@type": "type.googleapis.com/istio.networking.nds.v1.NameTable",
    "table": {
      "catalog.istioinaction.svc.cluster.local": {
        "ips": [
          "10.10.200.140"
        ],
        "registry": "Kubernetes",
        "shortname": "catalog",
        "namespace": "istioinaction"
      },
      "forum.forum-services.svc.cluster.local": {
        "ips": [
          "10.10.200.244"
        ],
        "registry": "Kubernetes",
        "shortname": "forum",
        "namespace": "forum-services"
      },
      ...
            "webapp.istioinaction.svc.cluster.local": {
        "ips": [
          "10.10.200.79"
        ],
        "registry": "Kubernetes",
        "shortname": "webapp",
        "namespace": "istioinaction"
      },
      ...
  • 이 출력은 webapp.istioinaction.svc.cluster.local 호스트 이름이 IP 주소 10.10,200,79로 해석됨을 보여줍니다. 
istiod의 디버그 엔드포인트를 사용해 forum-vm의 NDS 설정을 조회했습니다.

🔧 호스트 이름 변형 생성

  • istio-agent는 NDS 설정을 받아 Kubernetes 클러스터에서 사용되는 모든 호스트 이름 변형을 자동으로 생성합니다.
    예를 들어, webapp.istioinaction.svc.cluster.local에 대해 다음 변형이 생성됩니다:
    • webapp.istioinaction
    • webapp.istioinaction.svc
    • webapp.istioinaction.svc.cluster
  • 이러한 변형은 모두 동일한 IP 주소로 해석됩니다. 이는 Kubernetes 환경에서의 호스트 이름 해석 경험을 VM에서도 동일하게 제공하기 위함입니다.
istio-agent는 NDS 설정을 기반으로 다양한 호스트 이름 변형을 생성해 해석합니다.

🌍 비클러스터 호스트 이름 처리

  • DNS proxy는 메시 내 서비스 호스트 이름만 처리하는 것이 아닙니다. 메시 외부의 호스트 이름(예: 공용 도메인)에 대한 쿼리는 VM의 초기 설정에 지정된 네임서버(/etc/resolv.conf)로 전달됩니다. 이를 통해 DNS proxy는 클러스터 내외의 모든 DNS 쿼리를 처리할 수 있습니다.
메시 외부 호스트 이름은 resolv.conf의 네임서버로 전달되어 해석됩니다.

📌 핵심 요약

  • 워크로드 확인: proxy-status로 forum-vm 워크로드 이름을 확인했습니다.
  • NDS 조회: istiod의 디버그 엔드포인트를 통해 webapp.istioinaction.svc.cluster.local이 IP 10.0.183.159로 해석됨을 확인했습니다.
  • 호스트 이름 변형: istio-agent는 Kubernetes 스타일의 짧은 호스트 이름 변형을 생성해 동일한 IP로 해석합니다.
  • 외부 쿼리: 메시 외부 호스트 이름은 VM의 네임서버로 전달됩니다.
  • DNS proxy istiod의 설정을 기반으로 메시 내 서비스를 해석하고, 외부 쿼리를 적절히 처리합니다.