除非给出完整的FQDN,否则指向其他命名空间中的服务的ExternalName不会解析

时间:2020-03-05 17:53:25

标签: kubernetes dns cname kubernetes-service coredns

我在命名空间my-service中具有ClusterIP类型的服务A,可以将负载负载到几个吊舱。我想在命名空间B中指向my-service的命名空间A中创建另一个类型为ExternalName的服务。

我创建以下YAML:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: B
spec:
  type: ExternalName
  externalName: my-service.A

,如果我执行进入在命名空间B中运行的pod并执行以下操作:

# ping my-service
ping: my-service: Name or service not known

但是,如果我将上述YAML中的externalName更改为以下内容:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: B
spec:
  type: ExternalName
  externalName: my-service.A.svc.cluster.local   <--- full FQDN here

一切正常。另外,如果我直接从命名空间my-service中的Pod ping B,它将得到解决:

# ping my-service.A
PING my-service.A.svc.cluster.local (10.0.80.133) 56(84) bytes of data.

为什么在外部名称服务中my-service.A不能解析为my-service.A.svc.cluster.local

我的K8s版本为1.14.8,并使用CoreDNS。

1 个答案:

答案 0 :(得分:1)

基于kubernetes documentationokd的工作原理

Kubernetes DNS在群集上调度DNS Pod和服务,并配置kubelet以告知各个容器使用DNS服务的IP来解析DNS名称。

什么可以获取DNS名称?

为群集中定义的每个服务(包括DNS服务器本身)分配一个DNS名称。默认情况下,客户端Pod的DNS搜索列表将包含Pod的自己的名称空间和群集的默认域


根据服务的IP系列,为服务分配DNS A或AAAA记录,其形式为 my-svc.my-namespace.svc.cluster-domain.example 。这将解析为服务的群集IP。


当您想使用my-service.A时,有来自kubedns的日志。

I0306 09:44:32.424126       1 logs.go:41] skydns: incomplete CNAME chain from "my-service.dis.": rcode 3 is not equal to success

这就是为什么您需要整个服务路径,在您所处的情况下是

my-service.A.svc.cluster.local

因为

使用外部域名服务会告诉系统,externalName字段中的DNS名称(上一个example中的example.domain.name)是支持该服务的资源的位置。当对Kubernetes DNS服务器发出DNS请求时,它会在CNAME记录中返回externalName,告诉客户端查找返回的名称以获取IP地址。


我希望这能回答您的问题。让我知道您是否还有其他问题。