惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
月光博客
月光博客
雷峰网
雷峰网
WordPress大学
WordPress大学
博客园 - 司徒正美
Last Week in AI
Last Week in AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
Visual Studio Blog
H
Help Net Security
Engineering at Meta
Engineering at Meta
Google DeepMind News
Google DeepMind News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
Security @ Cisco Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
爱范儿
爱范儿
W
WeLiveSecurity
J
Java Code Geeks
Forbes - Security
Forbes - Security
H
Hacker News: Front Page
T
Threatpost
The Cloudflare Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
N
Netflix TechBlog - Medium
Latest news
Latest news
V2EX - 技术
V2EX - 技术
小众软件
小众软件
T
The Blog of Author Tim Ferriss
A
Arctic Wolf
B
Blog RSS Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
C
Check Point Blog
N
News | PayPal Newsroom
Cyberwarzone
Cyberwarzone
V
V2EX
TaoSecurity Blog
TaoSecurity Blog
P
Privacy & Cybersecurity Law Blog
Microsoft Security Blog
Microsoft Security Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
D
DataBreaches.Net
F
Fortinet All Blogs
阮一峰的网络日志
阮一峰的网络日志
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
IT之家
IT之家
K
Kaspersky official blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Google DeepMind News
Google DeepMind News
C
CXSECURITY Database RSS Feed - CXSecurity.com
www.infosecurity-magazine.com
www.infosecurity-magazine.com

Documentation on CoreDNS: DNS and Service Discovery

Cluster DNS: CoreDNS vs Kube-DNS Scaling CoreDNS in Kubernetes Clusters Migration from kube-dns to CoreDNS Deploying Kubernetes with CoreDNS using kubeadm Compile Time Enabling or Disabling Plugins Quick Start Corefile Explained How Queries Are Processed in CoreDNS Custom DNS Entries For Kubernetes CoreDNS for Minikube CoreDNS for Kubernetes Service Discovery, Take 2 How to Add Plugins to CoreDNS History of CoreDNS in four posts. DNS over HTTPS CoreDNS for Kubernetes Service Discovery Quick Start for Windows Query Routing
Writing Plugins for CoreDNS
miek · 2016-12-19 · via Documentation on CoreDNS: DNS and Service Discovery

A plugin adds functionality to CoreDNS, i.e. caching, metrics and basic zone file serving are all plugins.

If you want to write a new plugin and want it to be included by default, i.e. merged in the code base please open an issue first to discuss initial design and other things that may come up. Starting with a README file to explain how things work from a user perspective is usually a good idea.

See the example plugin for, uh, an example for how to structure, write and test a plugin. There are plenty of comments in the code to help you along.

How to Register a CoreDNS Plugin?

When writing your plugin code you will need to register it with CoreDNS. This can be done by calling the following function:

func init() { plugin.Register("foo", setup) }

Every plugin must have a name, foo, in this case. When foo is encountered in the configuration the setup function will be called in this package.

The Setup Function

The setup function (it may be called different, but pretty much every plugin just calls it setup) parses the configuration and populates internal data structures.

The setup function a caddy.Controller and returns an error: (We use plugin.Error to prefix returned error with plugin/foo: to improve error reporting).

func setup(c *caddy.Controller) error {
  if err != nil {
    return plugin.Error("foo", err)
  }

  // various other code

  return nil
}

If we see a line in the Corefile such as:

foo gizmo

We can get the value of the first argument (“gizmo”) like so:

for c.Next() {              // Skip the plugin name, "foo" in this case.
    if !c.NextArg() {       // Expect at least one value.
        return c.ArgErr()   // Otherwise it's an error.
    }
    value := c.Val()        // Use the value.
}

You parse the tokens present for your plugin by iterating over c.Next() which is true as long as there are more tokens to parse. Since a plugin may appear multiple times, you must iterate over c.Next() to get all the appearances of your plugin and consume the tokens.

Adding to CoreDNS

To plug your plugin into CoreDNS, put in plugin.cfg and run go generate.

If you’re working with an external, non core, plugin it will be easiest to make a symlink from the plugin directory to your plugin. I.e.

cd plugin
ln -s ../../example .
cd ..
vi plugin.cfg # add example:example
go generate
go build

How A Plugin Works in CoreDNS

Check out the godoc for the plugin package. The most important type is plugin.Handler.

A Handler is a function that handles a DNS request. CoreDNS will do all the bookkeeping of setting up an DNS server for you, but you need to implement these two types.

Writing a Handler

plugin.Handler is an interface similar to http.Handler except that it deals with DNS and the ServeDNS method returns (int, error). The int is status code, and the error is logged (if not nil) See plugin.md for more details about these return values.

Handlers are usually a struct with at least one field, the next Handler in the chain:

type MyHandler struct {
  Next plugin.Handler
}

To implement the plugin.Handler interface, we write a method called ServeDNS. This method is the actual handler function, and, unless it fully handles the request by itself, it should call the next handler in the chain:

func (h MyHandler) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
  return h.Next.ServeDNS(ctx, w, r)
}

The interface also needs a method func Name() string.,

func (h MyHandler) Name() string { return "foo" }

That’s all there is to it (apart from writing all code that actually does something with the DNS request of course).

Further Reading

Simple examples of plugin that can be found in CoreDNS are:

  • root; does not register itself as a plugin. It simply performs some setup.
  • chaos; a DNS plugin that responds to CH txt version.bind requests.
  • example; an example plugin that prints “example” when responding to a query.

Don’t forget: the best documentation is the godoc and the code itself!