Kubernetes - CoreDNS

요약

Kubernetes 기초

Kubernetes 큰 주제 아래에서 세부 개념과 실습 절차를 연결하기 위한 노트입니다.

핵심 포인트

  • Kubernetes 기초
  • DNS 도메인 네임 서비스
  • CoreDNS
  • POD에서도 Subdomain을 사용하면 DNS서비스를 사용가능하다.
  • 공식문서

지식 그래프

정리 내용

DNS 도메인 네임 서비스

  • 서비스를 생성하면 대응되는 DNS 엔트리가 생성됨
  • 엔트리는 <서비스 이름>.<네임스페이스 이름>.svc.cluster.local 의 형식을 가짐

CoreDNS

  • 내부에서 DNS서버 역할을 하는 POD가 조냊
  • 각 미들웨어를 통해 로깅, 캐싱, 등의 기능을 가짐
  • DNS 에는 configmap저장소를 사용해 설정 파일을 컨트롤함
  • CoreFile을 통해 현재 클러스터의 NS를 지정
kubectl get configmap coredns -n kube-system -o yaml
------------------------------------------------------------
apiVersion: v1
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
    }

POD에서도 Subdomain을 사용하면 DNS서비스를 사용가능하다.

  • yaml 파일의 호스트 이름은 pod의 metadata.name을 따름
  • 필요한 경우 Hostname을 따로 선택 가능
  • 서브 도메인을 설정하면 FQDN 사용가능
    • 예시 : ...svc.cluster-domain.example
    • FQDN이란 Fully Qualified Domain Name 호스트를 도메인에 기술한 주소
      • 예시 www.naver.com (www가 호스트 naver.com 이 도메인)

공식문서

# sub도메인 생성 및 POD 도메인 생성 YAML파일
apiVersion: v1
kind: Service
metadata:
  name: default-subdomain
spec:
  selector:
    name: busybox
  clusterIP: None
  ports:
  - name: foo # 사실 포트는 필요하지 않다.
    port: 1234
    targetPort: 1234
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox1
  labels:
    name: busybox
spec:
  hostname: busybox-1
  subdomain: default-subdomain
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    name: busybox
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox2
  labels:
    name: busybox
spec:
  hostname: busybox-2
  subdomain: default-subdomain
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    name: busybox

연습문제

apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: null
  name: blue
 
---
apiVersion: v1
kind: Service
metadata:
  name: srv-jenkins
  namespace: blue
spec:
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
  selector:
    run: pod-jenkins
 
---
 
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    run: pod-jenkins
  name: pod-jenkins
  namespace: blue
spec:
  replicas: 1
  selector:
    matchLabels:
      run: pod-jenkins
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: pod-jenkins
    spec:
      containers:
      - image: jenkins/jenkins
        name: jenkins
        ports:
        - containerPort: 8080
        resources: {}
status: {}
k exec http-go -- curl srv-jenkins.blue.svc.cluster.local:8080
k exec http-go -- curl srv-jenkins.blue:8080

출처