在使用类型为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
答案 0 :(得分:5)
发生的事情的说明:
kube-proxy负责为外部类型以外的类型的服务实现一种虚拟IP形式
入口控制器正在尝试解析具有CNAME external-service
的{{1}},并且当您的kube-dns / coredns(10.96.0.10)尝试进行查找时,它只能找不到CNAME记录,但找不到A record,因此,您的入口无法解析DNS名称。
在查找主机my-service.prod.svc.cluster.local时,群集DNS服务返回CNAME记录,其值为my.database.example.com
此外,website上有一个关于外部名称的明确警告:
您可能无法将ExternalName用于某些常见协议,包括HTTP和HTTPS。如果使用外部名称,则群集内客户端使用的主机名与外部名称引用的名称不同。
TL; DR:入口正在尝试使用没有任何A record的kubernetes DNS(kube-dns / coredns)解析DNS,因此无法将DNS与IP关联!
如果通过入口查找具有internaldns.com
记录条目的其他DNS服务器(不是Kubernetes DNS),则可能不会发生此问题,但我不确定100%是否可以。
解决方案: -创建一个Headless service 不选择器,然后使用与该服务相同的名称手动创建一个端点。遵循示例here
注意: