Search
Duplicate
📒

[Kubernetes Infra] 03-3. DNS(CoreDNS)

상태
수정중
수업
Kubernetes Infra
주제
연관 노트
3 more properties
참고

쿠버네티스의 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.
CoreDNSnginx-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