kubernetes

kubernetes 可以读取 Kubernetes 集群中的区域数据。

说明

此插件实现了 基于 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.arpaip6.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.arpaPTR请求。在回答 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.localexample.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-namespacekubernetes/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} - 捕获按照verbhost进行分组的客户端所感知的 API 服务器请求延迟。
  • coredns_kubernetes_rest_client_rate_limiter_duration_seconds{verb, host} - 捕获按照verbhost进行分组的客户端端速率限制器造成的 API 服务器请求延迟。
  • coredns_kubernetes_rest_client_requests_total{method, code, host} - 捕获按照methodstatus_codehost进行分组的 API 服务器请求总数。

Bug

目前,duration 指标仅支持“headless_with_selector”服务。

另请参阅

请参阅autopath插件以启用搜索路径优化。并使用transfer插件启用域区域外传输。