【问题标题】:Can Istio map an non existing host to a given service on K8sIstio 可以将不存在的主机映射到 K8s 上的给定服务吗
【发布时间】:2018-11-17 14:46:18
【问题描述】:

给你们 2 个问题。

我有一个 pod A 试图请求一个名为 foo 的 url,在 http://foo 上执行 GET。 但是服务 foo 在我的 K8 集群中不存在,而是我有一个名为 fooX 的服务可以完成这项工作。 是否可以创建一个 Istio 配置来将我对 foo 的调用路由到 fooX 服务?

更一般地说,我们有一堆服务调用其他服务,并通过环境变量获取服务 url,但是我们拥有的服务越多,我们拥有的环境变量就越多,它是不可扩展的。我希望服务网格能在这方面有所帮助,但我不确定。

【问题讨论】:

    标签: kubernetes istio


    【解决方案1】:

    您可以为此使用 K8S ExternalName services

    ExternalName 服务是没有选择器的服务的一种特殊情况。它没有定义任何端口或端点。相反,它用作将别名返回给驻留在集群外部的外部服务的一种方式。

    虽然它旨在为集群外的服务定义别名,但它也可用于为集群内的服务创建别名。在您的情况下,只需定义以下 K8S 服务:

    kind: Service
    apiVersion: v1
    metadata:
      name: foo
      namespace: prod
    spec:
      type: ExternalName
      externalName: fooX.prod.svc.CLUSTER
    

    因此,当您的应用向http://foo.prod.svc.CLUSTER 发送请求时,请求将到达http://fooX.prod.svc.CLUSTER

    【讨论】:

    • 感谢您的快速回答。这是一个运行良好的纯 K8s 解决方案。有没有办法使用 Istio 路由清单来做到这一点?我正在尝试了解 VirtualService 配置。
    • 顺便说一句,我没能用 Istio 完成这项工作。我已更改 Bookinfo.yaml 以将服务 reviews 重命名为 reviewxx 并试图找到一种方法从 productpage 调用重定向 http 调用 reviews 链接到 reviewxx 服务,但是没有用。
    【解决方案2】:

    正如另一个答案中提到的,可以使用 ExternalService(在 0.8.1 中重命名为 ServiceEntry)。但是,需要注意的是,您为 ServiceEntry 中的别名选择的名称对于 HTTP 是 DNS 可解析的。否则,DNS 查找将失败,并且连接将永远无法到达要根据 ServiceEntry 路由的代理。

    【讨论】:

    • 感谢您的回答。我将之前的响应这是一个纯粹的 K8s 响应它没有谈到 ServiceEntry。但是我尝试将这两种解决方案结合起来,以便使用 K8s externalName 服务类型创建一个 DNS 可解析条目,然后将其路由到 istio ServiceEntry 却没有任何成功。似乎 istio 不喜欢通过实际上针对内部服务的 K8s 外部服务。
    猜你喜欢
    • 1970-01-01
    • 2020-03-27
    • 2018-12-08
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多