카테고리 없음

istio-8주차-VM Support 2

시스템엔지니어 2025. 5. 27. 20:51

13.4 DNS 프록시 이해하기 Demystifying the DNS proxy

가상머신에서 클러스터 서비스 호스트네임을 해석하려면 DNS 프록시의 동작 방식을 반드시 이해해야 한다.

  1. 클라이언트 DNS 쿼리 생성
    • 애플리케이션(예: webapp.istioinaction)이 호스트네임 해석을 요청한다.
  2. 운영체제 hosts 파일 확인
    • /etc/hosts에 정적 매핑이 없는 경우, 기본 DNS 해석기(예: systemd-resolved)로 전달된다.
  3. Iptables 리다이렉트
    • istio-agent가 설정한 iptables 규칙이 DNS 쿼리를 127.0.0.53:53 대신 **DNS 프록시(15053 포트)**로 강제 전송한다.
  4. DNS 프록시 내부 검색
    • NDS API로 동기화된 메시 내 서비스(쿠버네티스 서비스, ServiceEntry) 정보를 기반으로 호스트네임을 해석한다.
    • 클러스터 서비스인 경우, 해당 VIP 또는 엔드포인트 IP를 반환한다.
  5. 외부 DNS 폴백
    • 메시 내 서비스가 아닌 경우, resolv.conf의 네임서버(예: 8.8.8.8)로 쿼리를 전달한다.

운영상 주의사항

  • resolv.conf 설정:
    DNS 프록시 주소(127.0.0.1:15053)를 첫 번째 네임서버로 반드시 지정해야 한다.
  • 성능 이점:
    클러스터 서비스 해석 시 CoreDNS 부하 감소레이턴시 개선 효과를 제공한다.
  • 보안 강화:
    외부 DNS 서버 노출을 최소화해 DNS 스푸핑 공격 위험을 줄인다.

iptables 규칙이 DNS 쿼리를 systemd-resolverd(127.0.0.53) 대신 로컬 DNS 프록시(127.0.0.1:15053)로 반드시 리다이렉트하도록 설정한다.

# [forum-vm]
# Iptables 규칙 확인 : proxyConfig.proxyMetadata ISTIO_META_DNS_CAPTURE="true" 설정 시 아래 규칙 추가됨
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

 

# tcp, udp 를 127.0.0.1 에 port 15053 에서 이스티오 에이전트(pilot-agent)가 DNS 프록시 처리 확인
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      3195/pilot-agent
udp        0      0 127.0.0.1:15053         0.0.0.0:*                           3195/pilot-agent

# 해당 주소로 DNS 쿼리해보자
dig +short @localhost -p 15053 webapp.istioinaction
10.10.200.48

dig +short @localhost -p 15053 catalog.istioinaction
dig +short @localhost -p 15053 forum.forum-services


# (옵션)
dig +short @localhost -p 15053 www.daum.net
daum-4vdtymgd.kgslb.com.
121.53.105.193


# (옵션) coredns 쿼리 로그 확인
KUBE_EDITOR="nano" kubectl edit cm -n kube-system coredns
apiVersion: v1
data:
  Corefile: |
    .:53 {
        log
        errors
        health
...

# 설정 반영되는데 다소 시간 소요
kubectl logs -n kube-system -l k8s-app=kube-dns -f

DNS 쿼리는 iptables 규칙에 의해 15053 포트의 Istio DNS 프록시로 반드시 리다이렉트된다. DNS 프록시는 istiod로부터 동기화된 메시 내 서비스 정보를 활용해 **FQDN(예: webapp.istioinaction)**을 즉시 해석한다. 외부 호스트네임은 resolv.conf에 정의된 업스트림 DNS로 자동 전달된다.

 

 

13.4.2 DNS 프록시가 인식하는 호스트네임은 무엇인가? Which hostnames is the DNS proxy aware of?

DNS 프록시는 istiod의 NDS API를 통해 클러스터 서비스의 FQDN 변형을 자동 생성하여 해석을 제공한다.

#
istioctl proxy-status | awk '{print $1}'
catalog-77fdb4997c-f8qj4.istioinaction
istio-eastwestgateway-86f6cb4699-4xfsn.istio-system
istio-ingressgateway-7b7ccd6454-pv8zp.istio-system
forum-vm.forum-services
webapp-684c568c59-vrj97.istioinaction

# NDS 설정을 가져올 때 proxyID 파라미터에 이름을 사용한다.
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.138"
        ],
        "registry": "Kubernetes",
        "shortname": "catalog",
        "namespace": "istioinaction"
      },
      "forum.forum-services.svc.cluster.local": {
        "ips": [
          "10.10.200.72"
        ],
        "registry": "Kubernetes",
        "shortname": "forum",
        "namespace": "forum-services"
      },
      "webapp.istioinaction.svc.cluster.local": {
        "ips": [
          "10.10.200.48"
        ],
        "registry": "Kubernetes",
        "shortname": "webapp",
        "namespace": "istioinaction"
      },
