使用 Istio,有没有办法将入口路由到未运行特使挎斗的 k8s 集群服务?



我正在运行一个包含Windows和Linux VM的Azure AKS群集。

我可以从 Istio 命名空间中的 pod 中按名称卷曲集群服务,所以我知道 TCP 到 pod 有效。我相信我需要以某种方式通知我的虚拟服务,不要通过 envoy 代理进行路由,而只是将请求直接转发到 k8s 服务端点 - 类似于网格外部的虚拟机。我确实在网关处终止了 TLS - k8s 服务本身只是在端口 80 上的集群内公开。

目前,Windows 容器没有 envoy sidecar,但从 k8s 的角度来看,这只是 Istio 运行的同一集群中的另一项服务。

http-gateway.yaml

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
annotations:
name: http-gateway
namespace: istio-system
spec:
selector:    
istio: ingressgateway
servers:
- hosts:
- "*.myapp.com"
port:
number: 80
name: http-80-gateway
protocol: HTTP
tls:
httpsRedirect: true # sends 301 redirect for http requests
- hosts:
- "*.myapp.com"
port:
number: 443
name: https-443-gateway
protocol: HTTPS
tls:
credentialName: cert-azure-dns
privateKey: sds
serverCertificate: sds
mode: SIMPLE

virtual-service.yaml

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: myapp-vsvc
namespace: myapp-ns
spec:
hosts:
- foo #external DNS name is foo.myapp.com; gateway host for HTTPS is '*.myapp.com'
gateways:
- istio-system/http-gateway
http:
- route:
- destination:
host: myapp-svc.myapp-ns.svc.cluster.local
port:
number: 80

尝试特使直通 我添加了一个服务条目,如下所示:

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: myapp-se
namespace: myapp-ns
spec:
hosts:
- myapp-svc.myapp-ns.svc.cluster.local
ports:
- number: 80
name: http
protocol: HTTP
resolution: DNS
location: MESH_EXTERNAL

服务器响应是 404,"服务器"标头值为 "istio-envoy"。

DNS 正在正确解析到网关,并且 acme 证书有效 - 因此此错误通常表示我已将其解析到虚拟服务,但尚未路由到群集服务。在 Kiali 中,我的任何 yaml 定义都没有 Istio 验证错误:虚拟服务、服务入口或网关。

我的global.outboundTrafficPolicy.mode设置为"ALLOW_ANY"。

我想知道为群集服务声明"EXTERNAL_MESH"是否有问题?Istio 知道 k8s 服务存在,所以它是否试图优先路由到 Envoy sidecar 并忽略我的服务入口注册?

对于特定的 IP 范围,有一个选项可以完全绕过 envoy,如果我能以某种方式在这个特定的集群服务上设置静态 IP,这将是一个选项。我想绕过特使进入这个集群服务。

您可以使用serviceentry来执行此操作:

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: httpbin-ext
spec:
hosts:
- httpbin.org
ports:
- number: 80
name: http
protocol: HTTP
resolution: DNS
location: MESH_EXTERNAL

https://istio.io/docs/tasks/traffic-management/egress/egress-control/

我可以发誓我以前尝试过这个,但显然我需要提供的只是一个简单的虚拟服务,没有任何目标规则或服务条目。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: myapp-vsvc
namespace: myapp-ns
spec:
hosts:
- foo.myapp.com 
gateways:
- istio-system/http-gateway
http:
- route:
- destination:
host: myapp-svc.myapp-ns.svc.cluster.local
port:
number: 80