我可以为由 Istio 配置的经典 AWS ELB 定义子域吗?

mip*_*pnw 5 amazon-web-services amazon-elb grpc istio kubernetes-ingress

我在 AWS EKS 托管的 Kubernetes 集群中部署了 Istio。这创建了一个名为 istio-ingressgateway 的 LoadBalancer 类型的 Kubernetes 服务,外部主机名为[redacted]-redacted.us-west-2.elb.amazonaws.com,并自动配置了一个 AWS ELB,类型为经典。那太棒了。(注意:在 AWS 控制台中,我没有看到此 elb 主机名的托管区域,看起来我无法配置别名或诸如此类的东西)

我已经能够通过定义一个打开端口 80 的 istio 网关host:"*",并定义一个将端口 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以及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 标头字段列表中阅读的一种纯文本解决方案, “主机”标头不应在 HTTP2 中使用。鉴于这是 gRPC,它是 HTTP2,因此我不应该将它添加为我的 gRPC 客户端请求中的自定义标头。做虚拟主机时的解决方法,在gRPC客户端,不是发送“host”header,而是发送“:Authority”header,该值必须对应istio的gateway+virtualservice中指定的host。这对我有用。在我的 Go 客户端中,我必须添加dialOptions = append(dialOptions, grpc.WithAuthority("[my-service-1]")).

根据GoDoc grpc.WithAuthority ,该解决方案不适用于 TLS 。所以我仍然需要找到在使用 TLS 时如何从相同的外部 IP 和端口路由 2 个服务。

更新 1.1: 在虚拟主机中,当使用 TLS 时,SNI 可以在 CLIENT HELLO 消息中传递,而不是像纯文本那样作为 gRPC 标头。根据您的语言,确切的 API 会有所不同,但在 Go 中,我能够通过ServerNametls.Config 中设置字段来传递主机名。然后,您可以在 istio 网关配置中对该主机名进行门控,并根据您的 istio 虚拟服务中的该值进行路由。

更新 2:我尝试在 AWS Route53 上创建子域,但失败了。首先,我为域创建一个公共托管区域:[redacted]-redacted.us-west-2.elb.amazonaws.com。接下来,在该托管区域中,我创建了一个 A 记录,其名称为 name= svc1.[redacted]-redacted.us-west-2.elb.amazonaws.com, route=Alias to Classic Load Balancer, region=us-west-2, load balancer =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。

jt9*_*t97 0

伊斯蒂奥

我可以为通过部署 Istio 自动配置的经典 AWS ELB 创建的域定义子域 svc1 和 svc2 吗?如果可以,如何定义?

你不能使用 istio 来做到这一点,你必须在云中配置它,在你的情况下,你必须在 aws 上配置它。

在 istio 上,您只能指定主机,这将是在 aws 上配置的子域。

虚拟服务看起来像这样:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: mipnw-vs1
spec:
  hosts:
  - svc1.example.com
  http:
  - name: "svc1-route"
    match:
    - uri:
        prefix: /
    route:
    - destination:
        host: svc1.default.svc.cluster.local

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: mipnw-vs2
spec:
  hosts:
  - svc2.example.com
  http:
  - name: "svc2-route"
    match:
    - uri:
        prefix: /
    route:
    - destination:
        host: svc2.default.svc.cluster.local
Run Code Online (Sandbox Code Playgroud)

我很想了解如何为域“[redacted]-[redacted].us-west-2.elb.amazonaws.com”创建 2 个子域“abc”和“def”

我不太确定这就是您正在寻找的东西,但我在 aws 文档中进行了一些研究,发现您可以使用Amazon Route 53来实现您所需要的。

Amazon Route 53 是一项高度可用且可扩展的云域名系统 (DNS) Web 服务。它旨在为开发人员和企业提供极其可靠且经济高效的方式,通过将www.example.com等名称转换为 192.0.2.1 等数字 IP 地址,将最终用户路由到 Internet 应用程序

以下信息收集自:

如果您在多个 Amazon EC2 实例上托管网站,您可以使用Elastic Load Balancing (ELB) 负载均衡器在这些实例之间分配网站的流量。当您网站的流量随时间变化时,ELB 服务会自动扩展负载均衡器。负载均衡器还可以监控其注册实例的运行状况,并将域流量仅路由到运行状况良好的实例。

要将域流量路由到ELB 负载均衡器,请使用Amazon Route 53创建指向您的负载均衡器的别名记录。别名记录是DNS 的 Route 53 扩展。它类似于 CNAME 记录,但您可以为根域(例如 example.com)和子域(例如 www.example.com)创建别名记录。(您只能为子域创建 CNAME 记录。)

Amazon Route 53 还提供别名记录,这是 Amazon Route 53 特定的 DNS 扩展。您可以创建别名记录以将流量路由到选定的 AWS 资源,包括Amazon Elastic Load Balancing 负载均衡器、Amazon CloudFront 分配、AWS Elastic Beanstalk 环境、API 网关、VPC 接口终端节点以及配置为网站的 Amazon S3 存储桶。别名记录通常具有 A 或 AAAA 类型,但它们的工作方式类似于 CNAME 记录。使用别名记录,您可以将记录名称 (example.com) 映射到 AWS 资源的 DNS 名称 (elb1234.elb.amazonaws.com)。解析程序可以查看 A 或 AAAA 记录以及 AWS 资源的 IP 地址。

还有关于子域的问题

我可以在我的子域中使用“别名”记录吗?

是的。您还可以使用别名记录将子域(www.example.com、 pictures.example.com 等)映射到ELB 负载均衡器、CloudFront 分配或 S3 网站存储桶。

其他资源: