【问题标题】:How to let istio resolve self defined hosts如何让 istio 解析自定义主机
【发布时间】:2018-11-16 08:46:26
【问题描述】:

场景: 我有 2 个集群:A 和 B 都安装了 istio。我想将集群 A 中的 service-1 公开为 service-1.suffix,并让集群 B 中的 service-2 通过 service-1.suffix 访问 service-1。下图说明了我的想法。 在集群 A 中,我定义了一个 virtualService 和 Gateway 来将请求路由到 service-1。

网关:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: service-1
spec:
  selector:
    istio: ingressgateway # use istio default ingress gateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "service-1.suffix"

虚拟服务:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: service-1
spec:
  hosts:
  - service-1.default.svc.cluster.local
  - "service-1.suffix"
  gateways:
  - service-1
  - mesh
  http:
  - route:
    - destination:
        host: service-1.default.svc.cluster.local
        port:
          number: 8080

这很好,因为我可以使用 curl 成功访问它。

curl -I -HHost:service-1.suffix http://cluster_A_proxy:31380

下一步是在集群 B 中创建 Egress 和 VirtualService。这是我的定义文件:

服务入口:

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: service-1
spec:
  hosts:
  - "service-1.suffix"   #the global suffix mcm.com could be defined in mcm.
  #addresses:
  #- xxx/32
  ports:
  - number: 80   
    name: http
    protocol: HTTP
  resolution: STATIC
  location: MESH_EXTERNAL
  endpoints:
  - address: 1.1.1.1  #The cluster A proxy ip
    ports:
      http: 31380

虚拟服务:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: service-1
spec:
  hosts:
  - "service-1.suffix"
  http:
  - route:
    - destination:
        host: "service-1.suffix"
        port:
          number: 80

在集群 B 中,当我尝试使用 curl 解析 service-1.suffix 时,我收到一个 DNS 错误,提示无法解析。

curl: (6) Could not resolve host: service-1.suffix

我该如何解决这个问题?

#The command I am using in an istio app in Cluster B:
kubectl exec -it pod_name -c container_name bash
curl -I -HHost:service-1.suffix http://service-1.suffix

编辑: 当我在 serviceentry 中使用另一个可解析的主机名(如 www.google.com)时,我可以通过它,对 www.google.com 的请求将被重定向到集群 A 中的 service-1。同样,如果我使用 nip.io 作为我的后缀,效果很好。但是,无法解析组成的名称 service-1.suffix。

【问题讨论】:

  • 我有几个问题: 1. 你从哪里尝试这个命令curl -I -HHost:service-1.suffix http://service-1.suffix? 2. 你在集群 B 中配置 Egress Gateway 了吗?
  • @ArtemGolenyaev 嗨,我在集群 B 的睡眠服务中尝试了该命令。我使用 kubectl exec 进入。我没有配置 Egress Gateway,你能告诉我如何配置它吗?

标签: istio


【解决方案1】:

使用随机 IP 定义一个 Kubernetes ExternalName 服务:

kind: Service
apiVersion: v1
metadata:
  name: service1
spec:
  type: ExternalName
  externalName: 1.1.1.1

【讨论】:

  • 那么,集群 B 中的 pod 应该使用哪个主机,service1.<namespace>(k8s 服务主机)?或service-1.suffix(自定义主机)?事实上,curl http://service1.<namespace>curl http://service-1.suffix 我都试过了,都返回了:Could not resolve host。顺便说一句,random iP 是什么意思?
  • 啊,我明白了,您必须在 ServiceEntry 和 VirtualService 中使用 service1.<namespace>。随机 IP - Kubernetes 未使用的任何 IP,如 127.255.0.2,在 preliminary.istio.io/docs/examples/multicluster/gateways/… 中使用。
猜你喜欢
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多