使用 istio,我想创建一个虚拟服务来为集群内的虚拟域/主机提供服务。因此集群内的 pod 可以请求“http://internal.service.com/path”来到达特定的目标服务。
一种方式是使用make all "internal.service.com" host calls去
istio-ingressgateway.istio-system
,让gateway envoy处理路由。但是这样就失去了服务MESH的目的。
所以,我想创建一个虚拟服务,
host=internal.service.com
,gateway=mesh
这样路由规则就可以注入到所有 pod 的 sidecar 中,并且可以在 pod 内部访问主机+路径。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: internal-service-vs
spec:
hosts:
- "internal.service.com"
gateways:
- mesh
http:
- match:
- uri:
prefix: /path
route:
- destination:
host: a-service.namespace.svc.cluster.local
port:
number: 5000
但是在pod里面,当我请求
internal.service.com
时,它说无法解析主机的DNS。
似乎虚拟服务只是在创建一个
inbound
路由规则,我认为它可以作为出站规则。
所以我需要请求任何服务(带有标头
Host: internal.service.com
)以使用入站路由规则。
但是如何请求到当前pod的sidecar?我不想让请求在请求 pod 之外,因为单个目标将承担所有负载。
any-service.ns
, any-service.ns.svc.cluster.local
, service cluster ip
pod ip
(为什么?),127.0.0.1:15001
(chatgpt 告诉我这是 sidecar 的 HTTP 入站端口)主机的dns需要先在集群中解析。所以我需要先创建一个 ServiceEntry 来使 internal.service.com 成为一个有效的主机。
然后 sidecar 出站路由拦截器可以处理请求并解析主机。