참고
쿠버네티스의 DNS
NOTE
쿠버네티스의 DNS 시스템은 클러스터 내에서의 서비스 디스커버리를 용이하게 해주며, CoreDNS를 사용하여 내부 DNS 역할을 합니다.
내장 DNS (CoreDNS)
쿠버네티스 클러스터 내에서 특정 도메인을 찾으려 할 때, kube-system 네임스페이스에 위치한 CoreDNS가 네임서버로 작동합니다.
서비스 디스커버리
NOTE
서비스 디스커버리는 서비스들이 서로 찾아서 통신할 수 있게 해주는 과정입니다. 쿠버네티스는 이러한 서비스 디스커버리를 위해 CoreDNS와 로컬 DNS 캐시를 사용해서, 파드들이 서비스 이름을 이용하여 서로를 찾을 수 있게 해줍니다.
coredns는 kube-system에 배포되어 있다.
서비스 디스커버리의 핵심은 클러스터 내의 모든 서비스와 파드를 쉽게 찾을 수 있도록 DNS 레코드를 자동으로 등록하고 업데이트하는 것입니다.
쿠버네티스에서 서비스 객체를 생성하면, coreDNS는 해당 서비스 이름에 대한 DNS 레코드를 생성합니다. 이 DNS 레코드는 도메인 이름(my-service.my-namespace.svc.cluster.local)을 해당 서비스의 IP 주소로 매핑합니다.
이를 통해 클러스터 내의 어떤 파드라도 서비스 이름을 DNS 쿼리로 사용하여 해당 서비스의 현재 IP 주소를 찾을 수 있습니다. 쿠버네티스 클러스터 내의 파드가 생성될 때, 각 파드의 /etc/resolv.conf 파일이 CoreDNS를 가리키도록 구성됩니다. 따라서, DNS 쿼리를 수행하면 CoreDNS가 내부적으로 이 서비스 이름에 대응하는 ClusterIP를 찾아 반환해줍니다.
실습
클러스터 IP 통신 프로세스
1.
nginx-svc라는 이름의 서비스가 클러스터에 배포되어 있고, 여러 파드로 구성된다.
# 디플로이먼트
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2 # 2개의 nginx 파드를 생성
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
# 서비스
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80 # 서비스 포트
targetPort: 80 # 파드의 포트
type: ClusterIP
YAML
복사
nginx pod - svc
2.
다른 파드에서 nginx-svc 서비스에 접근하려고 할 때, 파드는 DNS를 조회하여 nginx-svc의 현재 IP 주소를 찾는다.
# 다른 파드 생성
kubectl run busybox --image=busybox --restart=Never --rm -it -- /bin/sh
# nginx-svc DNS조회시도
nslookup nginx-svc
Bash
복사
nginx-svc의 CLUSTER-IP(10.111.131.20)
nginx-svc.default.svc.cluster.locl 조회성공(10.111.131.20)
3.
CoreDNS는 nginx-svc에 대한 요청을 받고, 해당 서비스에 연결된 파드 중 하나의 IP주소를 반환합니다.
동일한 Namespace에서 DNS 사용
NOTE
동일 네임스페이스 내의 파드가 서비스에 접근하려고 할 때는, 서비스 이름만으로 접근할 수 있습니다. 이 경우 쿠버네티스 DNS 시스템은 해당 서비스의 이름을 클러스터 IP로 변환해줍니다.
test pod → web-service 접근
•
쿠버네티스는 서비스와 파드에 대해 DNS 레코드를 생성합니다. 이 덕분에 서비스에 접근할 때 IP 주소 대신 DNS 이름으로 접근할 수 있습니다.
•
ex) curl http://web-service
서로 다른 Namespace에서 DNS 사용
NOTE
서로 다른 네임스페이스에서는 서비스 이름에 네임스페이스를 명시해야 합니다.
test pod(default) → web-service(apps) 접근
•
FQDN을 사용하면 클러스터 어떤 위치에 있어도 접근이 가능합니다.
◦
ex) 서비스의 FQDN [서비스 이름].[네임스페이스 이름].svc.cluster.local
◦
ex) 포드의 FQDN [파드-IP-주소].[네임스페이스 이름].pod.cluster.local