Search

Kubernetes - Kube DNS (개념 및 CKA)

Kube DNS

개념

Kubernetes 클러스터의 DNS 서버 역할을 하는 중요한 컴포넌트
이전에 사용되던 kube-dns를 대체하여 쿠버네티스의 기본 DNS 서버가 되었습니다.
이는 더 나은 성능, 유연성, 보안성을 제공하기 때문
클러스터 관리자는 CoreDNS의 설정을 통해 DNS 정책, 캐싱 동작, 로깅 수준 등을 세부적으로 제어할 수 있어, 클러스터의 네트워킹 요구사항을 더욱 정밀하게 조정
CoreDNS의 역할
CoreDNS는 플러그인 기반 아키텍처를 사용하여 다양한 기능을 제공합니다. 이를 통해 사용자 정의 DNS 설정, 로깅, 메트릭 등을 쉽게 구성할 수 있습니다.
서비스 디스커버리: 클러스터 내의 서비스와 파드에 대한 자동 DNS 레코드를 생성하여 서비스 디스커버리를 지원합니다.
파드 DNS 확인: 파드의 IP 주소를 DNS 이름으로 매핑합니다.
외부 DNS 확인: 클러스터 외부의 도메인 이름을 확인합니다.
구성 및 배포
CoreDNS는 보통 kube-system 네임스페이스에 Deployment로 배포됩니다.
ConfigMap을 통해 구성되며, Corefile이라는 설정 파일을 사용합니다.
위의 ConfigMap을 통해 CoreDNS의 설정을 동적으로 관리할 수 있습니다.
DNS 레코드 유형
A 레코드: 서비스와 파드의 IP 주소
SRV 레코드: 서비스의 포트와 프로토콜 정보
PTR 레코드: 역방향 DNS 조회
DNS 쿼리 처리:
CoreDNS는 클러스터 내부 DNS 쿼리를 처리합니다
필요한 경우 외부 DNS 서버로 쿼리를 전달합니다 (DNS 포워딩)
클러스터 외부 DNS 쿼리를 처리하기 위해 외부 DNS 서버로 쿼리를 포워딩할 수 있습니다.
캐싱
DNS 응답을 캐시하여 성능을 향상시킵니다.
플러그인 시스템
CoreDNS는 플러그인 기반 아키텍처를 가지고 있어, 다양한 기능을 추가할 수 있습니다.
주요 플러그인: kubernetes, proxy, cache, forward 등
고가용성
CoreDNS는 일반적으로 여러 레플리카로 배포되어 고가용성을 보장합니다.
모니터링
Prometheus와 같은 모니터링 도구와 통합하여 DNS 서비스의 성능을 모니터링할 수 있습니다.
DNS 정책
Kubernetes의 DNSPolicy를 통해 파드별로 DNS 설정을 구성할 수 있습니다.
사용자 정의 도메인을 설정하여 클러스터 내부 리소스에 대한 사용자 지정 이름을 제공할 수 있습니다.
보안
DNSSEC, DNS over TLS 등의 보안 기능을 지원합니다.
자동 스케일링
쿠버네티스의 HorizontalPodAutoscaler를 사용하여 트래픽에 따라 자동으로 확장할 수 있습니다.

문제

1.
작업 환경:
클러스터: k8s
2.
Pod 및 Service 생성:
nginx 이미지를 사용하여 'resolver' Pod 생성
'resolver-service'라는 이름의 Service 구성
3.
DNS 조회 테스트:
클러스터 내에서 service와 pod 이름 조회 테스트
사용할 이미지: busybox:1.28
조회 도구: nslookup
4.
결과 저장:
Service 조회 결과: /var/CKA2022/nginx.svc 파일에 저장
Pod 이름 조회 결과: /var/CKA2022/nginx.pod 파일에 저장
실행 순서:
1.
nginx Pod 생성
2.
Service 노출
3.
busybox Pod를 사용하여 Service 이름으로 nslookup 실행 및 결과 저장
4.
busybox Pod를 사용하여 Pod IP의 FQDN으로 nslookup 실행 및 결과 저장
5.
저장된 결과 확인
쿠버네티스 클러스터에서 CoreDNS의 기능을 테스트하고, 서비스 디스커버리가 제대로 작동하는지 확인하는 과정

풀이

컨텍스트 설정:
$ kubectl config use-context k8s
Plain Text
복사
k8s 컨텍스트로 전환합니다.
Nginx Pod 생성:
$ kubectl run resolver --image=nginx --port=80
Plain Text
복사
'resolver'라는 이름의 nginx Pod를 생성합니다.
Service 생성:
$ kubectl expose pod resolver --name resolver-service --port=80 --target-port=80
Plain Text
복사
'resolver' Pod를 노출하여 'resolver-service'라는 Service를 생성합니다.
Service 정보 확인:
$ kubectl get pod resolver -o wide >> IP: 10.244.1.55 $ kubectl get svc resolver-service >> CLUSTER IP: 10.104.150.11
Plain Text
복사
생성된 Service의 정보를 확인합니다.
pod와 service에 대한 nslookup # 1
service
Service IP에 대한 nslookup 테스트:
$ kubectl run test-nslookup --image=busybox:1.28 -it --restart=Never --rm -- nslookup 10.104.150.11
Plain Text
복사
Service IP에 대해 nslookup을 수행합니다.
restart 시 파드도 삭제
Service 이름에 대한 nslookup 테스트 및 결과 저장:
kubectl run test-nslookup --image=busybox:1.28 -it --restart=Never --rm -- nslookup nginx-resolver-service > /var/CKA2022/nginx.svc
Plain Text
복사
Service 이름으로 nslookup을 수행하고 결과를 파일에 저장합니다.
pod
Pod 정보 확인
$ kubectl get pod ngnix-resolver -o wide
Plain Text
복사
Pod의 상세 정보를 확인합니다.
Pod IP에 대한 nslookup 테스트 및 결과 저장:
$ kubectl run test-nslookup --image=busybox:1.28 -it --restart=Never --rm -- nslookup 10-244-1-55.default.pod.cluster.local > /var/CKA2022/nginx.pod
Plain Text
복사
Pod의 FQDN(전체 주소 도메인 네임)에 대해 nslookup을 수행하고 결과를 파일에 저장합니다.
저장된 결과 확인:
$ cat /var/CKA2022/nginx.svc $ cat /var/CKA2022/nginx.pod
Plain Text
복사
저장된 nslookup 결과를 확인합니다.
pod와 service에 대한 nslookup # 2
# busybox 접속 $ kubectl run --image=busybox:1.28 --rm -it --restart=Never -- /bin/sh # -- dns 서버 (core dns)의 정보 $ cat /etc/resolv.conf # 각 결과물을 vi 에디터로 집어 넣음 # pod # /tmp/nginx.pod $ nslookup 10-244-1-55.default.pod.cluster.local # service # /tmp/nginx.svc $ nslookup nginx-resolver-service.default.svc.cluster.local
Shell
복사

Reference