我将 Istio 部署在 AWS EKS 托管的 Kubernetes 集群中。这创建了一个名为 istio-ingressgateway 的 LoadBalancer 类型的 Kubernetes 服务,其外部主机名为[redacted]-redacted.us-west-2.elb.amazonaws.com
,并自动配置 AWS ELB,类型 classic。那太棒了。 (注意:在 AWS 控制台中,我没有看到此 elb 主机名的托管区域,看起来我无法配置别名或其他内容)
我已经能够通过定义打开端口 80 的 istio 网关,将在集群外部运行的 gRPC 客户端连接到在集群中运行的 gRPC 服务器。host:"*"
,并定义一个 istio 虚拟服务,将端口 80 路由到我的目的地(某些 kubernetes 服务的某个端口)。到目前为止,一切都很好。
现在我想对集群中的第二个 gRPC 端点执行此操作。据我所知,我的选择是:要么通过在入口上打开第二个端口(例如 81)(我现在选择不这样做)。或者通过定义子域来路由[redacted]-redacted.us-west-2.elb.amazonaws.com
,或通过实现“虚拟托管”进行路由,即客户端发送的同一域上的两个服务host:"svc1"
在标题中。
这就是我被困住的地方。我不知道如何为这个 ELB 域名定义子域,也不知道是否可以使用 TLS 进行虚拟托管,如果可以,我是否仍然可以使用 Istio 的“passthrough”tls 模式,以免TLS 在网关上终止。
1-使用子域:当在我的开发机器上时,我尝试getent hosts svc1.[redacted]-redacted.us-west-2.elb.amazonaws.com
它不映射到 IP,而如果删除svc1
前缀 DNS 返回 3 个 IP(猜测 us-west-2 中的 3 个可用区域)。因此,如果不做一些工作,我就无法将 svc1 添加到域中。
我可以定义子域吗svc1
and svc2
对于通过部署 Istio 自动配置的经典 AWS ELB 创建的域,如果是这样,如何实现?我可以这样做吗kubectl/istioctl
配置 Istio,还是需要使用 AWS CLI 来执行此操作?可以在不注册域的情况下完成此操作吗?我可以接受用户不友好的 elb.amazonaws.com 主机名吗?
2- 虚拟主机:或者,我可以在 gRPC 元数据中添加 host=svc1。我尝试添加ctx := metadata.AppendToOutgoingContext(context.Background(), "Host", "svc1")
对于我的 Go 客户端来说,这不起作用。
一些指导会很棒。
更新 1,以及一种明文解决方案我正在读HTTP 标头字段列表 https://en.wikipedia.org/wiki/List_of_HTTP_header_fields“Host”标头不应在 HTTP2 中使用。鉴于这是 gRPC,它是 HTTP2,因此我不应该将其添加为我的 gRPC 客户端请求中的自定义标头。进行虚拟托管时的解决方案,在 gRPC 客户端中,不发送“host”标头,而是发送“:Authority”标头,该值必须对应于 istio 的 gateway+virtualservice 中指定的主机。这对我有用。在我的 Go 客户端中我必须添加dialOptions = append(dialOptions, grpc.WithAuthority("[my-service-1]"))
.
根据该解决方案不适用于 TLSGoDoc grpc.WithAuthority https://godoc.org/google.golang.org/grpc#WithAuthority。所以我仍然需要找到如何在使用 TLS 时从相同的外部 IP 和端口路由 2 个服务。
更新1.1:在虚拟主机中,当使用 TLS 时,SNI 可以在 CLIENT HELLO 消息中传递,而不是像纯文本那样作为 gRPC 标头。根据您的语言,确切的 API 会有所不同,但在 Go 中,我可以通过设置来传递主机名ServerName
领域在tls配置 https://golang.org/pkg/crypto/tls/#Config。然后,您可以在 istio 网关配置中访问该主机名,并根据 istio 虚拟服务中的该值进行路由。
更新2:我尝试在 AWS Route53 上创建子域,但失败了。首先,我为域创建一个公共托管区域:[redacted]-redacted.us-west-2.elb.amazonaws.com。接下来,在该托管区域中,我创建一条 A 记录,名称=svc1.
[redacted]-redacted.us-west-2.elb.amazonaws.com,route=Classic Load Balancer 的别名,region=us-west-2,负载均衡器=dualstack。[redacted]-redacted.us-west-2 .elb.amazonaws.com。
我稍后测试 svc1.[redacted]-redacted.us-west-2.elb.amazonaws.com 存在一条记录dig
,它不返回答案。但是,dig 确实返回了 [redacted]-redacted.us-west-2.elb.amazonaws.com(不带 svc1 前缀)的 3 个 A 记录,其中包含 3 个负载均衡器的 IP。