说明
此插件实现了 基于 DNS 的 Kubernetes 服务发现规范。
运行 kubernetes 插件的 CoreDNS 可以用作 kubernetes 集群中 kube-dns 的替代品。有关如何在 Kubernetes 中部署 CoreDNS 的详细信息,请参阅 部署 存储库 中。
通过 forward 插件实现了 stubDomains 和 upstreamNameservers。请参阅以下示例。
这个插件只能在每个服务器块中使用一次。
语法
kubernetes [ZONES...]
仅指定插件时,kubernetes 插件将默认为服务器块中指定区域。它将处理该区域中的所有查询并连接到 Kubernetes cluster 中。它不会为服务提供 PTR 记录或为 Pod 提供 A 记录。如果使用 ZONES,它将指定该插件应授权的所有区域。
kubernetes [ZONES...] {
endpoint URL
tls CERT KEY CACERT
kubeconfig KUBECONFIG [CONTEXT]
namespaces NAMESPACE...
labels EXPRESSION
pods POD-MODE
endpoint_pod_names
ttl TTL
noendpoints
fallthrough [ZONES...]
ignore empty_service
}
-
endpoint
为远程 k8s API 终结点指定 URL。如果忽略,则使用集群服务帐号连接到群集内的 k8s。 -
tls
CERT KEY CACERT 是远程 k8s 连接的 TLS 证书、密钥和 CA 证书文件名。如果在群集内连接(即未指定端点),则会忽略此选项。 -
kubeconfig
KUBECONFIG [CONTEXT] 使用 kubeconfig 文件对远程 k8s 集群的连接进行身份验证。[CONTEXT] 是可选的,如果未设置,则将使用 kubeconfig 中指定的当前上下文。它支持 TLS、用户名和密码或基于令牌的身份验证。如果在群集内连接(即未指定端点),则会忽略此选项。 -
namespaces
NAMESPACE [NAMESPACE…] 仅公开列出的 k8s 命名空间。如果忽略此选项,则会公开所有命名空间。 -
namespace_labels
EXPRESSION 仅公开与该标签选择器匹配的 Kubernetes 命名空间的记录。标签选择器语法在 Kubernetes 用户指南 - 标签 中进行了说明。仅公开标记为 “istio-injection=enabled” 的命名空间的一个示例:labels istio-injection=enabled
。 -
labels
EXPRESSION 仅公开与该标签选择器匹配的 Kubernetes 对象的记录。标签选择器语法在 Kubernetes 用户指南 - 标签 中进行了说明。仅公开在“staging”或“qa”环境中标记为 “application=nginx” 的对象的示例:labels environment in (staging, qa),application=nginx
。 -
pods
POD-MODE 设置用于处理基于 IP 的 Pod A 记录的模式,例如1-2-3-4.ns.pod.cluster.local. in A 1.2.3.4
。提供此选项是为了在直接连接到 Pod 时方便使用 SSL 认证。**POD-MODE** 的有效值disabled
:默认。不处理 Pod 请求,始终返回NXDOMAIN
insecure
:始终返回具有来自请求的 IP 的 A 记录(不检查 k8s)。恶意地与通配符 SSL 证书结合使用时,此选项极易受到滥用。提供此选项是为了向后兼容 kube-dns。verified
:如果在具有匹配 IP 的相同命名空间中存在 Pod,则返回 A 记录。由于此选项将继续监视所有 Pod,因此它需要的内存比不安全模式下的要多很多。
-
endpoint_pod_names
使用由端点为目标的 Pod 名称作为 A 记录中的端点名称,例如,endpoint-name.my-service.namespace.svc.cluster.local. in A 1.2.3.4
默认情况下,端点名称选择如下:使用端点的域名,或者,如果未设置域名,则使用端点 IP 地址的带短划线的形式(例如,1-2-3-4.my-service.namespace.svc.cluster.local.
)如果包含此指令,那么端点的名称选择会更改如下:使用端点的域名,或者,如果未设置域名,则使用由端点为目标的 Pod 名称。如果没有 Pod 是由端点为目标的或者 Pod 名称的长度超过 63,则使用带短划线的 IP 地址形式。 -
ttl
允许您为响应设置自定义 TTL。默认值为 5 秒。允许的最小 TTL 为 0 秒,最大值上限为 3600 秒。将 TTL 设置为 0 将阻止记录被缓存。 -
noendpoints
将通过禁用对端点的监视来关闭端点记录的服务。所有端点查询和无头服务查询的结果都是 NXDOMAIN。 -
fallthrough
[ZONES…] 如果插件有权限的区域中的记录查询结果为 NXDOMAIN,通常会形成该响应。但是,如果您指定此选项,查询会传递到插件链中的下一级,这里可能包括用于处理查询的另一个插件。如果省略了 [ZONES…],则对插件有权限的所有区域都将进行故障转移。如果列出了特定的区域(例如in-addr.arpa
和ip6.arpa
),则只有针对这些区域的查询才将执行故障转移。 -
ignore empty_service
为没有任何就绪端点地址(例如,就绪 Pod)的服务返回 NXDOMAIN。这允许查询 Pod 继续在搜索路径中搜索服务。例如,搜索路径可以包含另一个 Kubernetes 集群。
使用 transfer 插件可启用区域传输。
启动
当启用kubernetes插件启动 CoreDNS 时,它将延迟最多 5 秒提供 DNS 服务,直到它可以连接到 Kubernetes API 并同步所有对象监听。如果 5 秒内无法实现这一点,则 CoreDNS 将开始提供 DNS 服务,而kubernetes插件将继续尝试连接和同步所有对象监听。对于尚未同步的 Kubernetes 记录的任何请求,CoreDNS 将回复 SERVFAIL。
监控 Kubernetes 端点
kubernetes插件通过discovery.EndpointSlices
API 监视端点。
已准备好
此插件将向就绪插件报告就绪状态。它会在与 Kubernetes API 同步后执行此操作。
示例
处理cluster.local
区域中的所有查询。集群内连接到 Kubernetes。还处理对10.0.0.0/17
的所有in-addr.arpa
PTR
请求。在回答 Pod 请求时验证 Pod 的存在。
10.0.0.0/17 cluster.local {
kubernetes {
pods verified
}
}
您还可以有选择地公开一些命名空间
kubernetes cluster.local {
namespaces test staging
}
在集群外运行 CoreDNS,连接到 Kubernetes
kubernetes cluster.local {
endpoint https://k8s-endpoint:8443
tls cert key cacert
}
stubDomains 和 upstreamNameservers
在此,我们使用forward插件来实现一个将example.local
转发到名称服务器10.100.0.10:53
的 stubDomain。还配置了一个上游名称服务器8.8.8.8:53
,该名称服务器将用于解析不属于cluster.local
或example.local
的名称。
cluster.local:53 {
kubernetes cluster.local
}
example.local {
forward . 10.100.0.10:53
}
. {
forward . 8.8.8.8:53
}
上述配置表示以下 Kube-DNS stubDomains 和 upstreamNameservers 配置。
stubDomains: |
{“example.local”: [“10.100.0.10:53”]}
upstreamNameservers: |
[“8.8.8.8:53”]
AutoPath
kubernetes插件可与autopath插件结合使用。使用此功能可在 Kubernetes 集群中启用服务器端域搜索路径完成。注意:pods
必须设置为verified
才能正常发挥作用。此外,CoreDNS 收到的 DNS 数据包中的远程 IP 地址必须是发送请求的 Pod 的 IP 地址。
cluster.local {
autopath @kubernetes
kubernetes {
pods verified
}
}
元数据
如果启用了metadata插件,则 kubernetes 插件将发布以下元数据
kubernetes/endpoint
:查询中的端点名称kubernetes/kind
:查询中的资源种类(pod 或 svc)kubernetes/namespace
:查询中的命名空间kubernetes/port-name
:SRV 查询中的端口名称kubernetes/protocol
:SRV 查询中的协议kubernetes/service
:查询中的服务名称kubernetes/client-namespace
:客户端 Pod 的命名空间(请参阅下面的要求)kubernetes/client-pod-name
:客户端 Pod 的名称(请参阅下面的要求)
kubernetes/client-namespace
和kubernetes/client-pod-name
元数据通过将 DNS 请求数据包中的客户端 IP 地址与已知的 Pod IP 地址进行协调来工作。因此,以下内容是必需的
- 必须启用
pods verified
模式 - CoreDNS 收到的 DNS 数据包中的远程 IP 地址必须是发送请求的 Pod 的 IP 地址。
指标
如果启用了监控(通过prometheus插件),则会导出以下指标
coredns_kubernetes_dns_programming_duration_seconds{service_kind}
- 导出DNS 编程延迟 SLI。该指标拥有 kubernetes 服务的service_kind
标签对其进行标识。它可以采用如下三种值之一cluster_ip
headless_with_selector
headless_without_selector
以下指标是用于监控 API 服务器请求延迟和状态代码的客户端指标。verb
标识 API 服务器请求类型,host
表示 API 服务器端点。
coredns_kubernetes_rest_client_request_duration_seconds{verb, host}
- 捕获按照verb
和host
进行分组的客户端所感知的 API 服务器请求延迟。coredns_kubernetes_rest_client_rate_limiter_duration_seconds{verb, host}
- 捕获按照verb
和host
进行分组的客户端端速率限制器造成的 API 服务器请求延迟。coredns_kubernetes_rest_client_requests_total{method, code, host}
- 捕获按照method
、status_code
和host
进行分组的 API 服务器请求总数。
Bug
目前,duration 指标仅支持“headless_with_selector”服务。
另请参阅
请参阅autopath插件以启用搜索路径优化。并使用transfer插件启用域区域外传输。