Zum Hauptinhalt springen

CoreDNS

CoreDNS는 Kubernetes 클러스터의 DNS 서버로, Pod와 Service의 이름 해석(name resolution)을 담당합니다. Lumie 클러스터에서는 DaemonSet으로 배포되어 모든 노드에서 DNS 서비스를 제공합니다.

아키텍처

배포 구성

DaemonSet 설정

CoreDNS는 모든 노드에 배포되어 DNS 쿼리의 지연 시간을 최소화합니다:

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: coredns
namespace: kube-system
labels:
k8s-app: kube-dns
kubernetes.io/name: CoreDNS
spec:
selector:
matchLabels:
k8s-app: kube-dns
template:
metadata:
labels:
k8s-app: kube-dns
spec:
priorityClassName: system-cluster-critical
serviceAccountName: coredns
containers:
- name: coredns
image: rancher/mirrored-coredns-coredns:1.13.1
args: ["-conf", "/etc/coredns/Corefile"]

주요 설정

항목설명
배포 방식DaemonSet모든 노드에 배포
이미지rancher/mirrored-coredns-coredns:1.13.1Rancher 미러 레지스트리 사용
DNS UDP 포트53/UDPDNS 쿼리 수신
DNS TCP 포트53/TCP대용량 DNS 응답
메트릭 포트9153/TCPPrometheus 메트릭
우선순위 클래스system-cluster-critical시스템 중요 Pod

리소스 할당

resources:
requests:
cpu: 50m
memory: 64Mi
limits:
memory: 170Mi

보안 설정

securityContext:
allowPrivilegeEscalation: false
capabilities:
add:
- NET_BIND_SERVICE # 포트 53 바인딩
drop:
- ALL
readOnlyRootFilesystem: true

톨러레이션

CoreDNS는 모든 노드에서 실행되어야 하므로 다음 톨러레이션을 설정합니다:

tolerations:
- key: CriticalAddonsOnly
operator: Exists
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule

DNS 해석 흐름

클러스터 내부 DNS

외부 DNS

DNS 명명 규칙

서비스 DNS

Kubernetes 서비스는 다음 형식으로 접근할 수 있습니다:

<service-name>.<namespace>.svc.cluster.local

예시

서비스네임스페이스FQDN
lumie-backendlumie-backendlumie-backend.lumie-backend.svc.cluster.local
gitea-httpgiteagitea-http.gitea.svc.cluster.local
miniominiominio.minio.svc.cluster.local
infra-db-rwinfra-dbinfra-db-rw.infra-db.svc.cluster.local

단축 형식

같은 네임스페이스 내에서는 서비스 이름만으로 접근 가능합니다:

# lumie-backend 네임스페이스 내 Pod에서
curl http://lumie-backend:8080/health

# 다른 네임스페이스의 Gitea 서비스 접근
curl http://gitea-http.gitea:3000

Pod DNS

개별 Pod도 DNS 이름을 가집니다:

<pod-ip-with-dashes>.<namespace>.pod.cluster.local

예시: 10-42-1-5.lumie.pod.cluster.local

Corefile 구성

CoreDNS의 설정은 Corefile을 통해 관리됩니다:

.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . 8.8.8.8 1.1.1.1 {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}

플러그인 설명

플러그인기능
errors에러 로깅
health헬스체크 엔드포인트 (:8080/health)
ready준비 상태 엔드포인트 (:8181/ready)
kubernetesKubernetes DNS 해석
prometheus메트릭 수집 (:9153/metrics)
forward외부 DNS 포워딩
cacheDNS 응답 캐싱 (30초)
loop무한 루프 감지
reload설정 자동 리로드
loadbalance다중 A 레코드 로드밸런싱

헬스체크

CoreDNS는 두 가지 헬스체크 엔드포인트를 제공합니다:

Liveness Probe

livenessProbe:
httpGet:
path: /health
port: 8080
scheme: HTTP
initialDelaySeconds: 60
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5

