我在尝试使用类型作为ExternalName并使用入口控制器将流量重定向到外部服务时遇到问题。
我收到以下错误,我可以从主机访问该主机,但不能从 K8S 访问。另外,IP 10.96.0.10 与 kube-dns 服务绑定。
解析主机“internaldnsname.com”时出错:查找internaldnsname.com
于 10.96.0.10:53:没有这样的主机
我缺少什么?
入口规则
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: external-ingress
annotations:
kubernetes.io/ingress.class: “nginx”
nginx.ingress.kubernetes.io/ingress.class: “nginx”
nginx.ingress.kubernetes.io/preserve-host: “false”
spec:
rules:
- host:
http:
paths:
- backend:
serviceName: external-service
servicePort: 80
path: /
服务定义
apiVersion: v1
kind: Service
metadata:
name: external-service
spec:
type: ExternalName
externalName: internaldnsname.com
解释发生了什么:
Ref
kube-proxy 负责为ExternalName 以外类型的服务实现一种虚拟 IP 形式
入口控制器正在尝试解决external-service
其中有CNAME internaldns.com
当您的 kube-dns/coredns (10.96.0.10) 尝试进行查找时,它只能找到 CNAME 记录,但找不到A record,因此,您的入口无法解析 DNS 名称。
Ref
查找主机 my-service.prod.svc.cluster.local 时,集群 DNS 服务返回值为 my.database.example.com 的 CNAME 记录
此外,还有明确的警告website关于外部名称:
对于某些常见协议(包括 HTTP 和 HTTPS),使用ExternalName 时可能会遇到问题。如果您使用ExternalName,则集群内客户端使用的主机名与ExternalName 引用的名称不同。
TL;DR:入口正在尝试使用 kubernetes DNS(kube-dns/coredns) 解析 DNS,但它没有任何 DNSA record,因此无法将 DNS 关联到 IP!
如果入口是为了查找具有 A 记录条目的不同 DNS 服务器(kubernetes DNS 除外)internaldns.com
那么这个问题可能不会发生,但我不能 100% 确定这是否可能。
Solution:
- 创建一个无头服务 without选择器,然后使用与服务相同的名称手动创建端点。根据例子here
Note:
- 在上述解决方案中,您将需要外部服务的静态IP。
- 仅当我的 Pod 直接想通过互联网与第三方服务通信时(也就是说该服务托管在我的本地网络之外),我才会使用ExternalNames。我会遵循这样的方法,因为如果我可以通过 IP 本地访问某些内容,为什么会通过与名称服务器对话来解析 DNS 名称来降低性能!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)