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

Shu*_*ham 5 dns cname kubernetes coredns kubernetes-service

my-service在命名空间中有一个 ClusterIP 类型的服务A,可以对几个 Pod 进行负载平衡。我想在命名空间中创建另一个B指向my-service命名空间的ExternalName类型的服务A

我创建以下 YAML:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: B
spec:
  type: ExternalName
  externalName: my-service.A
Run Code Online (Sandbox Code Playgroud)

如果我执行到命名空间中运行的 podB并执行以下操作:

# ping my-service
ping: my-service: Name or service not known
Run Code Online (Sandbox Code Playgroud)

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

# ping my-service
ping: my-service: Name or service not known
Run Code Online (Sandbox Code Playgroud)

事情按预期进行。另外,如果我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.
Run Code Online (Sandbox Code Playgroud)

为什么 在ExternalName Service 中my-service.A没有解析为?my-service.A.svc.cluster.local

我的 K8s 版本是1.14.8并使用 CoreDNS。

jt9*_*t97 5

基于kubernetes 文档okd这就是它应该如何工作

\n
\n

Kubernetes DNS 在集群上调度 DNS Pod 和 Service,并配置 kubelet 告诉各个容器使用 DNS Service\xe2\x80\x99s IP 来解析 DNS 名称。

\n

什么东西获取 DNS 名称?

\n

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

\n
\n
\n
\n

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

\n
\n
\n

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

\n
I0306 09:44:32.424126       1 logs.go:41] skydns: incomplete CNAME chain from "my-service.dis.": rcode 3 is not equal to success\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
my-service.A.svc.cluster.local\n
Run Code Online (Sandbox Code Playgroud)\n

因为

\n
\n

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

\n
\n
\n

我希望这能回答你的问题。如果您还有其他问题,请告诉我。

\n