mirror of
https://github.com/coredns/coredns.git
synced 2025-10-31 18:23:13 -04:00
k8s middleware cleanup, testcases, basic SRV (#181)
* Removing unnecessary gitignore pattern
* Updating Makefile to run unittests for subpackages
* Adding Corefile validation to ignore overlapping zones
* Fixing SRV query handling
* Updating README.md now that SRV works
* Fixing debug message, adding code comment
* Clarifying implementation of zone normalization
* "Overlapping zones" is ill-defined. Reimplemented zone overlap/subzone
checking to contain these functions in k8s middleware and provide
better code comments explaining the normalization.
* Separate build verbosity from test verbosity
* Cleaning up comments to match repo code style
* Merging warning messages into single message
* Moving function docs to before function declaration
* Adding test cases for k8sclient connector
* Tests cover connector create and setting base url
* Fixed bugs in connector create and setting base url functions
* Updaing README to group and order development work
* Priority focused on achieving functional parity with SkyDNS.
* Adding work items to README and cleaning up formatting
* More README format cleaning
* List formating
* Refactoring k8s API call to allow dependency injection
* Add test cases for data parsing from k8s into dataobject structures
* URL is dependency-injected to allow replacement with a mock http
server during test execution
* Adding more data validation for JSON parsing tests
* Adding test case for GetResourceList()
* Adding notes about SkyDNS embedded IP and port record names
* Marked test case implemented.
* Fixing formatting for example command.
* Fixing formatting
* Adding notes about Docker image building.
* Adding SkyDNS work item
* Updating TODO list
* Adding name template to Corefile to specify how k8s record names are assembled
* Adding template support for multi-segment zones
* Updating example CoreFile for k8s with template comment
* Misc whitespace cleanup
* Adding SkyDNS naming notes
* Adding namespace filtering to CoreFile config
* Updating example k8sCoreFile to specify namespaces
* Removing unused codepath
* Adding check for valid namespace
* More README TODO restructuring to focus effort
* Adding template validation while parsing CoreFile
* Record name template is considered invalid if it contains a symbol of the form ${bar} where the symbol
"${bar}" is not an accepted template symbol.
* Refactoring generation of answer records
* Parse typeName out of query string
* Refactor answer record creation as operation over list of ServiceItems
* Moving k8s API caching into SkyDNS equivalency segment
* Adding function to assemble record names from template
* Warning: This commit may be broken. Syncing to get laptop code over to dev machine.
* More todo notes
* Adding comment describing sample test data.
* Update k8sCorefile
* Adding comment
* Adding filtering support for kubernetes "type"
* Required refactoring to support reuse of the StringInSlice function.
* Cleaning up formatting
* Adding note about SkyDNS supporting word "any".
* baseUrl -> baseURL
* Also removed debug statement from core/setup/kubernetes.go
* Fixing test breaking from Url -> URL naming changes
* Changing record name template language ${...} -> {...}
* Fix formatting with go fmt
* Updating all k8sclient data getters to return error value
* Adding error message to k8sclient data accessors
* Cleaning up setup for kubernetes
* Removed verbose nils in initial k8s middleware instance
* Set reasonable defaults if CoreFile has no parameters in the
kubernetes block. (k8s endpoint, and name template)
* Formatting cleanup -- go fmt
This commit is contained in:
committed by
Miek Gieben
parent
558c34a23e
commit
289f53d386
@@ -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":
|
||||
* 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"
|
||||
}
|
||||
~~~
|
||||
|
||||
* 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.)
|
||||
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.
|
||||
|
||||
Reference in New Issue
Block a user