【发布时间】:2020-10-08 09:47:47
【问题描述】:
在我目前正在进行的一个项目中,我想为位于另一个命名空间中的 Kubernetes 服务创建一个 DNS 别名。为此,我创建了一个 ExternalName 服务,如下所示:
kind: Service
apiVersion: v1
metadata:
name: connector
namespace: test
spec:
type: ExternalName
externalName: gateway.eventing.svc.cluster.local
到目前为止,一切都很好。当我请求“连接器”DNS 时,我成功点击了外部名称,即 gateway.eventing.svc.cluster.local。
现在,我想为发送到连接器 ExternalName 服务的所有 http 请求添加标头,因此我创建了一个 Istio VirtualService 来执行此操作:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: connector
namespace: test
spec:
hosts:
- connector
- connector.test.svc.cluster.local
http:
- match:
- uri:
prefix: /
route:
- destination:
host: connector
port:
number: 80
#headers config ignored for brevity
问题是永远不会调用 VirtualService。似乎它不会拦截对连接器 DNS 或其完全限定名称(即 connector.test.svc.cluster.local)发出的请求。
阅读文档后,我认为这是因为 Istio VirtualService 检查服务注册表,而 ExternalName 服务不是其中的一部分,它只是某种 DNS 别名。
因此,我尝试创建一个 Istio ServiceEntry,如下所示:
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: connector
namespace: test
spec:
hosts:
- connector
endpoints:
- address: gateway.eventing.svc.cluster.local
ports:
- number: 80
name: http
protocol: HTTP
location: MESH_INTERNAL
resolution: DNS
它可以工作,我可以在 Kiali 中看到,在请求连接器时,它不是调用 PassthroughCluster,而是调用连接器 ServiceEntry,据我了解应该发生什么。
但是,我的连接器 VirtualService 仍然没有被调用。这是为什么?有办法实现吗?
如果没有,我可以做些什么来给给定命名空间中的别名(即测试)位于另一个(即事件)和代理 http 请求的服务,这要归功于 Istio VirtualService?
提前感谢您的帮助!
编辑:
在命名空间范围内启用 Sidecar 注入(即测试)
【问题讨论】:
标签: kubernetes istio