| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | # kubernetes
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-04 12:53:07 +00:00
										 |  |  | ## Name
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | *kubernetes* - enables the reading zone data from a Kubernetes cluster. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Description
 | 
					
						
							| 
									
										
										
										
											2017-09-15 22:27:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | It implements the [Kubernetes DNS-Based Service Discovery | 
					
						
							| 
									
										
										
										
											2017-08-08 05:05:34 -07:00
										 |  |  | Specification](https://github.com/kubernetes/dns/blob/master/docs/specification.md). | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-14 09:36:06 +01:00
										 |  |  | CoreDNS running the kubernetes plugin can be used as a replacement of kube-dns in a kubernetes | 
					
						
							| 
									
										
										
										
											2017-08-08 05:05:34 -07:00
										 |  |  | 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). | 
					
						
							| 
									
										
										
										
											2016-10-10 20:13:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 10:48:26 +01:00
										 |  |  | [stubDomains](http://blog.kubernetes.io/2017/04/configuring-private-dns-zones-upstream-nameservers-kubernetes.html) | 
					
						
							| 
									
										
										
										
											2017-09-14 09:36:06 +01:00
										 |  |  | are implemented via the *proxy* plugin. | 
					
						
							| 
									
										
										
										
											2017-09-07 10:48:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-01 03:20:21 -04:00
										 |  |  | ## Syntax
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-11 12:50:12 +01:00
										 |  |  | ~~~ | 
					
						
							|  |  |  | kubernetes [ZONES...] | 
					
						
							|  |  |  | ~~~ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-14 09:36:06 +01:00
										 |  |  | With only the directive specified, the *kubernetes* plugin will default to the zone specified in | 
					
						
							| 
									
										
										
										
											2017-08-11 12:50:12 +01:00
										 |  |  | the server's block. It will handle all queries in that zone and connect to Kubernetes in-cluster. It | 
					
						
							| 
									
										
										
										
											2017-09-07 10:48:26 +01:00
										 |  |  | will not provide PTR records for services, or A records for pods. If **ZONES** is used it specifies | 
					
						
							| 
									
										
										
										
											2017-09-14 09:36:06 +01:00
										 |  |  | all the zones the plugin should be authoritative for. | 
					
						
							| 
									
										
										
										
											2017-08-11 12:50:12 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-01 03:20:21 -04:00
										 |  |  | ``` | 
					
						
							| 
									
										
										
										
											2017-08-11 12:50:12 +01:00
										 |  |  | kubernetes [ZONES...] { | 
					
						
							| 
									
										
										
										
											2017-08-14 08:49:26 +01:00
										 |  |  |     resyncperiod DURATION | 
					
						
							| 
									
										
										
										
											2018-01-28 16:40:10 +00:00
										 |  |  |     endpoint URL [URL...] | 
					
						
							| 
									
										
										
										
											2017-08-14 08:49:26 +01:00
										 |  |  |     tls CERT KEY CACERT | 
					
						
							| 
									
										
										
										
											2017-08-22 14:56:00 +01:00
										 |  |  |     namespaces NAMESPACE... | 
					
						
							| 
									
										
										
										
											2017-08-14 08:49:26 +01:00
										 |  |  |     labels EXPRESSION | 
					
						
							|  |  |  |     pods POD-MODE | 
					
						
							| 
									
										
										
										
											2017-11-08 08:07:10 -05:00
										 |  |  |     endpoint_pod_names | 
					
						
							| 
									
										
										
										
											2017-08-22 14:56:00 +01:00
										 |  |  |     upstream ADDRESS... | 
					
						
							| 
									
										
										
										
											2017-08-27 01:32:46 +01:00
										 |  |  |     ttl TTL | 
					
						
							| 
									
										
										
										
											2018-01-06 14:52:09 -05:00
										 |  |  |     fallthrough [ZONES...] | 
					
						
							| 
									
										
										
										
											2017-08-09 03:13:38 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-07-01 03:20:21 -04:00
										 |  |  | ``` | 
					
						
							| 
									
										
										
										
											2017-10-10 09:39:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-10 22:47:09 +01:00
										 |  |  | * `resyncperiod` specifies the Kubernetes data API **DURATION** period. | 
					
						
							| 
									
										
										
										
											2017-10-31 13:33:41 +00:00
										 |  |  | * `endpoint` specifies the **URL** for a remote k8s API endpoint. | 
					
						
							| 
									
										
										
										
											2017-08-10 22:47:09 +01:00
										 |  |  |    If omitted, it will connect to k8s in-cluster using the cluster service account. | 
					
						
							| 
									
										
										
										
											2018-01-28 16:40:10 +00:00
										 |  |  |    Multiple k8s API endpoints could be specified: | 
					
						
							|  |  |  |    `endpoint http://k8s-endpoint1:8080 http://k8s-endpoint2:8080`. CoreDNS | 
					
						
							| 
									
										
										
										
											2017-08-10 17:14:56 -07:00
										 |  |  |    will automatically perform a healthcheck and proxy to the healthy k8s API endpoint. | 
					
						
							| 
									
										
										
										
											2017-08-10 22:47:09 +01:00
										 |  |  | * `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). | 
					
						
							| 
									
										
										
										
											2017-11-08 12:08:32 -05:00
										 |  |  | * `namespaces` **NAMESPACE [NAMESPACE...]**, only exposes the k8s namespaces listed. | 
					
						
							| 
									
										
										
										
											2017-08-10 22:47:09 +01:00
										 |  |  |    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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-04 12:53:07 +00:00
										 |  |  | * `endpoint_pod_names` uses the pod name of the pod targeted by the endpoint as | 
					
						
							| 
									
										
										
										
											2017-11-08 08:07:10 -05:00
										 |  |  |    the endpoint name in A records, e.g. | 
					
						
							|  |  |  |    `endpoint-name.my-service.namespace.svc.cluster.local. in A 1.2.3.4` | 
					
						
							| 
									
										
										
										
											2018-01-04 12:53:07 +00:00
										 |  |  |    By default, the endpoint-name name selection is as follows: Use the hostname | 
					
						
							| 
									
										
										
										
											2017-11-08 08:07:10 -05:00
										 |  |  |    of the endpoint, or if hostname is not set, use the dashed form of the endpoint | 
					
						
							| 
									
										
										
										
											2017-11-08 12:08:32 -05:00
										 |  |  |    IP address (e.g. `1-2-3-4.my-service.namespace.svc.cluster.local.`) | 
					
						
							| 
									
										
										
										
											2017-11-08 08:07:10 -05:00
										 |  |  |    If this directive is included, then name selection for endpoints changes as | 
					
						
							|  |  |  |    follows: Use the hostname of the endpoint, or if hostname is not set, use the | 
					
						
							| 
									
										
										
										
											2018-01-04 12:53:07 +00:00
										 |  |  |    pod name of the pod targeted by the endpoint. If there is no pod targeted by | 
					
						
							| 
									
										
										
										
											2017-11-08 12:08:32 -05:00
										 |  |  |    the endpoint, use the dashed IP address form. | 
					
						
							| 
									
										
										
										
											2017-08-10 22:47:09 +01:00
										 |  |  | * `upstream` **ADDRESS [ADDRESS...]** defines the upstream resolvers used for resolving services | 
					
						
							| 
									
										
										
										
											2017-11-08 12:08:32 -05:00
										 |  |  |   that point to external hosts (External Services).  **ADDRESS** can be an IP, an IP:port, or a path | 
					
						
							| 
									
										
										
										
											2017-08-10 22:47:09 +01:00
										 |  |  |   to a file structured like resolv.conf. | 
					
						
							| 
									
										
										
										
											2017-08-27 01:32:46 +01:00
										 |  |  | * `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. | 
					
						
							| 
									
										
										
										
											2018-01-06 14:52:09 -05:00
										 |  |  | * `fallthrough` **[ZONES...]** If a query for a record in the zones for which the plugin is authoritative | 
					
						
							|  |  |  |   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. If **[ZONES...]** is omitted, then fallthrough happens for all zones for which the plugin | 
					
						
							|  |  |  |   is authoritative. If specific zones are listed (for example `in-addr.arpa` and `ip6.arpa`), then only | 
					
						
							|  |  |  |   queries for those zones will be subject to fallthrough. | 
					
						
							| 
									
										
										
										
											2017-07-01 03:20:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-13 09:52:40 +00:00
										 |  |  | ## Health
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This plugin implements dynamic health checking. Currently this is limited to reporting healthy when | 
					
						
							|  |  |  | the API has synced. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-01 03:20:21 -04:00
										 |  |  | ## Examples
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-24 10:16:03 +01:00
										 |  |  | Handle all queries in the `cluster.local` zone. Connect to Kubernetes in-cluster. Also handle all | 
					
						
							|  |  |  | `in-addr.arpa` `PTR` requests for `10.0.0.0/17` . 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: | 
					
						
							| 
									
										
										
										
											2017-07-01 03:20:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 10:48:26 +01:00
										 |  |  | ~~~ txt | 
					
						
							| 
									
										
										
										
											2017-10-24 10:16:03 +01:00
										 |  |  | 10.0.0.0/17 cluster.local { | 
					
						
							| 
									
										
										
										
											2017-09-07 10:48:26 +01:00
										 |  |  |     kubernetes { | 
					
						
							|  |  |  |         pods verified | 
					
						
							|  |  |  |         upstream 10.102.3.10:53 | 
					
						
							| 
									
										
										
										
											2017-08-08 05:05:34 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-09-07 10:48:26 +01:00
										 |  |  | } | 
					
						
							|  |  |  | ~~~ | 
					
						
							| 
									
										
										
										
											2017-08-08 05:05:34 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-11 10:16:43 -04:00
										 |  |  | Or you can selectively expose some namespaces: | 
					
						
							| 
									
										
										
										
											2017-07-01 03:20:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 10:48:26 +01:00
										 |  |  | ~~~ txt | 
					
						
							|  |  |  | kubernetes cluster.local { | 
					
						
							|  |  |  |     namespaces test staging | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ~~~ | 
					
						
							| 
									
										
										
										
											2017-07-01 03:20:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 10:48:26 +01:00
										 |  |  | Connect to Kubernetes with CoreDNS running outside the cluster: | 
					
						
							| 
									
										
										
										
											2017-07-01 03:20:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 10:48:26 +01:00
										 |  |  | ~~~ txt | 
					
						
							|  |  |  | kubernetes cluster.local { | 
					
						
							|  |  |  |     endpoint https://k8s-endpoint:8443 | 
					
						
							|  |  |  |     tls cert key cacert | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ~~~ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-14 09:36:06 +01:00
										 |  |  | Here we use the *proxy* plugin to implement stubDomains that forwards `example.org` and | 
					
						
							| 
									
										
										
										
											2017-09-07 10:48:26 +01:00
										 |  |  | `example.com` to another nameserver. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ~~~ txt | 
					
						
							|  |  |  | cluster.local { | 
					
						
							|  |  |  |     kubernetes { | 
					
						
							| 
									
										
										
										
											2017-08-14 08:49:26 +01:00
										 |  |  |         endpoint https://k8s-endpoint:8443 | 
					
						
							|  |  |  |         tls cert key cacert | 
					
						
							| 
									
										
										
										
											2017-08-08 05:05:34 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-09-07 10:48:26 +01:00
										 |  |  | } | 
					
						
							|  |  |  | example.org { | 
					
						
							|  |  |  |     proxy . 8.8.8.8:53 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | example.com { | 
					
						
							|  |  |  |     proxy . 8.8.8.8:53 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ~~~ | 
					
						
							| 
									
										
										
										
											2017-08-08 05:05:34 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-14 08:49:26 +01:00
										 |  |  | ## AutoPath
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-14 09:36:06 +01:00
										 |  |  | The *kubernetes* plugin can be used in conjunction with the *autopath* plugin.  Using this | 
					
						
							| 
									
										
										
										
											2017-08-14 08:49:26 +01:00
										 |  |  | 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 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-07-01 03:20:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-14 08:49:26 +01:00
										 |  |  | ## Federation
 | 
					
						
							| 
									
										
										
										
											2017-07-01 03:20:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-14 09:36:06 +01:00
										 |  |  | The *kubernetes* plugin can be used in conjunction with the *federation* plugin.  Using this | 
					
						
							| 
									
										
										
										
											2017-08-14 08:49:26 +01:00
										 |  |  | feature enables serving federated domains from the kubernetes clusters. | 
					
						
							| 
									
										
										
										
											2017-08-11 11:25:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-14 08:49:26 +01:00
										 |  |  |     cluster.local { | 
					
						
							|  |  |  |         federation { | 
					
						
							|  |  |  |             fallthrough | 
					
						
							|  |  |  |             prod prod.example.org | 
					
						
							|  |  |  |             staging staging.example.org | 
					
						
							| 
									
										
										
										
											2017-08-11 11:25:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-14 08:49:26 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |         kubernetes | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-08-11 11:25:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-14 08:49:26 +01:00
										 |  |  | ## Wildcards
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-11 12:50:12 +01:00
										 |  |  | 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: | 
					
						
							| 
									
										
										
										
											2017-07-01 03:20:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-04 12:53:07 +00:00
										 |  |  |  * _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.` |