mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-30 17:53:21 -04:00 
			
		
		
		
	* Rename middleware to plugin first pass; mostly used 'sed', few spots where I manually changed text. This still builds a coredns binary. * fmt error * Rename AddMiddleware to AddPlugin * Readd AddMiddleware to remain backwards compat
		
			
				
	
	
		
			168 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # kubernetes
 | |
| 
 | |
| The *kubernetes* plugin enables the reading zone data from a Kubernetes cluster.  It implements
 | |
| the [Kubernetes DNS-Based Service Discovery
 | |
| Specification](https://github.com/kubernetes/dns/blob/master/docs/specification.md).
 | |
| 
 | |
| CoreDNS running the kubernetes plugin can be used as a replacement of kube-dns in a kubernetes
 | |
| cluster.  See the [deployment](https://github.com/coredns/deployment) repository for details on [how
 | |
| to deploy CoreDNS in Kubernetes](https://github.com/coredns/deployment/tree/master/kubernetes).
 | |
| 
 | |
| [stubDomains](http://blog.kubernetes.io/2017/04/configuring-private-dns-zones-upstream-nameservers-kubernetes.html)
 | |
| are implemented via the *proxy* plugin.
 | |
| 
 | |
| ## Syntax
 | |
| 
 | |
| ~~~
 | |
| kubernetes [ZONES...]
 | |
| ~~~
 | |
| 
 | |
| With only the directive specified, the *kubernetes* plugin will default to the zone specified in
 | |
| the server's block. It will handle all queries in that zone and connect to Kubernetes in-cluster. It
 | |
| will not provide PTR records for services, or A records for pods. If **ZONES** is used it specifies
 | |
| all the zones the plugin should be authoritative for.
 | |
| 
 | |
| ```
 | |
| kubernetes [ZONES...] {
 | |
|     resyncperiod DURATION
 | |
|     endpoint URL
 | |
|     tls CERT KEY CACERT
 | |
|     namespaces NAMESPACE...
 | |
|     labels EXPRESSION
 | |
|     pods POD-MODE
 | |
|     upstream ADDRESS...
 | |
|     ttl TTL
 | |
|     fallthrough
 | |
| }
 | |
| ```
 | |
| * `resyncperiod` specifies the Kubernetes data API **DURATION** period.
 | |
| * `endpoint` specifies the **URL** for a remove k8s API endpoint.
 | |
|    If omitted, it will connect to k8s in-cluster using the cluster service account.
 | |
|    Multiple k8s API endpoints could be specified, separated by `,`s, e.g.
 | |
|    `endpoint http://k8s-endpoint1:8080,http://k8s-endpoint2:8080`. CoreDNS
 | |
|    will automatically perform a healthcheck and proxy to the healthy k8s API endpoint.
 | |
| * `tls` **CERT** **KEY** **CACERT** are the TLS cert, key and the CA cert file names for remote k8s connection.
 | |
|    This option is ignored if connecting in-cluster (i.e. endpoint is not specified).
 | |
| * `namespaces` **NAMESPACE [NAMESPACE...]**, exposed only the k8s namespaces listed.
 | |
|    If this option is omitted all namespaces are exposed
 | |
| * `labels` **EXPRESSION** only exposes the records for Kubernetes objects that match this label selector.
 | |
|    The label selector syntax is described in the
 | |
|    [Kubernetes User Guide - Labels](http://kubernetes.io/docs/user-guide/labels/). An example that
 | |
|    only exposes objects labeled as "application=nginx" in the "staging" or "qa" environments, would
 | |
|    use: `labels environment in (staging, qa),application=nginx`.
 | |
| * `pods` **POD-MODE** sets the mode for handling IP-based pod A records, e.g.
 | |
|    `1-2-3-4.ns.pod.cluster.local. in A 1.2.3.4`.
 | |
|    This option is provided to facilitate use of SSL certs when connecting directly to pods. Valid
 | |
|    values for **POD-MODE**:
 | |
| 
 | |
|    * `disabled`: Default. Do not process pod requests, always returning `NXDOMAIN`
 | |
|    * `insecure`: Always return an A record with IP from request (without checking k8s).  This option
 | |
|      is is vulnerable to abuse if used maliciously in conjunction with wildcard SSL certs.  This
 | |
|      option is provided for backward compatibility with kube-dns.
 | |
|    * `verified`: Return an A record if there exists a pod in same namespace with matching IP.  This
 | |
|      option requires substantially more memory than in insecure mode, since it will maintain a watch
 | |
|      on all pods.
 | |
| 
 | |
| * `upstream` **ADDRESS [ADDRESS...]** defines the upstream resolvers used for resolving services
 | |
|   that point to external hosts (External Services).  **ADDRESS** can be an ip, an ip:port, or a path
 | |
|   to a file structured like resolv.conf.
 | |
| * `ttl` allows you to set a custom TTL for responses. The default (and allowed minimum) is to use
 | |
|   5 seconds, the maximum is capped at 3600 seconds.
 | |
| * `fallthrough`  If a query for a record in the cluster zone results in NXDOMAIN, normally that is
 | |
|   what the response will be. However, if you specify this option, the query will instead be passed
 | |
|   on down the plugin chain, which can include another plugin to handle the query.
 | |
| 
 | |
| ## Examples
 | |
| 
 | |
| Handle all queries in the `cluster.local` zone. Connect to Kubernetes in-cluster.
 | |
| Also handle all `PTR` requests for `10.0.0.0/16` . Verify the existence of pods when answering pod
 | |
| requests. Resolve upstream records against `10.102.3.10`. Note we show the entire server block
 | |
| here:
 | |
| 
 | |
| ~~~ txt
 | |
| 10.0.0.0/16 cluster.local {
 | |
|     kubernetes {
 | |
|         pods verified
 | |
|         upstream 10.102.3.10:53
 | |
|     }
 | |
| }
 | |
| ~~~
 | |
| 
 | |
| Or you can selectively expose some namespaces:
 | |
| 
 | |
| ~~~ txt
 | |
| kubernetes cluster.local {
 | |
|     namespaces test staging
 | |
| }
 | |
| ~~~
 | |
| 
 | |
| Connect to Kubernetes with CoreDNS running outside the cluster:
 | |
| 
 | |
| ~~~ txt
 | |
| kubernetes cluster.local {
 | |
|     endpoint https://k8s-endpoint:8443
 | |
|     tls cert key cacert
 | |
| }
 | |
| ~~~
 | |
| 
 | |
| Here we use the *proxy* plugin to implement stubDomains that forwards `example.org` and
 | |
| `example.com` to another nameserver.
 | |
| 
 | |
| ~~~ txt
 | |
| cluster.local {
 | |
|     kubernetes {
 | |
|         endpoint https://k8s-endpoint:8443
 | |
|         tls cert key cacert
 | |
|     }
 | |
| }
 | |
| example.org {
 | |
|     proxy . 8.8.8.8:53
 | |
| }
 | |
| example.com {
 | |
|     proxy . 8.8.8.8:53
 | |
| }
 | |
| ~~~
 | |
| 
 | |
| ## AutoPath
 | |
| 
 | |
| The *kubernetes* plugin can be used in conjunction with the *autopath* plugin.  Using this
 | |
| feature enables server-side domain search path completion in kubernetes clusters.  Note: `pods` must
 | |
| be set to `verified` for this to function properly.
 | |
| 
 | |
|     cluster.local {
 | |
|         autopath @kubernetes
 | |
|         kubernetes {
 | |
|             pods verified
 | |
|         }
 | |
|     }
 | |
| 
 | |
| ## Federation
 | |
| 
 | |
| The *kubernetes* plugin can be used in conjunction with the *federation* plugin.  Using this
 | |
| feature enables serving federated domains from the kubernetes clusters.
 | |
| 
 | |
|     cluster.local {
 | |
|         federation {
 | |
|             fallthrough
 | |
|             prod prod.example.org
 | |
|             staging staging.example.org
 | |
| 
 | |
|         }
 | |
|         kubernetes
 | |
|     }
 | |
| 
 | |
| 
 | |
| ## Wildcards
 | |
| 
 | |
| Some query labels accept a wildcard value to match any value.  If a label is a valid wildcard (\*,
 | |
| or the word "any"), then that label will match all values.  The labels that accept wildcards are:
 | |
| 
 | |
|  * _service_ in an `A` record request: _service_.namespace.svc.zone.
 | |
|    * e.g. `*.ns.svc.myzone.local`
 | |
|  * _namespace_ in an `A` record request: service._namespace_.svc.zone.
 | |
|    * e.g. `nginx.*.svc.myzone.local`
 | |
|  * _port and/or protocol_ in an `SRV` request: __port_.__protocol_.service.namespace.svc.zone.
 | |
|    * e.g. `_http.*.service.ns.svc.`
 | |
|  * multiple wild cards are allowed in a single query.
 | |
|    * e.g. `A` Request `*.*.svc.zone.` or `SRV` request `*.*.*.*.svc.zone.`
 |