연재 시리즈

쿠버네티스 네트워크 스터디 5주차 - coredns 동작이해

악분 2022. 2. 16. 21:43
반응형

스터디 목차

 

안녕하세요. 이 글은 facebook 쿠버네티스 그룹에서 올라온 "쿠버네티스 네트워크 스터디" 5주차 내용을 정리했습니다.

스터디 모집글: https://www.facebook.com/groups/k8skr/posts/3202691746679143

 

1. 5주차 첫번째 주제

5주차 첫번째 주제는 coredns 동작이해입니다.

 

2. coredns란

coredns는 쿠버네티스 클러스터 DNS서버 역할을 합니다. 쿠버네티스 애드온으로 쿠버네티스 클러스터 실행시 pod로 실행됩니다.

 

파드, 서비스 도메인을 관리하고 외부 도메인 서버 연결이 필요한 경우 통로역할을 수행합니다. CoreDNS는 deployment로 관리되고 ClusterIP타입 서비스를 가집니다. 서비스이름은 kube-dns인데 호환성을 위해 구버전부터 사용했던 DNS서비스 이름을 사용합니다.

kubectl get pod,svc,ep -n kube-system -l k8s-app=kube-dns -o wide

 

3. 파드 DNS서버 주소 설정확인

파드는 디폴트로 DNS 질의를 사용할 때, kube-dns서비스 부터 찾습니다. /etc/resolv.conf파일을 확인하면 kube-dns ClusterIP가 설정되어 있습니다.

 

4. 파드, 서비스 도메인을 이용한 통신

CoreDNS는 파드 또는 서비스를 도메인으로 접근할 수 있습니다. 파드/서비스 도메인은 설정 후 변경되는 파드IP, 서비스 IP의 불편함을 해결해줍니다.

파드 또는 서비스가 수정된다면 (Cluster)IP가 수정됩니다.

 

CoreDNS는 파드와 서비스에 대한 도메인을 관리하며 해당하는 DNS요청이 오면 DNS응답을 전달합니다.

  • 파드 도메인: <파드-ip>.<namespace>.pod.cluster.local
  • 서비스 도메인: <서비스이름>.<namespace>.svc.cluster.local

 

실습을 위해 worker1번에 nginx1 pod를 worker2번에 nginx2 pod를 생성했습니다.

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: nginx
  name: nginx
spec:
  nodeName: k8s-w1
  containers:
  - image: nginx
    name: nginx
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx
  type: ClusterIP
---
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: netshoot
  name: netshoot
spec:
  nodeName: k8s-w2
  containers:
  - image: nicolaka/netshoot
    name: netshoot
    args: ["sleep", "infinty"]
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always

 

서비스 도메인을 이용해서 netshoot2→netshoot1로 ping을 요청해보겠습니다. netshoot2 서비스 ClusterIP를 몰라도 통신이 잘됩니다.

kubectl exec -it netshoot -- zsh
curl nginx.default.svc.cluster.local
curl nginx.default
curl nginx

 

서비스 도메인은 FQDN(Full Qualified Domain Name)은 <서비스이름>.<namespace>.svc.cluster.local입니다. 하지만 search와 ndots옵션으로 일부 생략할 수 있습니다.

 

그림으로 쉽게 표현하면 nginx 서비스를 도메인으로 접근했기 때문에, kube-dns로 DNS쿼리를 요청합니다. 그리고 DNS응답을 받은 nginx서비스 IP로 작업을 수행합니다. curl 명령어(빨간색 선)를 치면 바로 nginx 서비스로 가는 것이 아니라 kube-dns 서비스부터 네트워크 흐름이 시작됩니다.

 

만약 coredns pod를 0개로 줄이며 어떻게 될까요? dns응답을 받지 못해 통신이 실패합니다.

 

5. 외부 도메인 통신

쿠버네티스 클러스터 외부로 나가는 DNS쿼리도 coredns가 담당합니다. 각 pod는 디폴트로 coredns를 바라보기 때문에 모든 dns요청이 coredns로 가게 됩니다.

 

ping google.com을 하게되면 coredns가 DNS질의를 받아 구글서버 IP주소를 구합니다. 그리고 DNS질의한 pod에게 구글서버 IP를 전달합니다. pod는 전달받은 IP를 이용하여 구글서버에 ping을 수행합니다.

kubectl exec -it netshoot -- zsh
ping google.com

 

하지만, coredns pod를 0개로 설정하면 더이상 pod는 DNS응답을 받지못합니다. 결국, ping통신이 실패합니다. 

 

6. Coredns 설정파일

coredns설정은 configmap으로 설정합니다.

kubectl -n kube-system describe configmap coredns

 

파드,서비스 도메인 dns응답설정과 forward설정이 눈에 띕니다.

 

반응형