Readiness Probe

readinessProbe:
httpGet:
path: /ready
port: 8181
scheme: HTTP

모니터링

Prometheus 메트릭

CoreDNS는 포트 9153에서 Prometheus 메트릭을 제공합니다:

# 메트릭 확인
kubectl exec -n kube-system daemonset/coredns -- \
curl -s http://localhost:9153/metrics

주요 메트릭

메트릭설명
coredns_dns_requests_totalDNS 요청 총 수
coredns_dns_request_duration_secondsDNS 요청 처리 시간
coredns_dns_responses_totalDNS 응답 총 수
coredns_forward_requests_total포워딩된 요청 수
coredns_cache_hits_total캐시 히트 수
coredns_cache_misses_total캐시 미스 수

관리 및 운영

DNS 쿼리 테스트

# 클러스터 내부에서 DNS 테스트
kubectl run -it --rm debug --image=busybox --restart=Never -- sh

# 서비스 DNS 해석 테스트
nslookup lumie-backend.lumie.svc.cluster.local

# 외부 DNS 해석 테스트
nslookup google.com

# DNS 서버 확인
cat /etc/resolv.conf

로그 확인

# CoreDNS 로그 확인
kubectl logs -n kube-system daemonset/coredns -f

# 특정 노드의 CoreDNS 로그
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=100

설정 확인

# Corefile 설정 확인
kubectl get configmap coredns -n kube-system -o yaml

# CoreDNS 상태 확인
kubectl get daemonset coredns -n kube-system
kubectl get pods -n kube-system -l k8s-app=kube-dns

문제 해결

일반적인 문제

  1. DNS 해석 실패

    • CoreDNS Pod 상태 확인
    • Corefile 설정 검증
    • 업스트림 DNS 서버 연결 확인
  2. 느린 DNS 응답

    • 캐시 설정 확인
    • 업스트림 DNS 서버 응답 시간 확인
    • 리소스 제한 확인
  3. 외부 DNS 해석 실패

    • 업스트림 DNS 서버 설정 확인
    • 네트워크 정책 확인
    • 방화벽 규칙 확인

디버깅 명령어

# DNS 해석 디버깅
kubectl exec -n kube-system daemonset/coredns -- \
dig @localhost lumie-backend.lumie.svc.cluster.local

# CoreDNS 메트릭 확인
kubectl exec -n kube-system daemonset/coredns -- \
curl -s http://localhost:9153/metrics | grep coredns_dns

# 헬스체크 확인
kubectl exec -n kube-system daemonset/coredns -- \
curl -s http://localhost:8080/health

kubectl exec -n kube-system daemonset/coredns -- \
curl -s http://localhost:8181/ready

설정 변경

Corefile을 수정하여 CoreDNS 동작을 변경할 수 있습니다:

# Corefile 편집
kubectl edit configmap coredns -n kube-system

# CoreDNS 재시작 (설정 적용)
kubectl rollout restart daemonset/coredns -n kube-system

성능 최적화

캐시 최적화

cache 300 {
success 9984 30
denial 9984 5
}

포워딩 최적화

forward . 8.8.8.8 1.1.1.1 {
max_concurrent 1000
expire 10s
health_check 5s
}

리소스 튜닝

DNS 쿼리가 많은 환경에서는 리소스를 증가시킬 수 있습니다:

resources:
requests:
cpu: 100m
memory: 128Mi
limits:
memory: 256Mi

보안 고려사항

  1. 최소 권한: CoreDNS ServiceAccount에 필요한 최소 권한만 부여
  2. 네트워크 정책: DNS 트래픽에 대한 네트워크 정책 설정
  3. 로그 모니터링: 비정상적인 DNS 쿼리 패턴 모니터링
  4. 업스트림 DNS: 신뢰할 수 있는 업스트림 DNS 서버 사용
  5. 캐시 보안: DNS 캐시 포이즈닝 공격 방지