Kubernetes外部服务的入口规则(具有ExternalName类型)

时间:2020-05-12 12:27:17

标签: kubernetes external nginx-ingress

在使用类型为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

1 个答案:

答案 0 :(得分:5)

发生的事情的说明

Ref

kube-proxy负责为外部类型以外的类型的服务实现一种虚拟IP形式

入口控制器正在尝试解析具有CNAME external-service的{​​{1}},并且当您的kube-dns / coredns(10.96.0.10)尝试进行查找时,它只能找不到CNAME记录,但找不到A record,因此,您的入口无法解析DNS名称。

Ref

在查找主机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

注意:

  1. 在上述解决方案中,您将需要外部服务的静态IP。
  2. 仅当我的Pod直接希望通过Internet与第三方服务通话时,我才使用ExternalNames,也就是说,该服务托管在我的本地网络之外。我会采用这种方法,因为如果我可以通过IP在本地访问某些内容,为什么通过与Nameserver解析DNS名称来降低性能!