【问题标题】:GKE Ingress with ExternalName service as backend not working使用 ExternalName 服务作为后端的 GKE Ingress 无法正常工作
【发布时间】:2021-08-30 15:38:38
【问题描述】:

我有一个 GKE Ingress,其后端引用了 ExternalName 类型的 kubernetes 服务。 “外部”服务是指同一个集群中的另一个 Kubernetes 服务(在不同的命名空间中,这就是为什么“外部”服务被用作桥接器的原因)。但是,通过 BackendConfig 在“外部”服务上定义的运行状况检查失败。当我通过 curl 手动测试运行状况检查路径和端口上的“外部”服务时,它正在工作,给出 200 OK。有人知道是否有可能将 ExternalName 服务作为 GKE Ingress 的后端服务?或者有没有其他方法可以跨不同命名空间从 Ingress 引用服务?我知道我可以为每个命名空间创建一个 Ingress 以引用不同命名空间中的服务,但每个 Ingress 意味着一个新的 IP 地址、新的转发规则,以及更多 $$$。命名空间用于分隔环境。欢迎任何提示...

【问题讨论】:

    标签: kubernetes google-kubernetes-engine


    【解决方案1】:

    我认为您不能使用 ExternalName 服务作为 Ingress 的后端。 ExternalName 用于内部客户端为外部服务设置别名。你也许可以做你想做的事,但我从未尝试过这种方法。

    编辑

    作为使用入口资源的替代方法,您可以尝试使用新的Gateway API,它支持多个服务的单个共享入口点(甚至跨命名空间)。它目前处于 alpha 阶段,但主要是因为实际的 API 将来可能会发生变化。展望未来,这将是您想要走的路。

    编辑

    如果你想使用入口,我建议部署一个 nginx 入口控制器,因为它支持为多个入口共享一个外部 IP。 您应该能够在每个命名空间中创建一个指向相应服务的 Ingress,它们将“共享”相同的外部 IP。您可以在每个 Ingress 资源中为后端指定不同的路径:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-hello-world-1
      namespace: hello1
    spec:
      rules:
        - http:
            paths:
            - backend:
                serviceName: service-hello1
                servicePort: 80
              path: /hello-world-1
    

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-hello-world-2
      namespace: hello2
    spec:
      rules:
        - http:
            paths:
            - backend:
                serviceName: service-hello2
                servicePort: 80
              path: /hello-world-2
    

    【讨论】:

    • 我在这里关注了一些答案(例如stackoverflow.com/questions/51878195/…),这些答案建议通过这种“外部”服务建立“桥梁”。但是,通常使用 nginx 入口控制器,而不是 GKE 控制器(至少在我看来是这样的)。因此,我为 GKE 尝试了它。不幸的是,在 GKE 上,多个 Ingress 不能共享同一个外部 IP。每个 Ingress 创建一个转发规则,每个转发规则必须有一个单独的 IP 地址。并且您为每条转发规则付费。
    • 从未使用过桥接方法,但我相信 nginx 入口控制器确实支持这一点,但是当然你需要将它部署在集群中。
    • 希望其他人可以在ExternalName 路线上提供帮助。如果我也有空闲时间,我会尝试尝试一下。
    • 是的,Ingress 控制器可以解决这个问题,但需要一些额外的配置。我只是想暂时避免这种情况,但如果我真的想实现这个目标,这似乎是不可避免的。
    • 我会在 Google 内部四处打听,看看还能找到什么。
    【解决方案2】:

    “ExternalName”类型的服务用于从内部 DNS 名称映射到外部 DNS 名称,它为外部 DNS 名称提供内部别名。因此它不能用作 Ingress 的后端,请参阅文档 [1]。 要将 Ingress Controller 用于多个命名空间,请查看此示例 code

    要共享相同的外部 IP,您可以在集群中运行自己的 nginx-ingress 控制器并通过 LoadBalancer 服务类型公开它。然后,您将有一个 IP 用于您的入口,并能够通过添加注释 kubernetes.io/ingress.class: "nginx" 来通过 nginx 控制器服务所有入口。如需更多信息,请转至link

    此外,您可以通过在 Ingress 上配置路由规则,在单个负载均衡器和公共 IP 上运行多个服务。通过在同一个 Ingress 上托管多个服务,您可以避免为暴露给 Internet 的每个服务创建额外的负载均衡器(它们是可计费的资源)。参考[2]。

    [1]https://cloud.google.com/kubernetes-engine/docs/concepts/service#service_of_type_externalname

    [2]https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer#optional_serving_multiple_applications_on_a_load_balancer

    【讨论】:

    • 谢谢。但是,我专门询问 GKE Ingress 控制器并寻找一种仅拥有单个 Ingres 资源的方法。您的示例适用于创建多个 Ingress 资源的 nginx 入口控制器......我知道 ExternalName 将用于映射外部名称,但我认为它也可用于映射另一个内部名称(如果它有效,为什么不使用)。但是,这样的 ExternalName 服务似乎确实不能用作 Ingress 后端服务。
    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 2015-03-06
    • 1970-01-01
    • 2016-01-15
    相关资源
    最近更新 更多