CoreDNS 브로셔(6)플러그인 개발
설명서에서 언급한 바와 같이 플러그인 때문에CoreDNS를 선택할 수 있습니다.우리는 이미 previous section에서 많은 설정을 보았지만, 당신은 어떻게 자신의 플러그인을 씁니까?
Writing Plugins for CoreDNS 를 참고하여 플러그인 작성에 관한 오래된 기사가 있습니다.CoreDNS 소스 내의 plugin.md 문서에도 관련 자료가 있습니다.README.md는 관련 styling에 대한 내용도 논의했다.
간단한 플러그인 예는 example 플러그인입니다.github repository에서는 플러그인을 만드는 데 사용되는 소형 코드 (with tests!) 를 많이 보여 줍니다.
예를 들면 다음과 같습니다.
setup.go
와setup_test.go
Corefile 설정의 해석을 실현한다.Corefile 해상도에서 플러그인 이름을 볼 때 setup
함수 (보통 이렇게 이름) 가 호출됩니다.이 예에서 "example".example.go
(보통 이름.go
로 조회를 처리하는 논리를 포함한다.example_test.go
플러그인이 작동하는지 확인하는 기초 단위 테스트를 포함한다.README.md
는 UNIX 매뉴얼 스타일로 플러그인이 어떻게 구성되는지 보여 줍니다.코드는 광범위한 내용을 가지고 있다.플러그인은 그것을 바탕으로 개발할 수 있으니 마음대로 fork를 사용하십시오.
플러그인 호출 방법
CoreDNS에서 플러그인을 사용하려면 방법
ServeDNS
을 호출합니다.ServeDNS
에는context.Context
; dns.ResponseWriter
, 즉client 연결;*dns.Msg
,client의 요청입니다.ServeDNS
두 개의 값을 되돌려줍니다: (response) 코드와 error입니다.서버에서 errors 플러그인을 사용하면 error가 로그에 기록됩니다.코드는 플러그인 체인에 답변 정보를 썼는지 CoreDNS에 알려 줍니다.다음 사례에서 CoreDNS는 관련된다.코드의 값에 대해, 우리는 dns 패키지 내의 DNS 리턴 코드(rcodes)를 복용합니다
CoreDNS treats:
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
,INFO
orWARNING
일 수 있습니다.보통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 파일, 플러그인의 기능과 설정 방법을 설명합니다.파일에는 다음 계층이 포함되어야 합니다.
plugin.Namespace
.예를 들어 NAME DASH DESCRIPTION DOT.더 많은 섹션도 가능합니다.
Style
Unix 매뉴얼 스타일:
- .
.*plugin*
.**EXAMPLE**
.[optional]
.arg...
.Example Domain Names
범례와 테스트에서 사용
literal
orexample.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 참조
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.