aboutsummaryrefslogtreecommitdiff
path: root/middleware/kubernetes/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'middleware/kubernetes/README.md')
-rw-r--r--middleware/kubernetes/README.md129
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.