CoreDNS 手册(六)__插件开发

编写插件

正如手册前面提到的, 因为插件而让 CoreDNS 被选择。我们已经在previous section看到了很多配置,但是你怎么写自己的插件呢?

参见 Writing Plugins for CoreDNS有关于编写插件的一些较旧的文章。CoreDNS源码内的 plugin.md 文档也有些相关资料,在README.md还讨论了相关 styling 的内容。

简单的插件范例是 example 插件。 在 github repository 展示了很多用来创建插件的小型代码 (with tests!) 。

比如:

  1. setup.gosetup_test.go,实现Corefile配置的解析。
    当Corefile 解析器看到插件名字的时候,setup 函数(通常这样命名)被调用。在本例中, "example"。
  2. example.go (通常命名为 <plugin_name>.go),包含了处理查询的逻辑。
    example_test.go,包含了检查插件是否工作的基础单元测试。
  3. README.md ,以UNIX 手册的风格展示了插件如何被配置。
  4. LICENSE 文件。For inclusion in CoreDNS, 这需要有一个 APL like license。

代码有着宽泛的内容;请随意fork,插件可以以其为基础开发。

插件怎么被调用

当 CoreDNS 想要使用一个插件,它会调用方法 ServeDNSServeDNS 有三个参数:

  • context.Context;
  • dns.ResponseWriter ,亦即 client 连接;
  • *dns.Msg ,来自 client 的请求。

ServeDNS 返回两个值: 一个 (response) code 和 一个 error。当服务器使用了errors 插件,error 会被记录到日志。

code 告诉 CoreDNS,插件链是否已经写了答复信息。在后面的案例中,CoreDNS 涉及到。对于 code 的值,我们 复用 dns 包内的DNS 返回码 return codes (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")

现在,你可以 log.Infof("...") 来打印信息到标准输出,以 level [INFO] plugin/example作为前缀。Level 可以是: INFO, WARNING or ERROR

通常, 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 应该是 plugin.Namespace (="coredns"),Subsystem 应该是插件的名字。
插件的README.md 应该包含 Metrics section 详细说明metrics。
如果插件支持readiness reporting,还必须有一个Ready section 来作详细说明。

Documentation

每个插件都应该有 README.md 文件,阐述插件的功能和如何配置。文件应该包含如下层次:

  • Title: 插件的名字
  • Subsection titled: "Named", <plugin name> - <one line description>.。比如 NAME DASH DESCRIPTION DOT.
  • Subsection titled: "Description",一长篇描述和插件支持的所有options。
  • Subsection titled: "Syntax" ,阐述语法和支持的指令。
  • Subsection titled: "Examples"。
  • Optional Subsection titled: "See Also", 参考文档,比如 IETF RFCs。
  • Optional Subsection titled: "Bugs" ,列出Bugs。

更多的 sections 也是可以的。

Style

我们使用Unix 手册风格:

  • 在文档中的插件名字应该是斜体的: *plugin*.
  • 文档中,所有大写的用户支持的参数应该以粗体显示: **EXAMPLE**.
  • 可选的内容以中括号显示: [optional].
  • 以三个点示意多个选项: arg....
  • Item 以字面意义显示: literal.

Example Domain Names

请确保在范例和测试中使用 example.org or example.net 。 这些是为范例/测试创建的标准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 fallthrough enabled.

. {
    file example.org db.example
}

In this example the file plugin is handling all names below (and including) example.org. 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 fallthrough 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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,320评论 0 10
  • NAME dnsmasq - A lightweight DHCP and caching DNS server....
    ximitc阅读 2,840评论 0 0
  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,460评论 0 23
  • 影片以1976年的唐山大地震当年的情形为背景,细致的描写了唐山一个普通人的家庭生活。在天灾的环境中,我们人类...
    鐧鑀阅读 253评论 0 4
  • 清晨,我起来到外面散步。这时,世界刚刚从睡梦中苏醒过来,显得很安静。只有轻风微起,轻轻地吹拂着大地。也没有鸟儿叽叽...
    子明小蜗阅读 235评论 1 2