쿠버네티스 운영중 빈번하게 클러스터 내부 파드간의 통신이 되지 않아 장애가 나는 경우가 많았는데,
그 중에서, 호스트를 찾지 못하는 문제가 많았다.(UnknownHostException)
그래서 보통 netshoot파드를 이용하여 간단하게 ping이나 curl 명령어로 통신을 테스트하곤 했었는데
이번 포스팅에서는 dig라는 dns 유틸리티를 활용해 테스트해보며 아주 아주 조금 더 평소에 잘 모르고 넘겼던 dns관련 개념들까지 간단히 알아보자.
Prerequisites
dig
dig는 DNS(Domain Name System) 조회를 수행하는 대표적인 유틸리티이다.
간단한 사용 예시이다.
# netshoot pod 접속
kubectl run -it --rm netdebug --image=nicolaka/netshoot --restart=Never -- zsh
# dig [옵션] 호스트이름 [호스트타입]
dig mycluster-instances.mysql-cluster.svc.cluster.local +short
# dns 정보 출력
dig mycluster-instances.mysql-cluster.svc.cluster.local
; <<>> DiG 9.18.13 <<>> mycluster-instances.mysql-cluster.svc.cluster.local
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48193
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 7d71929ab0f063eb (echoed)
;; QUESTION SECTION:
;mycluster-instances.mysql-cluster.svc.cluster.local. IN A
;; ANSWER SECTION:
mycluster-instances.mysql-cluster.svc.cluster.local. 30 IN A 10.233.133.157
mycluster-instances.mysql-cluster.svc.cluster.local. 30 IN A 10.233.71.79
mycluster-instances.mysql-cluster.svc.cluster.local. 30 IN A 10.233.202.213
;; Query time: 0 msec
;; SERVER: 10.233.0.3#53(10.233.0.3) (UDP)
;; WHEN: Mon Oct 23 15:04:42 UTC 2023
;; MSG SIZE rcvd: 293
# +short 옵션을 통해 간략하게
dig mycluster-instances.mysql-cluster.svc.cluster.local +short
10.233.202.213
10.233.71.79
10.233.133.157
로컬 서치 도메인
도메인을 입력하였을 때, 로컬 도메인에 대한 자동완성을 해주는 DNS 설정
( 이 개념을 모르고 최근 coredns가 로컬 서치 도메인(cluster.local)이 누락이 된적이 있어, 로컬 서치 도메인이 생략된 $서비스명.$네임스페이스.svc 주소가 통신이 되지 않아 삽질을 하였다.. )
search <도메인> 과 같이 여러 도메인을 등록할 수 있고 공백으로 구분한다. 그리고 순차적으로 검색된다
아래와 같이 +search 옵션을 통해 로컬 서치 도메인을 활용하여 호스트 이름을 가져오는 걸 볼 수 있다.
# 로컬 서치 도메인 설정 확인
cat /etc/resolv.conf
search mysql-cluster.svc.cluster.local svc.cluster.local cluster.local default.svc.cluster.local openstacklocal
nameserver 10.233.0.3
options ndots:5
# dig +search
dig mycluster-instances.mysql-cluster.svc +search
; <<>> DiG 9.18.13 <<>> mycluster-instances.mysql-cluster.svc.cluster.local +search
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19794
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: f2e86cdcb0424363 (echoed)
;; QUESTION SECTION:
;mycluster-instances.mysql-cluster.svc.cluster.local. IN A
;; ANSWER SECTION:
mycluster-instances.mysql-cluster.svc.cluster.local. 27 IN A 10.233.71.79
mycluster-instances.mysql-cluster.svc.cluster.local. 27 IN A 10.233.133.157
mycluster-instances.mysql-cluster.svc.cluster.local. 27 IN A 10.233.202.213
;; Query time: 0 msec
;; SERVER: 10.233.0.3#53(10.233.0.3) (UDP)
;; WHEN: Mon Oct 23 14:55:45 UTC 2023
;; MSG SIZE rcvd: 293
SRV 레코드
DNS에서 레코드란 용어는 무엇일까?
그렇다.. 자세한 dns에 대한 공부와 다음 포스팅을 기약하고, 일단 이번에는 많은 레코드 중, SRV레코드에 대해서 알아보자
srv 레코드는 dns에서 서비스의 위치와 구성을 나타내는 레코드 유형이다.
즉, 네트워크 서비스를 제공하는 서버의 위치가 어디있는지 알려주기 위해 사용됨.
SRV 옵션을 통해 우리는 아래와 같은 헤드리스 서비스나, 실제 대상 서버의 IP와 도메인 정보를 가져올 때 매우 유용하다.
dig mycluster-instances.mysql-cluster.svc.cluster.local SRV
; <<>> DiG 9.18.13 <<>> mycluster-instances.mysql-cluster.svc.cluster.local SRV
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9283
;; flags: qr aa rd; QUERY: 1, ANSWER: 9, AUTHORITY: 0, ADDITIONAL: 4
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 217d28336030ff07 (echoed)
;; QUESTION SECTION:
;mycluster-instances.mysql-cluster.svc.cluster.local. IN SRV
;; ANSWER SECTION:
mycluster-instances.mysql-cluster.svc.cluster.local. 27 IN SRV 0 11 33061 mycluster-0.mycluster-instances.mysql-cluster.svc.cluster.local.
mycluster-instances.mysql-cluster.svc.cluster.local. 27 IN SRV 0 11 3306 mycluster-0.mycluster-instances.mysql-cluster.svc.cluster.local.
mycluster-instances.mysql-cluster.svc.cluster.local. 27 IN SRV 0 11 33060 mycluster-0.mycluster-instances.mysql-cluster.svc.cluster.local.
mycluster-instances.mysql-cluster.svc.cluster.local. 27 IN SRV 0 11 33061 mycluster-2.mycluster-instances.mysql-cluster.svc.cluster.local.
mycluster-instances.mysql-cluster.svc.cluster.local. 27 IN SRV 0 11 3306 mycluster-2.mycluster-instances.mysql-cluster.svc.cluster.local.
mycluster-instances.mysql-cluster.svc.cluster.local. 27 IN SRV 0 11 33060 mycluster-2.mycluster-instances.mysql-cluster.svc.cluster.local.
mycluster-instances.mysql-cluster.svc.cluster.local. 27 IN SRV 0 11 33061 mycluster-1.mycluster-instances.mysql-cluster.svc.cluster.local.
mycluster-instances.mysql-cluster.svc.cluster.local. 27 IN SRV 0 11 3306 mycluster-1.mycluster-instances.mysql-cluster.svc.cluster.local.
mycluster-instances.mysql-cluster.svc.cluster.local. 27 IN SRV 0 11 33060 mycluster-1.mycluster-instances.mysql-cluster.svc.cluster.local.
;; ADDITIONAL SECTION:
mycluster-2.mycluster-instances.mysql-cluster.svc.cluster.local. 27 IN A 10.233.202.213
mycluster-0.mycluster-instances.mysql-cluster.svc.cluster.local. 27 IN A 10.233.71.79
mycluster-1.mycluster-instances.mysql-cluster.svc.cluster.local. 27 IN A 10.233.133.157
;; Query time: 0 msec
;; SERVER: 10.233.0.3#53(10.233.0.3) (UDP)
;; WHEN: Mon Oct 23 15:12:47 UTC 2023
;; MSG SIZE rcvd: 887
'Kubernetes > Security' 카테고리의 다른 글
쿠버네티스 API Server 인증서 IP 추가 - Unable to connect to the server: x509: certificate (0) | 2023.10.21 |
---|