我在命名空间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。
答案 0 :(得分:1)
基于kubernetes documentation和okd的工作原理
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地址。
我希望这能回答您的问题。让我知道您是否还有其他问题。