mirror of
https://github.com/hanzoai/dns.git
synced 2026-10-30 18:40:55 +00:00
* Bump version to 1.14.2 (#7895) This PR bumps version to 1.14.2, as part of the release. Related to 7883 Signed-off-by: Yong Tang <[email protected]> * plugin/reload: Allow disabling jitter with 0s (#7896) This PR fixes #7894 by allowing reload 2s 0s as documented. Signed-off-by: Yong Tang <[email protected]> * Bump golang to 1.26.1 (#7902) * Update release note for upcoming 1.14.2 (#7897) * fix: release date for v1.14.2 notes (#7906) Updated release date for CoreDNS 1.14.2 to match the actual release date. This causes issues when rendering the coredns.io website. Signed-off-by: Ville Vesilehto <[email protected]> * chore(lint): bump golangci-lint to v2.11.1 (#7905) - Added nolint to plugin/auto/walk.go to avoid a symlink/TOCTOU warning, as it needs to follow symlink. - Replaced a few flagged integer conversions with safe equivalents in cache hashing, reuseport socket setup, and TLS arg handling - Preallocated response rule slices in plugin/rewrite/name.go - Replaced WriteString(fmt.Sprintf/Sprintln(...)) with direct fmt.Fprint* calls - Removed stale nolint directives from code and tests that are no longer needed Signed-off-by: Ville Vesilehto <[email protected]> * feat(secondary): Send NOTIFY messages after zone transfer (#7901) * feat(secondary): Send NOTIFY messages after zone transfer - Modified TransferIn() method to accept a transfer.Transfer parameter - Added NOTIFY message sending after successful zone transfer in secondary plugin - Updated Update() method to pass the transfer handler through the zone update cycle - Added comprehensive tests for the secondary notify functionality Closes #5669 Signed-off-by: liucongran <[email protected]> * fix(secondary): Fix TransferIn method call in test Update test to pass nil parameter to TransferIn method after signature change Signed-off-by: liucongran <[email protected]> * refactor(secondary): Clean up imports and add helper methods - Reorder imports for consistency - Add hasSOA() and getSOA() helper methods to Zone - Remove unnecessary blank lines in tests Signed-off-by: liucongran <[email protected]> * fix(test): Fix variable declaration in secondary test Change corefile variable assignment to use short declaration syntax (:=) to fix compilation error. Signed-off-by: liucongran <[email protected]> * refactor(secondary): Use getSOA helper method in shouldTransfer Replace direct SOA access with getSOA() helper method for consistency. Signed-off-by: liucongran <[email protected]> --------- Signed-off-by: liucongran <[email protected]> Co-authored-by: liucongran <[email protected]> * build(deps): bump github/codeql-action from 4.32.5 to 4.32.6 (#7911) * build(deps): bump docker/login-action from 3.7.0 to 4.0.0 (#7908) * build(deps): bump actions/dependency-review-action from 4.8.3 to 4.9.0 (#7909) * build(deps): bump github.com/aws/aws-sdk-go-v2/service/secretsmanager (#7920) * build(deps): bump google.golang.org/grpc from 1.79.1 to 1.79.2 (#7916) * build(deps): bump aquasecurity/trivy-action from 0.34.1 to 0.35.0 (#7910) * build(deps): bump k8s.io/klog/v2 in the k8s-io group (#7912) * build(deps): bump golang.org/x/sys from 0.41.0 to 0.42.0 (#7913) Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.41.0 to 0.42.0. - [Commits](https://github.com/golang/sys/compare/v0.41.0...v0.42.0) --- updated-dependencies: - dependency-name: golang.org/x/sys dependency-version: 0.42.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> * build(deps): bump sigs.k8s.io/mcs-api from 0.3.0 to 0.4.0 (#7919) Bumps [sigs.k8s.io/mcs-api](https://github.com/kubernetes-sigs/mcs-api) from 0.3.0 to 0.4.0. - [Release notes](https://github.com/kubernetes-sigs/mcs-api/releases) - [Changelog](https://github.com/kubernetes-sigs/mcs-api/blob/master/RELEASE.md) - [Commits](https://github.com/kubernetes-sigs/mcs-api/compare/v0.3.0...v0.4.0) --- updated-dependencies: - dependency-name: sigs.k8s.io/mcs-api dependency-version: 0.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> * build(deps): bump github.com/aws/aws-sdk-go-v2/service/route53 (#7917) Bumps [github.com/aws/aws-sdk-go-v2/service/route53](https://github.com/aws/aws-sdk-go-v2) from 1.62.2 to 1.62.3. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/fsx/v1.62.2...service/fsx/v1.62.3) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/route53 dependency-version: 1.62.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> * plugin/forward: add max_age option to enforce an absolute connection lifetime (#7903) * plugin/pkg/proxy: add max_age for per-connection lifetime cap Introduce a max_age setting on Transport that closes connections based on creation time, independent of idle-timeout (expire). Background: PR #7790 changed the connection pool from LIFO to FIFO for source-port diversity. Under FIFO, every connection is cycled through the pool and its used timestamp is refreshed continuously. When request rate is high enough that pool_size / request_rate < expire, no connection ever becomes idle and expire never fires. This prevents CoreDNS from opening new connections to upstreams that scale out (e.g. new Kubernetes pods behind a ClusterIP service with conntrack pinning). max_age addresses this by enforcing an absolute upper bound on connection lifetime regardless of activity: - persistConn gains a created field set at dial time. - Transport gains maxAge (default 0 = unlimited, preserving existing behaviour). - Dial(): rejects cached connections whose creation age exceeds max_age. - cleanup(): when maxAge > 0, uses a linear scan over both idle-timeout and max-age predicates; when maxAge == 0, preserves the original binary-search path on used time (sorted by FIFO insertion order). - Both hot paths pre-compute the deadline outside any inner loop to avoid repeated time.Now() calls. Tests added: - TestMaxAgeExpireByCreation: connection with old created but fresh used must be rejected even though idle-timeout would pass. - TestMaxAgeFIFORotation: three FIFO-rotated connections (old created, fresh used) must all be rejected, confirming that continuous rotation cannot prevent max-age expiry. Signed-off-by: cangming <[email protected]> * plugin/forward: add max_age option Expose Transport.SetMaxAge through the forward plugin so operators can set an absolute upper bound on connection lifetime via the Corefile. Usage: forward . 1.2.3.4 { max_age 30s } Default is 0 (unlimited), which preserves existing behaviour. A positive value causes connections older than max_age to be closed and re-dialled on the next request, ensuring CoreDNS reconnects to newly scaled-out upstream pods even under sustained load where the idle timeout (expire) would never fire. If max_age is set, it must not be less than expire; the parser rejects this combination at startup with a clear error message. Signed-off-by: cangming <[email protected]> --------- Signed-off-by: cangming <[email protected]> * build(deps): bump github.com/aws/aws-sdk-go-v2/feature/ec2/imds (#7914) * build(deps): bump github.com/aws/aws-sdk-go-v2/config (#7915) * Add optional TLS support to /metrics endpoint (#7255) * Use exporter-toolkit to enable optional TLS encryption on /metrics endpoint Signed-off-by: peppi-lotta <[email protected]> * Implement startup listener to signal server readiness Signed-off-by: peppi-lotta <[email protected]> --------- Signed-off-by: peppi-lotta <[email protected]> * refactor(test): replace deprecated pbutil dep (#7924) Replace github.com/matttproud/golang_protobuf_extensions/pbutil with google.golang.org/protobuf/encoding/protodelim for reading varint size-delimited protobuf messages in the metrics scraper. The new protodelim package is already available via the existing google.golang.org/protobuf dependency, so this removes pbutil as a direct dependency entirely. Signed-off-by: Ville Vesilehto <[email protected]> * Fix case-sensitive zone handling in the transfer plugin for AXFR/IXFR. (#7899) This PR fixes Fix case-sensitive zone handling in the transfer plugin for AXFR/IXFR, raised in 7898 Signed-off-by: Yong Tang <[email protected]> * core: Propagate TSIG secrets to DoT server (#7928) * build(deps): bump github/codeql-action from 4.32.6 to 4.33.0 (#7929) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.32.6 to 4.33.0. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/0d579ffd059c29b07949a3cce3983f0780820c98...b1bff81932f5cdfc8695c7752dcee935dcd061c8) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.33.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> * build(deps): bump softprops/action-gh-release from 2.5.0 to 2.6.1 (#7930) Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.5.0 to 2.6.1. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/a06a81a03ee405af7f2048a818ed3f03bbf83c7b...153bb8e04406b158c6c84fc1615b65b24149a1fe) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-version: 2.6.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> * core: Avoid spawning waiter goroutines when QUIC worker pool is full (#7927) * build(deps): bump golang.org/x/crypto from 0.48.0 to 0.49.0 (#7939) * build(deps): bump github.com/aws/aws-sdk-go-v2 from 1.41.3 to 1.41.4 (#7938) * build(deps): bump golang.org/x/net from 0.51.0 to 0.52.0 (#7936) * build(deps): bump google.golang.org/api from 0.269.0 to 0.271.0 (#7933) * build(deps): bump github.com/aws/aws-sdk-go-v2/config (#7932) * build(deps): bump github.com/aws/aws-sdk-go-v2/service/route53 (#7937) * fix(file): protect Zone.Expired with mutex (#7940) * build(deps): bump github.com/aws/aws-sdk-go-v2/service/secretsmanager (#7935) * docs(cache): clarify TTL directive (#7941) * core: Reject oversized GET dns query parameter of DoH (#7926) * core: Reject oversized GET dns query parameter of DoH The DoH POST path limits request size using http.MaxBytesReader(..., 65536), but the GET path passes the dns query value directly to base64ToMsg() with no equivalent bound. This PR adds length check. Signed-off-by: Yong Tang <[email protected]> * Fix Signed-off-by: Yong Tang <[email protected]> --------- Signed-off-by: Yong Tang <[email protected]> * build(deps): bump google.golang.org/grpc from 1.79.2 to 1.79.3 (#7945) * Core: Propagate TSIG status in DoQ transport (#7947) This PR nsure DoQ writer preserves and returns TSIG verification status, preventing authentication bypass on DNS-over-QUIC. Signed-off-by: Yong Tang <[email protected]> * Update github workflow to release windows builds in zip format. (#7946) * feat: Add GitHub Actions workflow for drafting releases and update Makefile to build Windows releases as zip archives. Signed-off-by: John-Michael Mulesa <[email protected]> * Generate both tgz and zip for Windows to support any existing workflows. Signed-off-by: John-Michael Mulesa <[email protected]> --------- Signed-off-by: John-Michael Mulesa <[email protected]> * build(deps): bump github/codeql-action from 4.33.0 to 4.34.1 (#7952) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.33.0 to 4.34.1. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/b1bff81932f5cdfc8695c7752dcee935dcd061c8...38697555549f1db7851b81482ff19f1fa5c4fedc) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.34.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> * build(deps): bump github.com/DataDog/dd-trace-go/v2 from 2.6.0 to 2.7.0 (#7955) Bumps [github.com/DataDog/dd-trace-go/v2](https://github.com/DataDog/dd-trace-go) from 2.6.0 to 2.7.0. - [Release notes](https://github.com/DataDog/dd-trace-go/releases) - [Commits](https://github.com/DataDog/dd-trace-go/compare/v2.6.0...v2.7.0) --- updated-dependencies: - dependency-name: github.com/DataDog/dd-trace-go/v2 dependency-version: 2.7.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> * ci: use go-version-file instead of GITHUB_ENV (#7958) * ci(docker): scope secrets to publish step only (#7959) * ci(yamllint): replace third-party action with uvx (#7957) * build(deps): bump the k8s-io group with 3 updates (#7953) * build(deps): bump the go-etcd-io group with 2 updates (#7954) * ci(dependabot): add 7-day cooldown for updates (#7960) * fix(kubernetes): record cluster_ip services in dns_programming_duration metric (#7951) Signed-off-by: Azeez Syed <[email protected]> * plugin/cache: prefetch without holding a client connection (#7944) * ci: add persist-credentials: false to checkouts (#7964) * ci(release): use env vars for expressions in shell (#7965) * ci(depsreview): add version comment to pin (#7966) * plugin/transfter: Fix longestMatch to select the most specific zone correctly. (#7949) * plugin/transfter: Fix longestMatch to select the most specific zone correctly. This PR Fix longestMatch to select the most specific zone correctly.The previous implementation used lexicographic string comparison, which could choose the wrong zone; this change selects the longest matching zone instead. Signed-off-by: Yong Tang <[email protected]> * Tie breaker Signed-off-by: Yong Tang <[email protected]> * Fix Signed-off-by: Yong Tang <[email protected]> --------- Signed-off-by: Yong Tang <[email protected]> * core: Preserve TSIG status in gRPC transport (#7943) * ci: remove trivy-action (#7961) * feat: add support for running CoreDNS as a Windows service (#7962) * feat: add support for running CoreDNS as a Windows service Signed-off-by: John-Michael Mulesa <[email protected]> * Use non-deprecated service check function. Signed-off-by: John-Michael Mulesa <[email protected]> * refactor: remove deprecated build tags and clean up imports in service files Signed-off-by: John-Michael Mulesa <[email protected]> * ci: add Windows test workflow and fix log field access in service_windows.go Signed-off-by: John-Michael Mulesa <[email protected]> * test: implement cross-platform file permission restriction for Windows compatibility in run_test.go Signed-off-by: John-Michael Mulesa <[email protected]> * refactor: remove Windows-specific icacls test logic and restrict unreadable file test to non-Windows platforms Signed-off-by: John-Michael Mulesa <[email protected]> * docs: add documentation for -windows-service flag in man page Signed-off-by: John-Michael Mulesa <[email protected]> --------- Signed-off-by: John-Michael Mulesa <[email protected]> * test(dnssec): fix err in TestZoneSigningDouble (#7969) * chore(docs): regenerate man pages (#7971) * chore(docs): update Docker build command in README (#7972) * plugin/tsig: add require_opcode directive for opcode-based TSIG (#7828) Extend the tsig plugin to require TSIG signatures based on DNS opcodes, similar to the existing qtype-based requirement. The new require_opcode directive accepts opcode names (QUERY, IQUERY, STATUS, NOTIFY, UPDATE) or the special values "all" and "none". This is useful for requiring TSIG on dynamic update (UPDATE) or zone transfer notification (NOTIFY) requests while allowing unsigned queries. Example: ``` tsig { secret key. NoTCJU+DMqFWywaPyxSijrDEA/eC3nK0xi3AMEZuPVk= require_opcode UPDATE NOTIFY } ``` Signed-off-by: Seena Fallah <[email protected]> * plugin/tls: Add the keylog option to configure TLSConfig.KeyLogWriter (#7537) * tls: Add the keylog option to configure TLSConfig.KeyLogWriter Signed-off-by: Ilya Kulakov <[email protected]> * tls: Close keylog file on instance shutdown. Signed-off-by: Ilya Kulakov <[email protected]> --------- Signed-off-by: Ilya Kulakov <[email protected]> --------- Signed-off-by: Yong Tang <[email protected]> Signed-off-by: Ville Vesilehto <[email protected]> Signed-off-by: liucongran <[email protected]> Signed-off-by: dependabot[bot] <[email protected]> Signed-off-by: cangming <[email protected]> Signed-off-by: peppi-lotta <[email protected]> Signed-off-by: John-Michael Mulesa <[email protected]> Signed-off-by: Azeez Syed <[email protected]> Signed-off-by: Seena Fallah <[email protected]> Signed-off-by: Ilya Kulakov <[email protected]> Co-authored-by: Yong Tang <[email protected]> Co-authored-by: Ville Vesilehto <[email protected]> Co-authored-by: liucongran <[email protected]> Co-authored-by: liucongran <[email protected]> Co-authored-by: cangming <[email protected]> Co-authored-by: Peppi-Lotta <[email protected]> Co-authored-by: John-Michael Mulesa <[email protected]> Co-authored-by: Syed Azeez <[email protected]> Co-authored-by: John-Michael Mulesa <[email protected]> Co-authored-by: Seena Fallah <[email protected]> Co-authored-by: Ilya Kulakov <[email protected]> Co-authored-by: Hanzo Dev <[email protected]>
386 lines
14 KiB
Plaintext
386 lines
14 KiB
Plaintext
.\" Generated by Mmark Markdown Processer - mmark.miek.nl
|
|
.TH "COREDNS-KUBERNETES" 7 "March 2026" "CoreDNS" "CoreDNS Plugins"
|
|
|
|
.SH "NAME"
|
|
.PP
|
|
\fIkubernetes\fP - enables reading zone data from a Kubernetes cluster.
|
|
|
|
.SH "DESCRIPTION"
|
|
.PP
|
|
This plugin implements the Kubernetes DNS-Based Service Discovery
|
|
Specification
|
|
\[la]https://github.com/kubernetes/dns/blob/master/docs/specification.md\[ra].
|
|
|
|
.PP
|
|
CoreDNS running the kubernetes plugin can be used as a replacement for kube-dns in a kubernetes
|
|
cluster. See the deployment
|
|
\[la]https://github.com/coredns/deployment\[ra] repository for details on how
|
|
to deploy CoreDNS in Kubernetes
|
|
\[la]https://github.com/coredns/deployment/tree/master/kubernetes\[ra].
|
|
|
|
.PP
|
|
stubDomains and upstreamNameservers
|
|
\[la]https://kubernetes.io/blog/2017/04/configuring-private-dns-zones-upstream-nameservers-kubernetes/\[ra]
|
|
are implemented via the \fIforward\fP plugin. See the examples below.
|
|
|
|
.PP
|
|
This plugin can only be used once per Server Block.
|
|
|
|
.SH "SYNTAX"
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
kubernetes [ZONES...]
|
|
|
|
.fi
|
|
.RE
|
|
|
|
.PP
|
|
With only the plugin specified, the \fIkubernetes\fP plugin will default to the zone specified in
|
|
the server's block. It will handle all queries in that zone and connect to Kubernetes in-cluster. It
|
|
will not provide PTR records for services or A records for pods. If \fBZONES\fP is used it specifies
|
|
all the zones the plugin should be authoritative for.
|
|
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
kubernetes [ZONES...] {
|
|
endpoint URL
|
|
tls CERT KEY CACERT
|
|
kubeconfig KUBECONFIG [CONTEXT]
|
|
apiserver\_qps QPS
|
|
apiserver\_burst BURST
|
|
apiserver\_max\_inflight MAX
|
|
namespaces NAMESPACE...
|
|
labels EXPRESSION
|
|
pods POD\-MODE
|
|
endpoint\_pod\_names
|
|
ttl TTL
|
|
noendpoints
|
|
fallthrough [ZONES...]
|
|
ignore empty\_service
|
|
multicluster [ZONES...]
|
|
startup\_timeout DURATION
|
|
}
|
|
|
|
.fi
|
|
.RE
|
|
|
|
.IP \(bu 4
|
|
\fB\fCendpoint\fR specifies the \fBURL\fP for a remote k8s API endpoint.
|
|
If omitted, it will connect to k8s in-cluster using the cluster service account. Needs \fB\fCtls\fR for clusters with authentication.
|
|
This option is ignored if \fB\fCkubeconfig\fR is set.
|
|
.IP \(bu 4
|
|
\fB\fCtls\fR \fBCERT\fP \fBKEY\fP \fBCACERT\fP 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).
|
|
.IP \(bu 4
|
|
\fB\fCkubeconfig\fR \fBKUBECONFIG [CONTEXT]\fP authenticates the connection to a remote k8s cluster using a kubeconfig file.
|
|
\fB[CONTEXT]\fP is optional, if not set, then the current context specified in kubeconfig will be used.
|
|
It supports TLS, username and password, or token-based authentication.
|
|
This option is ignored if omitted. The cluster address in the \fB\fCkubeconfig\fR is given preference.
|
|
.IP \(bu 4
|
|
\fB\fCapiserver_qps\fR \fBQPS\fP sets the maximum queries per second (QPS) rate limit for requests.
|
|
This allows you to control the rate at which the plugin sends requests to the API server to prevent overwhelming it.
|
|
.IP \(bu 4
|
|
\fB\fCapiserver_burst\fR \fBBURST\fP sets the maximum burst size for requests.
|
|
This allows temporary spikes in request rate up to this value, even if it exceeds the QPS limit.
|
|
.IP \(bu 4
|
|
\fB\fCapiserver_max_inflight\fR \fBMAX\fP sets the maximum number of concurrent in-flight requests.
|
|
This caps the total number of simultaneous requests the plugin can make to the API server.
|
|
.IP \(bu 4
|
|
\fB\fCnamespaces\fR \fBNAMESPACE [NAMESPACE...]\fP only exposes the k8s namespaces listed.
|
|
If this option is omitted all namespaces are exposed
|
|
.IP \(bu 4
|
|
\fB\fCnamespace_labels\fR \fBEXPRESSION\fP only expose the records for Kubernetes namespaces that match this label selector.
|
|
The label selector syntax is described in the
|
|
Kubernetes User Guide - Labels
|
|
\[la]https://kubernetes.io/docs/user-guide/labels/\[ra]. An example that
|
|
only exposes namespaces labeled as "istio-injection=enabled", would use:
|
|
\fB\fClabels istio-injection=enabled\fR.
|
|
.IP \(bu 4
|
|
\fB\fClabels\fR \fBEXPRESSION\fP only exposes the records for Kubernetes objects that match this label selector.
|
|
The label selector syntax is described in the
|
|
Kubernetes User Guide - Labels
|
|
\[la]https://kubernetes.io/docs/user-guide/labels/\[ra]. An example that
|
|
only exposes objects labeled as "application=nginx" in the "staging" or "qa" environments, would
|
|
use: \fB\fClabels environment in (staging, qa),application=nginx\fR.
|
|
.IP \(bu 4
|
|
\fB\fCpods\fR \fBPOD-MODE\fP sets the mode for handling IP-based pod A records, e.g.
|
|
\fB\fC1-2-3-4.ns.pod.cluster.local. in A 1.2.3.4\fR.
|
|
This option is provided to facilitate use of SSL certs when connecting directly to pods. Valid
|
|
values for \fBPOD-MODE\fP:
|
|
|
|
.RS
|
|
.IP \(en 4
|
|
\fB\fCdisabled\fR: Default. Do not process pod requests, always returning \fB\fCNXDOMAIN\fR
|
|
.IP \(en 4
|
|
\fB\fCinsecure\fR: Always return an A record with IP from request (without checking k8s). This option
|
|
is vulnerable to abuse if used maliciously in conjunction with wildcard SSL certs. This
|
|
option is provided for backward compatibility with kube-dns.
|
|
.IP \(en 4
|
|
\fB\fCverified\fR: 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.
|
|
|
|
.RE
|
|
.IP \(bu 4
|
|
\fB\fCendpoint_pod_names\fR uses the pod name of the pod targeted by the endpoint as
|
|
the endpoint name in A records, e.g.,
|
|
\fB\fCendpoint-name.my-service.namespace.svc.cluster.local. in A 1.2.3.4\fR
|
|
By default, the endpoint-name name selection is as follows: Use the hostname
|
|
of the endpoint, or if hostname is not set, use the dashed form of the endpoint
|
|
IP address (e.g., \fB\fC1-2-3-4.my-service.namespace.svc.cluster.local.\fR)
|
|
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
|
|
pod name of the pod targeted by the endpoint. If there is no pod targeted by
|
|
the endpoint or pod name is longer than 63, use the dashed IP address form.
|
|
.IP \(bu 4
|
|
\fB\fCttl\fR allows you to set a custom TTL for responses. The default is 5 seconds. The minimum TTL allowed is
|
|
0 seconds, and the maximum is capped at 3600 seconds. Setting TTL to 0 will prevent records from being cached.
|
|
.IP \(bu 4
|
|
\fB\fCnoendpoints\fR will turn off the serving of endpoint records by disabling the watch on endpoints.
|
|
All endpoint queries and headless service queries will result in an NXDOMAIN.
|
|
.IP \(bu 4
|
|
\fB\fCfallthrough\fR \fB[ZONES...]\fP 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 \fB[ZONES...]\fP is omitted, then fallthrough happens for all zones for which the plugin
|
|
is authoritative. If specific zones are listed (for example \fB\fCin-addr.arpa\fR and \fB\fCip6.arpa\fR), then only
|
|
queries for those zones will be subject to fallthrough.
|
|
.IP \(bu 4
|
|
\fB\fCignore empty_service\fR returns NXDOMAIN for services without any ready endpoint addresses (e.g., ready pods).
|
|
This allows the querying pod to continue searching for the service in the search path.
|
|
The search path could, for example, include another Kubernetes cluster.
|
|
.IP \(bu 4
|
|
\fB\fCmulticluster\fR defines the multicluster zones as defined by Multi-Cluster
|
|
Services API (MCS-API). Specifying this option is generally paired with the
|
|
installation of an MCS-API implementation and the ServiceImport and ServiceExport
|
|
CRDs. The plugin MUST be authoritative for the zones listed here.
|
|
.IP \(bu 4
|
|
\fB\fCstartup_timeout\fR specifies the \fBDURATION\fP value that limits the time to wait for informer cache synced
|
|
when the kubernetes plugin starts. If not specified, the default timeout will be 5s.
|
|
|
|
|
|
.PP
|
|
Enabling zone transfer is done by using the \fItransfer\fP plugin.
|
|
|
|
.SH "STARTUP"
|
|
.PP
|
|
When CoreDNS starts with the \fIkubernetes\fP plugin enabled, it will delay serving DNS for up to 5 seconds
|
|
until it can connect to the Kubernetes API and synchronize all object watches. If this cannot happen within
|
|
5 seconds, then CoreDNS will start serving DNS while the \fIkubernetes\fP plugin continues to try to connect
|
|
and synchronize all object watches. CoreDNS will answer SERVFAIL to any request made for a Kubernetes record
|
|
that has not yet been synchronized. You can also determine how long to wait by specifying \fB\fCstartup_timeout\fR.
|
|
|
|
.SH "MONITORING KUBERNETES ENDPOINTS"
|
|
.PP
|
|
The \fIkubernetes\fP plugin watches Endpoints via the \fB\fCdiscovery.EndpointSlices\fR API.
|
|
|
|
.SH "READY"
|
|
.PP
|
|
This plugin reports readiness to the ready plugin. This will happen after it has synced to the
|
|
Kubernetes API.
|
|
|
|
.SH "PTR RECORDS"
|
|
.PP
|
|
This plugin creates PTR records for every Pod selected by a Service. If a given Pod is selected by more than
|
|
one Service a separate PTR record will exist for each Service selecting it.
|
|
|
|
.SH "EXAMPLES"
|
|
.PP
|
|
Handle all queries in the \fB\fCcluster.local\fR zone. Connect to Kubernetes in-cluster. Also handle all
|
|
\fB\fCin-addr.arpa\fR \fB\fCPTR\fR requests for \fB\fC10.0.0.0/17\fR . Verify the existence of pods when answering pod
|
|
requests.
|
|
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
10.0.0.0/17 cluster.local {
|
|
kubernetes {
|
|
pods verified
|
|
}
|
|
}
|
|
|
|
.fi
|
|
.RE
|
|
|
|
.PP
|
|
Or you can selectively expose some namespaces:
|
|
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
kubernetes cluster.local {
|
|
namespaces test staging
|
|
}
|
|
|
|
.fi
|
|
.RE
|
|
|
|
.PP
|
|
Connect to Kubernetes with CoreDNS running outside the cluster:
|
|
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
kubernetes cluster.local {
|
|
endpoint https://k8s\-endpoint:8443
|
|
tls cert key cacert
|
|
}
|
|
|
|
.fi
|
|
.RE
|
|
|
|
.PP
|
|
Configure multicluster
|
|
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
kubernetes cluster.local clusterset.local {
|
|
multicluster clusterset.local
|
|
}
|
|
|
|
.fi
|
|
.RE
|
|
|
|
.SH "STUBDOMAINS AND UPSTREAMNAMESERVERS"
|
|
.PP
|
|
Here we use the \fIforward\fP plugin to implement a stubDomain that forwards \fB\fCexample.local\fR to the nameserver \fB\fC10.100.0.10:53\fR.
|
|
Also configured is an upstreamNameserver \fB\fC8.8.8.8:53\fR that will be used for resolving names that do not fall in \fB\fCcluster.local\fR
|
|
or \fB\fCexample.local\fR.
|
|
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
cluster.local:53 {
|
|
kubernetes cluster.local
|
|
}
|
|
example.local {
|
|
forward . 10.100.0.10:53
|
|
}
|
|
|
|
\&. {
|
|
forward . 8.8.8.8:53
|
|
}
|
|
|
|
.fi
|
|
.RE
|
|
|
|
.PP
|
|
The configuration above represents the following Kube-DNS stubDomains and upstreamNameservers configuration.
|
|
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
stubDomains: |
|
|
{“example.local”: [“10.100.0.10:53”]}
|
|
upstreamNameservers: |
|
|
[“8.8.8.8:53”]
|
|
|
|
.fi
|
|
.RE
|
|
|
|
.SH "AUTOPATH"
|
|
.PP
|
|
The \fIkubernetes\fP plugin can be used in conjunction with the \fIautopath\fP plugin. Using this
|
|
feature enables server-side domain search path completion in Kubernetes clusters. Note: \fB\fCpods\fR must
|
|
be set to \fB\fCverified\fR for this to function properly. Furthermore, the remote IP address in the DNS
|
|
packet received by CoreDNS must be the IP address of the Pod that sent the request.
|
|
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
cluster.local {
|
|
autopath @kubernetes
|
|
kubernetes {
|
|
pods verified
|
|
}
|
|
}
|
|
|
|
.fi
|
|
.RE
|
|
|
|
.SH "METADATA"
|
|
.PP
|
|
The kubernetes plugin will publish the following metadata, if the \fImetadata\fP
|
|
plugin is also enabled:
|
|
|
|
.IP \(bu 4
|
|
\fB\fCkubernetes/endpoint\fR: the endpoint name in the query
|
|
.IP \(bu 4
|
|
\fB\fCkubernetes/kind\fR: the resource kind (pod or svc) in the query
|
|
.IP \(bu 4
|
|
\fB\fCkubernetes/namespace\fR: the namespace in the query
|
|
.IP \(bu 4
|
|
\fB\fCkubernetes/port-name\fR: the port name in an SRV query
|
|
.IP \(bu 4
|
|
\fB\fCkubernetes/protocol\fR: the protocol in an SRV query
|
|
.IP \(bu 4
|
|
\fB\fCkubernetes/service\fR: the service name in the query
|
|
.IP \(bu 4
|
|
\fB\fCkubernetes/client-namespace\fR: the client pod's namespace (see requirements below)
|
|
.IP \(bu 4
|
|
\fB\fCkubernetes/client-pod-name\fR: the client pod's name (see requirements below)
|
|
.IP \(bu 4
|
|
\fB\fCkubernetes/client-label/<label key>\fR: a label on the client pod (see requirements below)
|
|
|
|
|
|
.PP
|
|
The \fB\fCkubernetes/client-namespace\fR, \fB\fCkubernetes/client-pod-name\fR, and \fB\fCkubernetes/client-label/<label key>\fR
|
|
metadata work by reconciling the client IP address in the DNS request packet to a known pod IP address.
|
|
Therefore the following is required:
|
|
* \fB\fCpods verified\fR mode must be enabled
|
|
* the remote IP address in the DNS packet received by CoreDNS must be the IP address
|
|
of the Pod that sent the request.
|
|
|
|
.SH "METRICS"
|
|
.PP
|
|
If monitoring is enabled (via the \fIprometheus\fP plugin) then the following metrics are exported:
|
|
|
|
.IP \(bu 4
|
|
\fB\fCcoredns_kubernetes_dns_programming_duration_seconds{service_kind}\fR - Exports the
|
|
DNS programming latency SLI
|
|
\[la]https://github.com/kubernetes/community/blob/master/sig-scalability/slos/dns_programming_latency.md\[ra].
|
|
The metrics has the \fB\fCservice_kind\fR label that identifies the kind of the
|
|
kubernetes service
|
|
\[la]https://kubernetes.io/docs/concepts/services-networking/service\[ra].
|
|
It may take one of the three values:
|
|
|
|
.RS
|
|
.IP \(en 4
|
|
\fB\fCcluster_ip\fR
|
|
.IP \(en 4
|
|
\fB\fCheadless_with_selector\fR
|
|
.IP \(en 4
|
|
\fB\fCheadless_without_selector\fR
|
|
|
|
.RE
|
|
|
|
|
|
.PP
|
|
The following are client level metrics to monitor apiserver request latency & status codes. \fB\fCverb\fR identifies the apiserver request type
|
|
\[la]https://kubernetes.io/docs/reference/using-api/api-concepts/#single-resource-api\[ra] and \fB\fChost\fR denotes the apiserver endpoint.
|
|
* \fB\fCcoredns_kubernetes_rest_client_request_duration_seconds{verb, host}\fR - captures apiserver request latency perceived by client grouped by \fB\fCverb\fR and \fB\fChost\fR.
|
|
* \fB\fCcoredns_kubernetes_rest_client_rate_limiter_duration_seconds{verb, host}\fR - captures apiserver request latency contributed by client side rate limiter grouped by \fB\fCverb\fR & \fB\fChost\fR.
|
|
* \fB\fCcoredns_kubernetes_rest_client_requests_total{method, code, host}\fR - captures total apiserver requests grouped by \fB\fCmethod\fR, \fB\fCstatus_code\fR & \fB\fChost\fR.
|
|
|
|
.SH "BUGS"
|
|
.PP
|
|
The duration metric does not yet support the \fB\fCheadless_without_selector\fR service kind.
|
|
|
|
.SH "SEE ALSO"
|
|
.PP
|
|
See the \fIautopath\fP plugin to enable search path optimizations. And use the \fItransfer\fP plugin to
|
|
enable outgoing zone transfers.
|
|
|