| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | # kubernetes
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-10 20:13:22 +01:00
										 |  |  | *kubernetes* enables reading zone data from a kubernetes cluster. Record names | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | are constructed as "myservice.mynamespace.coredns.local" where: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-25 07:35:09 +01:00
										 |  |  | * "myservice" is the name of the k8s service (this may include multiple DNS labels, | 
					
						
							| 
									
										
										
										
											2016-08-16 09:12:52 -07:00
										 |  |  |   such as "c1.myservice"), | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | * "mynamespace" is the k8s namespace for the service, and | 
					
						
							|  |  |  | * "coredns.local" is the zone configured for `kubernetes`. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-14 14:50:14 -07:00
										 |  |  | The record name format can be changed by specifying a name template in the Corefile. | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | ## Syntax
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ~~~ | 
					
						
							| 
									
										
										
										
											2016-10-10 20:13:22 +01:00
										 |  |  | kubernetes [ZONES...] | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | ~~~ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-10 20:13:22 +01:00
										 |  |  | * `ZONES` zones kubernetes should be authorative for. Overlapping zones are ignored. | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-10 20:13:22 +01:00
										 |  |  | Or if you want to specify an endpoint: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | ~~~ | 
					
						
							| 
									
										
										
										
											2016-10-10 20:13:22 +01:00
										 |  |  | kubernetes [ZONES...] { | 
					
						
							|  |  |  |     endpoint ENDPOINT | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | } | 
					
						
							|  |  |  | ~~~ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-10 20:13:22 +01:00
										 |  |  | * **ENDPOINT** the kubernetes API endpoint, defaults to http://localhost:8080 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TODO(...): Add all the other options. | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | ## Examples
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This is the default kubernetes setup, with everything specified in full: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ~~~ | 
					
						
							|  |  |  | # Serve on port 53
 | 
					
						
							|  |  |  | .:53 { | 
					
						
							|  |  |  |     # use kubernetes middleware for domain "coredns.local" | 
					
						
							|  |  |  |     kubernetes coredns.local { | 
					
						
							| 
									
										
										
										
											2016-08-08 14:30:04 -07:00
										 |  |  |         # Kubernetes data API resync period | 
					
						
							|  |  |  |         # Example values: 60s, 5m, 1h | 
					
						
							|  |  |  |         resyncperiod 5m | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  |         # Use url for k8s API endpoint | 
					
						
							| 
									
										
										
										
											2016-09-23 18:07:06 -04:00
										 |  |  |         endpoint https://k8sendpoint:8080 | 
					
						
							| 
									
										
										
										
											2016-10-10 20:13:22 +01:00
										 |  |  |         # The tls cert, key and the CA cert filenames | 
					
						
							|  |  |  |         tls cert key cacert | 
					
						
							| 
									
										
										
										
											2016-07-14 14:50:14 -07:00
										 |  |  |         # Assemble k8s record names with the template | 
					
						
							|  |  |  |         template {service}.{namespace}.{zone} | 
					
						
							|  |  |  |         # Only expose the k8s namespace "demo" | 
					
						
							|  |  |  |         namespaces demo | 
					
						
							| 
									
										
										
										
											2016-08-12 20:44:08 -07:00
										 |  |  |         # Only expose the records for kubernetes objects | 
					
						
							| 
									
										
										
										
											2016-08-22 14:24:02 -07:00
										 |  |  |         # that match this label selector. The label | 
					
						
							| 
									
										
										
										
											2016-08-12 20:44:08 -07:00
										 |  |  |         # selector syntax is described in the kubernetes | 
					
						
							|  |  |  |         # API documentation: http://kubernetes.io/docs/user-guide/labels/ | 
					
						
							|  |  |  |         # Example selector below only exposes objects tagged as | 
					
						
							|  |  |  |         # "application=nginx" in the staging or qa environments. | 
					
						
							| 
									
										
										
										
											2016-08-16 09:12:52 -07:00
										 |  |  |         labels environment in (staging, qa),application=nginx | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-08-08 14:30:04 -07:00
										 |  |  |     # Perform DNS response caching for the coredns.local zone | 
					
						
							| 
									
										
										
										
											2016-08-22 14:24:02 -07:00
										 |  |  |     # Cache timeout is specified by an integer in seconds | 
					
						
							| 
									
										
										
										
											2016-08-08 14:30:04 -07:00
										 |  |  |     #cache 180 coredns.local | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | } | 
					
						
							|  |  |  | ~~~ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 20:44:08 -07:00
										 |  |  | Defaults: | 
					
						
							| 
									
										
										
										
											2016-08-08 14:30:04 -07:00
										 |  |  | * If the `namespaces` keyword is omitted, all kubernetes namespaces are exposed. | 
					
						
							|  |  |  | * If the `template` keyword is omitted, the default template of "{service}.{namespace}.{zone}" is used. | 
					
						
							|  |  |  | * If the `resyncperiod` keyword is omitted, the default resync period is 5 minutes. | 
					
						
							| 
									
										
										
										
											2016-08-22 14:24:02 -07:00
										 |  |  | * The `labels` keyword is only used when filtering results based on kubernetes label selector syntax | 
					
						
							| 
									
										
										
										
											2016-08-25 07:35:09 +01:00
										 |  |  |   is required. The label selector syntax is described in the kubernetes API documentation at: | 
					
						
							| 
									
										
										
										
											2016-08-12 20:44:08 -07:00
										 |  |  |   http://kubernetes.io/docs/user-guide/labels/ | 
					
						
							| 
									
										
										
										
											2016-08-08 14:30:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-10 20:13:22 +01:00
										 |  |  | ### Template Syntax
 | 
					
						
							| 
									
										
										
										
											2016-08-16 09:12:52 -07:00
										 |  |  | Record name templates can be constructed using the symbolic elements: | 
					
						
							| 
									
										
										
										
											2016-10-10 20:13:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-16 09:12:52 -07:00
										 |  |  | | template symbol | description                                                         | | 
					
						
							|  |  |  | | `{service}`     | Kubernetes object/service name.                                     | | 
					
						
							|  |  |  | | `{namespace}`   | The kubernetes namespace.                                           | | 
					
						
							|  |  |  | | `{type}`        | The type of the kubernetes object. Supports values 'svc' and 'pod'. | | 
					
						
							|  |  |  | | `{zone}`        | The zone configured for the kubernetes middleware.                  | | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | ### Basic Setup
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #### Launch Kubernetes
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-10 20:13:22 +01:00
										 |  |  | Kubernetes is launched using the commands in the `.travis/kubernetes/00_run_k8s.sh` script. | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-10 20:13:22 +01:00
										 |  |  | #### Configure kubectl and Test
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | The kubernetes control client can be downloaded from the generic URL: | 
					
						
							|  |  |  | `http://storage.googleapis.com/kubernetes-release/release/${K8S_VERSION}/bin/${GOOS}/${GOARCH}/${K8S_BINARY}` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For example, the kubectl client for Linux can be downloaded using the command: | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | `curl -sSL "http://storage.googleapis.com/kubernetes-release/release/v1.2.4/bin/linux/amd64/kubectl"` | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-25 07:35:09 +01:00
										 |  |  | The `contrib/kubernetes/testscripts/10_setup_kubectl.sh` script can be stored in the same directory as | 
					
						
							| 
									
										
										
										
											2016-08-16 09:12:52 -07:00
										 |  |  | kubectl to setup kubectl to communicate with kubernetes running on the localhost. | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #### Launch a kubernetes service and expose the service
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The following commands will create a kubernetes namespace "demo", | 
					
						
							|  |  |  | launch an nginx service in the namespace, and expose the service on port 80: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ~~~ | 
					
						
							|  |  |  | $ ./kubectl create namespace demo | 
					
						
							|  |  |  | $ ./kubectl get namespace | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $ ./kubectl run mynginx --namespace=demo --image=nginx | 
					
						
							| 
									
										
										
										
											2016-07-29 13:03:51 +01:00
										 |  |  | $ ./kubectl get deployment --namespace=demo | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | $ ./kubectl expose deployment mynginx --namespace=demo --port=80 | 
					
						
							|  |  |  | $ ./kubectl get service --namespace=demo | 
					
						
							|  |  |  | ~~~ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-10 20:13:22 +01:00
										 |  |  | The script `.travis/kubernetes/20_setup_k8s_services.sh` creates a couple of sample namespaces | 
					
						
							| 
									
										
										
										
											2016-08-25 07:35:09 +01:00
										 |  |  | with services running in those namespaces. The automated kubernetes integration tests in | 
					
						
							| 
									
										
										
										
											2016-08-16 09:12:52 -07:00
										 |  |  | `test/kubernetes_test.go` depend on these services and namespaces to exist in kubernetes. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #### Launch CoreDNS
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-25 07:35:09 +01:00
										 |  |  | Build CoreDNS and launch using this configuration file: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ~~~ txt | 
					
						
							|  |  |  | # Serve on port 53
 | 
					
						
							|  |  |  | .:53 { | 
					
						
							|  |  |  |     kubernetes coredns.local { | 
					
						
							| 
									
										
										
										
											2016-10-10 20:13:22 +01:00
										 |  |  |         resyncperiod 5m | 
					
						
							| 
									
										
										
										
											2016-08-25 07:35:09 +01:00
										 |  |  |         endpoint http://localhost:8080 | 
					
						
							|  |  |  |         template {service}.{namespace}.{zone} | 
					
						
							|  |  |  |         namespaces demo | 
					
						
							|  |  |  |         # Only expose the records for kubernetes objects | 
					
						
							|  |  |  |         # that matches this label selector.  | 
					
						
							|  |  |  |         # See http://kubernetes.io/docs/user-guide/labels/ | 
					
						
							|  |  |  |         # Example selector below only exposes objects tagged as | 
					
						
							|  |  |  |         # "application=nginx" in the staging or qa environments. | 
					
						
							|  |  |  |         #labels environment in (staging, qa),application=nginx | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     #cache 180 coredns.local # optionally enable caching | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ~~~ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Put it in `~/k8sCorefile` for instance. This configuration file sets up CoreDNS to use the zone | 
					
						
							|  |  |  | `coredns.local` for the kubernetes services. | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | The command to launch CoreDNS is: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ~~~ | 
					
						
							| 
									
										
										
										
											2016-08-25 07:35:09 +01:00
										 |  |  | $ ./coredns -conf ~/k8sCorefile | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | ~~~ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-22 14:24:02 -07:00
										 |  |  | In a separate terminal a DNS query can be issued using dig: | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | ~~~ | 
					
						
							|  |  |  | $ dig @localhost mynginx.demo.coredns.local | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47614 | 
					
						
							|  |  |  | ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ;; OPT PSEUDOSECTION: | 
					
						
							|  |  |  | ; EDNS: version: 0, flags:; udp: 4096 | 
					
						
							|  |  |  | ;; QUESTION SECTION: | 
					
						
							|  |  |  | ;mynginx.demo.coredns.local.    IN  A | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ;; ANSWER SECTION: | 
					
						
							|  |  |  | mynginx.demo.coredns.local. 0   IN  A   10.0.0.10 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ;; Query time: 2 msec | 
					
						
							|  |  |  | ;; SERVER: ::1#53(::1) | 
					
						
							|  |  |  | ;; WHEN: Thu Jun 02 11:07:18 PDT 2016 | 
					
						
							|  |  |  | ;; MSG SIZE  rcvd: 71 | 
					
						
							|  |  |  | ~~~ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-10 20:13:22 +01:00
										 |  |  | TODO(miek|...): below this line file bugs or issues and cleanup: | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | ## Implementation Notes/Ideas
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 20:44:08 -07:00
										 |  |  | ### Basic Zone Mapping
 | 
					
						
							| 
									
										
										
										
											2016-08-25 07:35:09 +01:00
										 |  |  | The middleware is configured with a "zone" string. For | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | example: "zone = coredns.local". | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-25 07:35:09 +01:00
										 |  |  | The Kubernetes service "myservice" running in "mynamespace" would map | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | to: "myservice.mynamespace.coredns.local". | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The middleware should publish an A record for that service and a service record. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-12 20:44:08 -07:00
										 |  |  | If multiple zone names are specified, the records for kubernetes objects are | 
					
						
							|  |  |  | exposed in all listed zones. | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | For example: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Serve on port 53 | 
					
						
							|  |  |  |     .:53 { | 
					
						
							|  |  |  |         # use kubernetes middleware for domain "coredns.local" | 
					
						
							|  |  |  |         kubernetes coredns.local { | 
					
						
							|  |  |  |             # Use url for k8s API endpoint | 
					
						
							|  |  |  |             endpoint http://localhost:8080 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         # Perform DNS response caching for the coredns.local zone | 
					
						
							| 
									
										
										
										
											2016-08-22 14:24:02 -07:00
										 |  |  |         # Cache timeout is specified by an integer argument in seconds | 
					
						
							|  |  |  |         # (This works for the kubernetes middleware.) | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  |         #cache 20 coredns.local | 
					
						
							|  |  |  |         #cache 160 coredns.local | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Internal IP or External IP?
 | 
					
						
							|  |  |  | * Should the Corefile configuration allow control over whether the internal IP or external IP is exposed? | 
					
						
							| 
									
										
										
										
											2016-08-22 14:24:02 -07:00
										 |  |  | * If the Corefile configuration allows control over internal IP or external IP, then the config should allow users to control the precedence. | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | For example a service "myservice" running in namespace "mynamespace" with internal IP "10.0.0.100" and external IP "1.2.3.4". | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This example could be published as: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | Corefile directive           | Result              | | 
					
						
							|  |  |  | |------------------------------|---------------------| | 
					
						
							|  |  |  | | iporder = internal           | 10.0.0.100          | | 
					
						
							|  |  |  | | iporder = external           | 1.2.3.4             | | 
					
						
							|  |  |  | | iporder = external, internal | 10.0.0.100, 1.2.3.4 | | 
					
						
							|  |  |  | | iporder = internal, external | 1.2.3.4, 10.0.0.100 | | 
					
						
							|  |  |  | | _no directive_               | 10.0.0.100, 1.2.3.4 | | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Wildcards
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Publishing DNS records for singleton services isn't very interesting. Service | 
					
						
							| 
									
										
										
										
											2016-08-22 14:24:02 -07:00
										 |  |  | names are unique within a k8s namespace, therefore multiple services will be | 
					
						
							| 
									
										
										
										
											2016-06-06 12:49:53 -07:00
										 |  |  | commonly run with a structured naming scheme. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For example, running multiple nginx services under the names: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | Service name | | 
					
						
							|  |  |  | |--------------| | 
					
						
							|  |  |  | | c1.nginx     | | 
					
						
							|  |  |  | | c2.nginx     | | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | or: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | | Service name | | 
					
						
							|  |  |  | |--------------| | 
					
						
							|  |  |  | | nginx.c3     | | 
					
						
							|  |  |  | | nginx.c4     | | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | A DNS query with wildcard support for "nginx" in these examples should | 
					
						
							|  |  |  | return the IP addresses for all services with "nginx" in the service name. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TBD: | 
					
						
							|  |  |  | * How does this relate the the k8s load-balancer configuration? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## TODO
 | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | * SkyDNS compatibility/equivalency: | 
					
						
							|  |  |  | 	* Kubernetes packaging and execution | 
					
						
							|  |  |  | 		* Automate packaging to allow executing in Kubernetes. That is, add Docker | 
					
						
							|  |  |  | 		  container build as target in Makefile. Also include anything else needed | 
					
						
							|  |  |  | 		  to simplify launch as the k8s DNS service. | 
					
						
							|  |  |  | 		  Note: Dockerfile already exists in coredns repo to build the docker image. | 
					
						
							|  |  |  | 		  This work item should identify how to pass configuration and run as a SkyDNS | 
					
						
							|  |  |  | 		  replacement. | 
					
						
							|  |  |  | 		* Identify any kubernetes changes necessary to use coredns as k8s DNS server. That is, | 
					
						
							|  |  |  | 		  how do we consume the "--cluster-dns=" and "--cluster-domain=" arguments. | 
					
						
							|  |  |  | 		* Work out how to pass CoreDNS configuration via kubectl command line and yaml | 
					
						
							|  |  |  | 		  service definition file. | 
					
						
							|  |  |  | 		* Ensure that resolver in each kubernetes container is configured to use | 
					
						
							|  |  |  | 		  coredns instance. | 
					
						
							|  |  |  | 		* Update kubernetes middleware documentation to describe running CoreDNS as a | 
					
						
							|  |  |  | 		  SkyDNS replacement. (Include descriptions of different ways to pass CoreFile | 
					
						
							|  |  |  | 		  to coredns command.) | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 		* Remove dependency on healthz for health checking in | 
					
						
							|  |  |  | 		  `kubernetes-rc.yaml` file. | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 		* Expose load-balancer IP addresses. | 
					
						
							|  |  |  | 		* Calculate SRV priority based on number of instances running. | 
					
						
							|  |  |  | 		  (See SkyDNS README.md) | 
					
						
							|  |  |  | 	* Functional work | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 		* (done. '?' not supported yet) ~~Implement wildcard-based lookup. Minimally support `*`, consider `?` as well.~~ | 
					
						
							| 
									
										
										
										
											2016-07-18 10:47:36 -07:00
										 |  |  |         * (done) ~~Note from Miek on PR 181: "SkyDNS also supports the word `any`.~~ | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 		* Implement SkyDNS-style synthetic zones such as "svc" to group k8s objects. (This | 
					
						
							|  |  |  | 		  should be optional behavior.) Also look at "pod" synthetic zones. | 
					
						
							|  |  |  | 		* Implement test cases for SkyDNS equivalent functionality. | 
					
						
							|  |  |  | 	* SkyDNS functionality, as listed in SkyDNS README: https://github.com/kubernetes/kubernetes/blob/release-1.2/cluster/addons/dns/README.md | 
					
						
							| 
									
										
										
										
											2016-07-18 10:47:36 -07:00
										 |  |  | 		* Expose pods and srv objects. | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 		* A records in form of `pod-ip-address.my-namespace.cluster.local`. | 
					
						
							|  |  |  | 		  For example, a pod with ip `1.2.3.4` in the namespace `default` | 
					
						
							|  |  |  | 		  with a dns name of `cluster.local` would have an entry: | 
					
						
							|  |  |  | 		  `1-2-3-4.default.pod.cluster.local`. | 
					
						
							|  |  |  | 		* SRV records in form of | 
					
						
							|  |  |  | 		  `_my-port-name._my-port-protocol.my-namespace.svc.cluster.local` | 
					
						
							|  |  |  | 		  CNAME records for both regular services and headless services. | 
					
						
							|  |  |  | 		  See SkyDNS README. | 
					
						
							|  |  |  | 		* A Records and hostname Based on Pod Annotations (k8s beta 1.2 feature). | 
					
						
							|  |  |  | 		  See SkyDNS README. | 
					
						
							|  |  |  | 		* Note: the embedded IP and embedded port record names are weird. I | 
					
						
							|  |  |  | 		  would need to know the IP/port in order to create the query to lookup | 
					
						
							|  |  |  | 		  the name. Presumably these are intended for wildcard queries. | 
					
						
							|  |  |  | 	* Performance | 
					
						
							|  |  |  | 		* Improve lookup to reduce size of query result obtained from k8s API. | 
					
						
							|  |  |  | 		  (namespace-based?, other ideas?) | 
					
						
							|  |  |  | * Additional features: | 
					
						
							| 
									
										
										
										
											2016-08-25 07:35:09 +01:00
										 |  |  | 	* Reverse IN-ADDR entries for services. (Is there any value in supporting | 
					
						
							| 
									
										
										
										
											2016-08-08 14:30:04 -07:00
										 |  |  | 	  reverse lookup records?) (need tests, functionality should work based on @aledbf's code.) | 
					
						
							| 
									
										
										
										
											2016-08-25 07:35:09 +01:00
										 |  |  | 	* (done) ~~How to support label specification in Corefile to allow use of labels to | 
					
						
							| 
									
										
										
										
											2016-08-12 20:44:08 -07:00
										 |  |  | 	  indicate zone? For example, the following | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	  configuration exposes all services labeled for the "staging" environment | 
					
						
							|  |  |  | 	  and tenant "customerB" in the zone "customerB.stage.local": | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			kubernetes customerB.stage.local { | 
					
						
							|  |  |  | 				# Use url for k8s API endpoint | 
					
						
							|  |  |  | 				endpoint http://localhost:8080 | 
					
						
							| 
									
										
										
										
											2016-08-12 20:44:08 -07:00
										 |  |  | 				labels environment in (staging),tenant=customerB | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	  Note: label specification/selection is a killer feature for segmenting | 
					
						
							| 
									
										
										
										
											2016-08-12 20:44:08 -07:00
										 |  |  | 	  test vs staging vs prod environments.~~ Need label testing. | 
					
						
							| 
									
										
										
										
											2016-07-07 01:40:58 -07:00
										 |  |  | 	* Implement IP selection and ordering (internal/external). Related to | 
					
						
							|  |  |  | 	  wildcards and SkyDNS use of CNAMES. | 
					
						
							|  |  |  | 	* Flatten service and namespace names to valid DNS characters. (service names | 
					
						
							|  |  |  | 	  and namespace names in k8s may use uppercase and non-DNS characters. Implement | 
					
						
							|  |  |  | 	  flattening to lower case and mapping of non-DNS characters to DNS characters | 
					
						
							|  |  |  | 	  in a standard way.) | 
					
						
							|  |  |  | 	* Expose arbitrary kubernetes repository data as TXT records? | 
					
						
							|  |  |  | * DNS Correctness | 
					
						
							|  |  |  | 	* Do we need to generate synthetic zone records for namespaces? | 
					
						
							|  |  |  | 	* Do we need to generate synthetic zone records for the skydns synthetic zones? | 
					
						
							|  |  |  | * Test cases | 
					
						
							|  |  |  | 	* Test with CoreDNS caching. CoreDNS caching for DNS response is working | 
					
						
							|  |  |  | 	  using the `cache` directive. Tested working using 20s cache timeout | 
					
						
							|  |  |  | 	  and A-record queries. Automate testing with cache in place. | 
					
						
							|  |  |  | 	* Automate CoreDNS performance tests. Initially for zone files, and for | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	  pre-loaded k8s API cache. With and without CoreDNS response caching. | 
					
						
							| 
									
										
										
										
											2016-07-27 10:01:24 -07:00
										 |  |  |     * Try to get rid of kubernetes launch scripts by moving operations into | 
					
						
							|  |  |  |       .travis.yml file. | 
					
						
							| 
									
										
										
										
											2016-08-22 23:15:21 -07:00
										 |  |  |     * Find root cause of timing condition that results in no data returned to | 
					
						
							|  |  |  |       test client when running k8s integration tests. Current work-around is a | 
					
						
							|  |  |  |       nasty hack of waiting 5 seconds after setting up test server before performing | 
					
						
							|  |  |  |       client calls. (See hack in test/kubernetes_test.go) |