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.1 | Rancher 미러 레지스트리 사용 |
| DNS UDP 포트 | 53/UDP | DNS 쿼리 수신 |
| DNS TCP 포트 | 53/TCP | 대용량 DNS 응답 |
| 메트릭 포트 | 9153/TCP | Prometheus 메트릭 |
| 우선순위 클래스 | 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-backend | lumie-backend | lumie-backend.lumie-backend.svc.cluster.local |
| gitea-http | gitea | gitea-http.gitea.svc.cluster.local |
| minio | minio | minio.minio.svc.cluster.local |
| infra-db-rw | infra-db | infra-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) |
| kubernetes | Kubernetes DNS 해석 |
| prometheus | 메트릭 수집 (:9153/metrics) |
| forward | 외부 DNS 포워딩 |
| cache | DNS 응답 캐싱 (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_total | DNS 요청 총 수 |
coredns_dns_request_duration_seconds | DNS 요청 처리 시간 |
coredns_dns_responses_total | DNS 응답 총 수 |
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
문제 해결
일반적인 문제
-
DNS 해석 실패
- CoreDNS Pod 상태 확인
- Corefile 설정 검증
- 업스트림 DNS 서버 연결 확인
-
느린 DNS 응답
- 캐시 설정 확인
- 업스트림 DNS 서버 응답 시간 확인
- 리소스 제한 확인
-
외부 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
보안 고려사항
- 최소 권한: CoreDNS ServiceAccount에 필요한 최소 권한만 부여
- 네트워크 정책: DNS 트래픽에 대한 네트워크 정책 설정
- 로그 모니터링: 비정상적인 DNS 쿼리 패턴 모니터링
- 업 스트림 DNS: 신뢰할 수 있는 업스트림 DNS 서버 사용
- 캐시 보안: DNS 캐시 포이즈닝 공격 방지