diff options
Diffstat (limited to 'middleware/kubernetes/README.md')
-rw-r--r-- | middleware/kubernetes/README.md | 129 |
1 files changed, 96 insertions, 33 deletions
diff --git a/middleware/kubernetes/README.md b/middleware/kubernetes/README.md index 7e2e42dc2..c5ba32f72 100644 --- a/middleware/kubernetes/README.md +++ b/middleware/kubernetes/README.md @@ -14,7 +14,7 @@ are constructed as "myservice.mynamespace.coredns.local" where: kubernetes [zones...] ~~~ -* `zones` zones kubernetes should be authorative for. +* `zones` zones kubernetes should be authorative for. Overlapping zones are ignored. ~~~ @@ -88,7 +88,7 @@ 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: -`curl -sSL "http://storage.googleapis.com/kubernetes-release/release/v1.2.4/bin/linux/amd64/kubectl" +`curl -sSL "http://storage.googleapis.com/kubernetes-release/release/v1.2.4/bin/linux/amd64/kubectl"` The following `setup_kubectl.sh` script can be stored in the same directory as kubectl to setup @@ -248,37 +248,100 @@ return the IP addresses for all services with "nginx" in the service name. TBD: * How does this relate the the k8s load-balancer configuration? * Do wildcards search across namespaces? -* Initial implementation assumes that a namespace maps to the first DNS label below the zone managed by the kubernetes middleware. This assumption may need to be revised. +* Initial implementation assumes that a namespace maps to the first DNS label + below the zone managed by the kubernetes middleware. This assumption may + need to be revised. ## TODO -* Implement namespace filtering to different zones. -* Implement IP selection and ordering (internal/external). -* Implement SRV-record queries using naive lookup. -* 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.) -* Do we need to generate synthetic zone records for namespaces? -* Implement wildcard-based lookup. -* Improve lookup to reduce size of query result obtained from k8s API. - (namespace-based?, other ideas?) -* How to support label specification in Corefile to allow use of labels to - indicate zone? (Is this even useful?) For example, the following 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 - label "environment" : "staging", "tenant" : "customerB" -} -~~~ - -* 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. -* DNS response caching is good, but we should also cache at the http query - level as well. (Take a look at https://github.com/patrickmn/go-cache as - a potential expiring cache implementation for the http API queries.) - +* 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.) + * Expose load-balancer IP addresses. + * Calculate SRV priority based on number of instances running. + (See SkyDNS README.md) + * Functional work + * Implement wildcard-based lookup. Minimally support `*`, consider `?` as well. + * Note from Miek on PR 181: "SkyDNS also supports the word `any`. + * 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 + * 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?) + * Caching of k8s API dataset. + * DNS response caching is good, but we should also cache at the http query + level as well. (Take a look at https://github.com/patrickmn/go-cache as + a potential expiring cache implementation for the http API queries.) + * Push notifications from k8s for data changes rather than pull via API? +* Additional features: + * Implement namespace filtering to different zones. That is, zone "a.b" + publishes services from namespace "foo", and zone "x.y" publishes services + from namespaces "bar" and "baz". (Basic version implemented -- need test cases.) + * Reverse IN-ADDR entries for services. (Is there any value in supporting + reverse lookup records? + * How to support label specification in Corefile to allow use of labels to + indicate zone? (Is this even useful?) For example, the following + 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 + label "environment" : "staging", "tenant" : "customerB" + } + + Note: label specification/selection is a killer feature for segmenting + test vs staging vs prod environments. + * 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? + * Support custom user-provided templates for k8s names. A string provided + in the middleware configuration like `{service}.{namespace}.{type}` defines + the template of how to construct record names for the zone. This example + would produce `myservice.mynamespace.svc.cluster.local`. (Basic template + implemented. Need to slice zone out of current template implementation.) +* 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 + * ~~Implement test cases for http data parsing using dependency injection + for http get operations.~~ + * 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 + pre-loaded k8s API cache. + * Automate integration testing with kubernetes. |