GIP가 없는 Kubernetes 클러스터의 external-dns 대응

집 환경의 Kubernetes 클러스터에서 external-Dns를 쉽게 가져올 수 없기 때문에 오랜 시간이 걸려서 도입했습니다.

프로비저닝


이번에는 해당 장소의 구성도만 간략화했다.
01.png

문제점


상기 환경에서 external-dnsKubernetes 그룹에 간단하게 가져와도 다음과 같은 이유보다 더 잘 일할 수 없다.
  • external-dns는 Ingress 대상[1]의 값spec.rules[].hostexample.com의 값(예를 들어 status.loadBalancer.ingress[].ip으로 해석하는 데 사용되는 기록을 지정한 값대상 DNS 공급자으로 설정합니다.
  • 여기서 상기 환경에서Ingress Controller에서 보낸 IPv4 주소는 내부 주소이기 때문에external-dns를 통해 등록된 A 기록은 외부에서 참조할 때 부정확한 값이 된다.
  • 해결책


    상기 문제를 해결하기 위해 external-Dns의providerCoreDNS에서 다음과 같은 구성을 채택하였다.
    02.png

    CoreDNS etcd Plugin


    CoreDNS의 etcd Plugin 설명서는 다음과 같습니다.
  • https://coredns.io/plugins/etcd/
  • CoreDNS를 대략적으로 설명하면 A 레코드의 동작은 다음과 같습니다.
  • etcd의 192.168.0.51키에 등록/${base_key}/com/example/xxx/${random}된value를 통해CoreDNS에서 A기록{"host":"1.1.1.1"}으로 명칭을 xxx.example.com으로 해석할 수 있음
  • 문서
  • 따라서 CoreDNS는 프로세스를 다시 시작하지 않고도 외부에서 기록을 쉽게 업데이트할 수 있습니다.

    external-dns CoreDNS Provider


    external-dns의 etcd Provider는 다음과 같은 이용 예가 있다.
  • https://github.com/kubernetes-sigs/external-dns/blob/master/docs/tutorials/coredns.md
  • 위에서 말한 바와 같이 external-dns는 Ingress 대상을 검출하고 자동으로 기록을 생성합니다.
    external-dns의Provider에서CoreDNS를 지정할 때external-dns는CoreDNS의 참조 대상인etcd를 기록하는 등록, 삭제 등의 동작을 합니다.

    etcd-injector


    상기 구성을 얻기 위해 실시된 etcd-injector의 원본 코드는 다음과 같다.
  • https://github.com/ShotaKitazawa/etcd-injector
  • 이 프로그램은 원샷에서 다음과 같은 동작을 합니다.
  • 가져오기: src에서 지정한 etcd의 키-value 가져오기
  • 키가 디렉터리인 경우 이 디렉터리 아래의 모든 키가 복사 대상
  • 변환: 상기 키에 대응하는 JSON format의value에 대해 규칙을 바탕으로 JSON 키-value를 삽입한다. (이곳에서 말한 JSON 키는 JSON format에 저장된 etcd의value)
  • JSONkey가 이미 존재하는 상황에서 JSONvalue
  • 를 바꿉니다.
  • 등록: 변환된 etcd 키-value를 dst로 지정된 etcd
  • 로 복사
    Kubernetes의 CronJob에서 실행하여 external-dns1.1.1.1에 정기적으로 삽입된 다음 기록의 해결 주소를 Global Addr/int/com/example로 대체하고 아래로 복사합니다.이로써 각각 조작/ext/com/example,coredns-internal과CoreDNS를 통해 다음과 같은 내용을 실현할 수 있다.
  • coredns-external etcd의 coredns-internal를 참고하여 /int/com/example 내부 주소의 이름으로 해석
  • 가정 환경에서 각 시스템이 DNS 서버(캐시 DNS)를 참조한다고 가정
  • xxx.example.com etcd의 coredns-internal를 참고하여 /int/com/example 외부 주소의 이름으로 해석
  • 외부 참조 DNS 서버(권위 있는 DNS)를 가정합니다.
  • 운용 시 회로 변압기가 되지 않도록 주의하세요
  • 설정


    나는 모든 문장을 일부분씩 고쳐 쓸 것이니 참고가 되기를 바란다.
  • xxx.example.com for Corefile
  • . {
        errors
        health {
          lameduck 5s
        }
        ready
        prometheus :9153
        cache 30
        loop
        reload
        loadbalance
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        etcd $DOMAIN {
          path /skydns
          endpoint $ETCD_ENDPOINT
        }
        forward . 8.8.8.8 8.8.4.4
    }
    
  • coredns-internal for Corefile
  • $DOMAIN {
        errors
        health {
          lameduck 5s
        }
        ready
        prometheus :9153
        cache 30
        reload
        loadbalance
        etcd $DOMAIN {
          path /external
          endpoint $ETCD_ENDPOINT
        }
    }
    
  • coredns-external cammand options
  • external-dns --source=ingress --provider=coredns --log-level=debug
    
  • external-dns command options
  • etcd-injector \
      --src-endpoints=$ETCD_ENDPOINT \
      --dst-endpoints=$ETCD_ENDPOINT \
      --src-directory=/skydns/com/example \
      --ignore=/skydns/com/example/local \
      --dst-directory=/external/com/example \
      --rules-filepath=rules.yaml \
      --delete
    
  • etcd-injector for rules.yml
  • - jsonpath: ".host"
      repl: "${GLOBAL_ADDR}"
    - jsonpath: ".ttl"
      repl: 900
    

    고찰하다.


    상술한 구성은 다음과 같은 장점이 있다.
  • Kubernetes의 Ingress 대상과 관련된 기록을 자동으로 생성/삭제
  • 캐시 DNS 서버와 권위 있는 DNS 서버가 분리되어 있음
  • 일반 DNS 캡처 처리 방법
  • 이에 비해 코어렌즈의 etcdpluggin은 etcd-injector,A,AAAA,SRV만 등록할 수 있는 제한[2]이 있어 다음과 같은 단점이 있다.
  • NS 로깅을 사용하여 다른 이름 서버에 서브도메인을 위임할 수 없음
  • 총결산


    위 방법을 사용하면 자신의 환경의 Kubbernetes에서 external-dns를 가져올 수 있습니다.이렇게 되면 Ingress 자원에 공개된 서비스 기록을 수동으로 등록하는 번거로움을 줄이고 관리도 훨씬 수월해진다.
    또 단점으로 열거한 자역에서 위탁할 수 없는 일은 자신의 집 환경에서도 문제가 되지 않는다.
    각주
    서비스 자원도 external-dns의 관리 대상이 될 수 있으나 메인 라인에서 벗어났기 때문에 생략↩︎
    https://coredns.io/plugins/etcd/에 상기 기록 이외의 등록 방법은 기술되지 않았다.또한 3년 전 아이슈. 디스플레이 관리자는 etcdbackend가 모든 자원 유형을 지원하지 않는다고 명확하게 밝혔다.↩︎

    좋은 웹페이지 즐겨찾기