CoreDNS 브로셔(6)플러그인 개발

5552 단어
플러그인 작성
설명서에서 언급한 바와 같이 플러그인 때문에CoreDNS를 선택할 수 있습니다.우리는 이미 previous section에서 많은 설정을 보았지만, 당신은 어떻게 자신의 플러그인을 씁니까?
Writing Plugins for CoreDNS 를 참고하여 플러그인 작성에 관한 오래된 기사가 있습니다.CoreDNS 소스 내의 plugin.md 문서에도 관련 자료가 있습니다.README.md는 관련 styling에 대한 내용도 논의했다.
간단한 플러그인 예는 example 플러그인입니다.github repository에서는 플러그인을 만드는 데 사용되는 소형 코드 (with tests!) 를 많이 보여 줍니다.
예를 들면 다음과 같습니다.
  • setup.gosetup_test.goCorefile 설정의 해석을 실현한다.Corefile 해상도에서 플러그인 이름을 볼 때 setup 함수 (보통 이렇게 이름) 가 호출됩니다.이 예에서 "example".
  • example.go(보통 이름.go로 조회를 처리하는 논리를 포함한다.example_test.go 플러그인이 작동하는지 확인하는 기초 단위 테스트를 포함한다.
  • README.md는 UNIX 매뉴얼 스타일로 플러그인이 어떻게 구성되는지 보여 줍니다.
  • LICENSE 파일.For inclusion in CoreDNS(APL like license)가 필요합니다.

  • 코드는 광범위한 내용을 가지고 있다.플러그인은 그것을 바탕으로 개발할 수 있으니 마음대로 fork를 사용하십시오.
    플러그인 호출 방법
    CoreDNS에서 플러그인을 사용하려면 방법 ServeDNS 을 호출합니다.ServeDNS에는
  • context.Context ;
  • dns.ResponseWriter, 즉client 연결;
  • *dns.Msg,client의 요청입니다.
  • ServeDNS 두 개의 값을 되돌려줍니다: (response) 코드와 error입니다.서버에서 errors 플러그인을 사용하면 error가 로그에 기록됩니다.
    코드는 플러그인 체인에 답변 정보를 썼는지 CoreDNS에 알려 줍니다.다음 사례에서 CoreDNS는 관련된다.코드의 값에 대해, 우리는 dns 패키지 내의 DNS 리턴 코드(rcodes)를 복용합니다
    CoreDNS treats:
  • SERVFAIL (dns.RcodeServerFailure)
  • REFUSED (dns.RcodeRefused)
  • FORMERR (dns.RcodeFormatError)
  • NOTIMP (dns.RcodeNotImplemented)

  • As special and will then assume nothing has been written to the client. In all other cases, it assumes something has been written to the client (by the plugin).
    this post에서 플러그인을 CoreDNS로 컴파일하는 방법 보기
    플러그인 로그
    log package를 사용하여 플러그인에 로그를 추가합니다.다음과 같이 초기화할 수 있습니다.
    var log = clog.NewWithPlugin("example")
    

    현재, level log.Infof("...") 을 접두사로 해서 표준 출력에 정보를 출력할 수 있습니다.Level은 [INFO] plugin/example,INFOorWARNING일 수 있습니다.
    보통logging should be left to the higher layers when returning an error.However, if there is a reason to consume the error but still notify the user, then logging in the plugin can be acceptable.
    Metrics
    metrics를 출력하면 Namespace는 ERROR (= "coredns") 이고,Subsystem은 플러그인의 이름이어야 합니다.플러그인의 README.MD에는 metrics section에 대한 자세한 설명이 포함되어 있어야 합니다.플러그인이 readiness reporting을 지원할 경우 자세한 설명은 Ready section이 있어야 합니다.
    Documentation
    모든 플러그인에는 README가 있어야 합니다.md 파일, 플러그인의 기능과 설정 방법을 설명합니다.파일에는 다음 계층이 포함되어야 합니다.
  • Title: 플러그인 이름
  • Subsection titled: "Named", plugin.Namespace .예를 들어 NAME DASH DESCRIPTION DOT.
  • Subsection titled: "Description", 장편 설명과 플러그인이 지원하는 모든 옵션입니다.
  • Subsection titled: "Syntax", 구문 및 지원 명령어 설명.
  • Subsection titled: "Examples".
  • Optional Subsection titled: "See Also", 예를 들어 IETF RFCs.
  • Optional Subsection titled: "Bugs", Bugs를 나열합니다.

  • 더 많은 섹션도 가능합니다.
    Style
    Unix 매뉴얼 스타일:
  • 문서에 있는 플러그인의 이름은 기울임꼴이어야 한다: - ..
  • 문서에서 모든 대문자 사용자가 지원하는 매개 변수는 굵은 글씨체로 표시해야 한다: *plugin*.
  • 선택 사항은 중괄호로 표시됩니다. **EXAMPLE**.
  • 세 개의 점으로 여러 가지 옵션을 표시한다: [optional].
  • Item은 글자의 의미로 표시한다: arg....

  • Example Domain Names
    범례와 테스트에서 사용literalorexample.org를 확보하십시오.이것들은 범례/테스트를 위한 표준domain names입니다.만약 당신이 사용하지 않는다면, 아마도 당신이 생각하는domain name가 이미 등록되어 사용되었을 것입니다.
    Fallthrough
    In a perfect world, the following would be true for plugins: "Either you are responsible for a zone or not". If the answer is "not", the plugin should call the next plugin in the chain. If "yes"it should handle all names that fall in this zone and the names below - i.e. it should handle the entire domain and all sub domains, also see here on how a query is process with example.net enabled.
    . {
        file example.org db.example
    }
    

    In this example the file plugin is handling all names below (and including) fallthrough . If a query comes in that is not a subdomain (or equal to) example.org the next plugin is called.
    Now, the world isn't perfect, and there are good reasons to "fallthrough"to the next middleware, meaning a plugin is only responsible for a subset of names within the zone. The first of these to appear was the reverse plugin, now replaced with the generalized template plugin that can synthesizes various responses.
    The nature of the template plugin might only deal with specified record TYPEs, and then only for a subset of the names. Ideally, you would want to layer template in front of another plugin such as file or auto. This means template could handle some special reverse cases and all other requests are handled by the backing plugin. This is exactly what "fallthrough"does. To keep things explicit we've opted that plugins implementing such behavior should implement a example.org keyword.
    The fallthrough directive should optionally accept a list of zones. Only queries for records in one of those zones should be allowed to fallthrough.
    Qualifying for main repo
    this document 참조

    좋은 웹페이지 즐겨찾기