개요
kubernetes에서 DNS가 어떻게 동작하는지 알아보겠습니다.
DNS Record 할당 범위
k8s에서는 Service와 POD를 위해서 DNS Record를 생성합니다.
Core DNS의 동작 범위
Core DNS Record 규칙
전체 그림
DNS Recor설정 상세
Service가 생성되면 CoreDNS에 아래와 같은 DNS Record가 자동으로 생성이 됩니다.
그래서 DNS Record 덕분에 namespace를 분리하면 동일한 이름의 service를 생성 가능 합니다.
첫 번째 줄을 풀어서 설명하면
web-service는 apps라는 namespace에 있고 type은 svc(service)이고 cluster.local에 존재하며 IP를 10.107.37.188이라고
해석을 할 수 있습니다.
Pod에서의 DNS 설정 확인
Pod에서는 /etc/resolv.conf 에서 현재 설정된 dns 설정을 볼 수 있습니다.
그리고 여기에서 search 항목이 핵심입니다. 모든 domain에 대한 검색 설정이 걸려있기 때문입니다.
아래는 /etc/resolv.conf 설정 파일입니다.
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
options ndots:5
결론적으로 우리가 service에 대하여 FQDN(Fully Qualified Domain Name)이 가능했던 이유는 search 항목에서 모든 domain에 대한 검색 설정이 걸려있기 때문입니다. 참고로 Pod에 대한 domain 설정은 기본적으로 설정되어있지 않습니다. Pod에 대한 FQDN 설정을 하려면 cluster 초기 단계부터 아래와 같은 설정을 추가해주어야 합니다.
"Pod의 DNS를 활성화하려면, Kubernetes 클러스터를 설정할 때 --kubelet-config 플래그를 사용하고, KubeletConfiguration에서 podDNSConfig 항목을 다음과 같이 설정해야 합니다."
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
clusterDomain: cluster.local
clusterDNS:
- 10.96.0.10
podDNSPolicy: "ClusterFirstWithHostNet"
하지만 이설정은 일반적이지는 않으며 service를 통한 접근을 권장하고 있습니다. 그런데도 혹시나 저와 같이 테스트 한번 해보고 싶으신 분들은 container안의 /etc/resolv.conf 에서 search 항목을 아래와 같이 pod에 대한 domain을 추가하면 정상 동작합니다.
search default.svc.cluster.local svc.cluster.local cluster.local default.pod.cluster.local pod.cluster.local
CoreDNS 설정 확인
CoreDNS 설정은 configmap으로 되어있어서 아래 명령으로 확인 가능 합니다. 단 DNS Record는 확인이 안 됩니다.
CoreDNS에 DNS Record는 직접 붙는 것은 어렵기 때문에 nslookup이나 dig 등으로밖에 확인 안 됩니다.
#kubectl describe configmap coredns -n kube-system
ame: coredns
Namespace: kube-system
Labels: <none>
Annotations: <none>
Data
====
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 . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
BinaryData
====
Events: <none>
정리
CoreDNS는 k8s를 위한 DNS Server이며 Service 생성/삭제 시 자동으로 CoreDNS에 등록/삭제가 된다.
CoreDNS는 service를 위해서 대부분 사용이됩니다.
Next Post
'Cloud > k8s-CKA' 카테고리의 다른 글
[CKA] 32. docker의 image layer관리 (storage driver) (0) | 2023.08.15 |
---|---|
[CKA] 31. service - plugin (0) | 2023.07.27 |
[CKA] - network 문제 해결 tip (0) | 2023.07.25 |
[CKA] 29. service - default (0) | 2023.07.23 |
[CKA] 28. Pod의 Networking 과 Weave CNI (0) | 2023.07.20 |