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

lea*_*man 1 external kubernetes nginx-ingress

我在尝试使用类型为 ExternalName 和入口控制器将流量重定向到外部服务时遇到问题。

我收到以下错误,我可以从主机访问该主机,但不能从 K8S 访问。此外,IP 10.96.0.10 与 kube-dns 服务相关联。

解析主机“internaldnsname.com”时出错:在 10.96.0.10:53 上查找 internaldnsname.com:没有这样的主机

我错过了什么?

入口规则

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: /
Run Code Online (Sandbox Code Playgroud)

服务定义

apiVersion: v1
kind: Service
metadata:
  name: external-service
spec:
  type: ExternalName
  externalName: internaldnsname.com
Run Code Online (Sandbox Code Playgroud)

gar*_*ium 6

对正在发生的事情的解释

参考

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

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

参考

在查找主机 my-service.prod.svc.cluster.local 时,集群 DNS 服务返回值为 my.database.example.com 的 CNAME 记录

此外,网站上有关于 ExternalNames的明确警告:

您可能无法将 ExternalName 用于某些常见协议,包括 HTTP 和 HTTPS。如果您使用 ExternalName,则集群内客户端使用的主机名与 ExternalName 引用的名称不同。

TL;DR:ingress 正在尝试使用没有任何A 记录的kubernetes DNS(kube-dns/coredns)解析 DNS,因此无法将 DNS 关联到 IP!

如果入口是为了查找具有 A 记录条目的不同 DNS 服务器(除了 kubernetes DNS),internaldns.com那么这个问题可能不会发生,但我不能 100% 确定这是否可能。

解决方案: - 创建一个没有选择器的Headless 服务 ,然后使用与服务相同的名称手动创建一个端点。按照这里的例子

笔记:

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