...

 

  • webapp.istioinaction.svc.cluster.local과 같은 풀 네임 외에 webapp.istioinaction, webapp.istioinaction.svc 등 짧은 형식도 반드시 해석 가능하도록 변형을 생성한다.
  • 이는 쿠버네티스의 DNS 네임 컨벤션을 기반으로 자동화된다.
    • 동작 원리
      • istio-agent가 NDS 설정을 수신할 때 모든 가능한 FQDN 변형을 매핑 테이블에 추가한다.
      • 애플리케이션이 짧은 호스트명(예: webapp.istioinaction)을 사용해도 DNS 프록시가 정확한 클러스터 IP로 해석한다.

이를 통해 Istio는 다양한 네이밍 형식을 지원하며, 애플리케이션 수정 없이 메시 내 서비스 검색을 단순화한다.

 

핵심은 다음과 같다.

  • DNS 프록시는 istiod가 알고 있는 서비스들로 설정된다.
  • istio-agent는 호스트네임의 더 짧은 변형들을 생성한다 (쿠버네티스 내의 경험과 일치시키기 위함이다)
  • 이런 DNS 프록시 내의 레코드는 클러스터 내 서비스 호스트네임을 해석하는 데 사용된다.
  • 클러스터가 아닌 호스트네임(퍼블릭 도메인 같은)쿼리는 머신에서 처음 설정한 네임서버로 넘어간다.

 

 

13.5 에이전트 동작 커스터마이징하기 Customizing the agent’s behavior

DNS 프록시의 디버그 로깅 및 인증서 수명 조정을 위해 /var/lib/istio/envoy/sidecar.env 파일을 수정해야 하며, 변경 후 /var/log/istio/istio.log 확인과 /etc/certs/cert-chain.pem 갱신 여부를 검증해야 한다.

#
cat /var/lib/istio/envoy/sidecar.env
grep "^[^#]" /var/lib/istio/envoy/sidecar.env # 주석 처리

#
echo 'ISTIO_AGENT_FLAGS="--log_output_level=dns:debug"' >> /var/lib/istio/envoy/sidecar.env
echo 'SECRET_TTL="12h0m0s"' >> /var/lib/istio/envoy/sidecar.env
grep "^[^#]" /var/lib/istio/envoy/sidecar.env # 주석 처리
ISTIO_AGENT_FLAGS="--log_output_level=dns:debug"
SECRET_TTL="12h0m0s"

# 변경 사항 적용
systemctl restart istio


# www.daum.net 도메인은 질의 처리를 하지 못해서, 로컬에 resolver DNS 서버를 통해 질의 로그 확인.
tail -f /var/log/istio/istio.log
2025-05-25T07:23:03.660035Z	debug	dns	response for hostname "www.daum.net." not found in dns proxy, querying upstream
2025-05-25T07:23:03.662845Z	debug	dns	upstream response for hostname "www.daum.net." : ;; opcode: QUERY, status: NOERROR, id: 30399
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version 0; flags: ; udp: 65494

;; QUESTION SECTION:
;www.daum.net.	IN	 A

;; ANSWER SECTION:
www.daum.net.	77	IN	CNAME	daum-4vdtymgd.kgslb.com.
daum-4vdtymgd.kgslb.com.	5	IN	A	121.53.105.193

#
dig +short @localhost -p 15053 www.daum.net

 

13.6 메시에서 WorkloadEntry 제거하기 Removing a WorkloadEntry from the mesh

aws에서 forum VM을 강제로 삭제(terminated)한다.