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

2023-11-25

我在尝试使用类型作为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:

  1. 在上述解决方案中,您将需要外部服务的静态IP。
  2. 仅当我的 Pod 直接想通过互联网与第三方服务通信时(也就是说该服务托管在我的本地网络之外),我才会使用ExternalNames。我会遵循这样的方法,因为如果我可以通过 IP 本地访问某些内容,为什么会通过与名称服务器对话来解析 DNS 名称来降低性能!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