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

如何解决我可以为Istio所配置的经典AWS ELB定义子域吗?

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

通过定义一个将端口80打开到host:"*"的istio网关,并定义一个路由的istio虚拟服务,我已经能够将在集群外部运行的gRPC客户端连接到在集群中运行的gRPC服务器。端口80到我的目的地(一些kubernetes服务的某个端口)。到目前为止一切顺利。

现在,我想对集群中的第二个gRPC端点执行此操作。据我所知,我的选择是:通过在入口处打开第二个端口(例如81)进行路由(我现在暂时不选择这样做)。或通过定义[redacted]-redacted.us-west-2.elb.amazonaws.com的子域进行路由,或通过实现“虚拟托管”(即客户端在标头中发送host:"svc1"的同一域上的两个服务进行路由)。

这就是我被困住的地方。我不知道如何为该ELB域名定义子域,也不知道我是否可以使用TLS进行虚拟托管,如果可以,我是否仍可以使用Istio的“直通” tls模式以免TLS在网关上终止。

1-使用子域::在我的开发人员机器上,我尝试getent hosts svc1.[redacted]-redacted.us-west-2.elb.amazonaws.com并没有映射到IP,但是如果删除了svc1前缀,DNS将返回3个IP(猜测us-west-2中的3个可用区)。因此,我无法在没有任何工作的情况下将svc1作为域的前缀。

我可以为通过部署Istio自动置备的经典AWS ELB创建的域定义子域svc1svc2吗?我可以使用kubectl/istioctl来配置Istio,还是需要使用AWS CLI来做到这一点?可以在不注册域的情况下完成此操作,我可以使用不友好的elb.amazonaws.com主机名吗?

2-虚拟主机:或者,我可以在gRPC元数据中添加host = svc1。我尝试将ctx := metadata.AppendToOutgoingContext(context.Background(),"Host","svc1")添加到我的Go客户端中,但这没用。

一些指导会很棒。

更新1和一种用于纯文本的解决方案 我在List of HTTP header fields上阅读,“ Host”标头不应在HTTP2中使用。鉴于这是gRPC,它是HTTP2,因此我不应该在我的gRPC客户端请求中将其添加为自定义标头。在进行虚拟托管时,在gRPC客户端中而不是发送“主机”标头,而是发送“:Authority”标头的解决方案,该值必须对应于istio的gateway + virtualservice中指定的主机。这对我有用。在我的Go客户端中,我必须添加dialOptions = append(dialOptions,grpc.WithAuthority("[my-service-1]"))

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

更新1.1: 在虚拟主机中,当使用TLS时,可以在CLIENT HELLO消息中传递SNI,而不是像纯文本中那样是gRPC头。取决于您的语言,确切的API将有所不同,但是在Go语言中,我可以通过在tls.Config中设置ServerName字段来传递主机名。然后,您可以在istio网关配置中选择该主机名,并在istio虚拟服务中基于该值进行路由。

更新2:我尝试但未能在AWS Route53上创建子域。首先,我为domain:[redacted-redacted.us-west-2.elb.amazonaws.com]创建一个公共托管区域。接下来,在该托管区域中,我创建一个名称为{svc1. [redacted] -redacted.us-west-2.elb.amazonaws.com的A记录,route = Alias到Classic Load Balancer,region = us-west -2,负载均衡器=双堆栈。[已编辑] -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。

解决方法

Istio

我可以为通过部署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

Aws

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

我不确定您要寻找的是什么,但是我在aws文档中进行了一些研究,发现可以使用Amazon Route 53来实现所需的功能。

Amazon Route 53是一种高度可用且可扩展的云域名系统(DNS)Web服务。它旨在通过将名称www.example.com转换为数字IP地址(例如192.0.2.1

),为开发人员和企业提供一种极其可靠且经济高效的方式来将最终用户路由到Internet应用程序

以下信息收集自:

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

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

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资源(elb1234.elb.amazonaws.com)的DNS名称。解析程序会看到A或AAAA记录以及AWS资源的IP地址。

还有关于子域的问题

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

是的。您还可以使用Alias记录将子域(www.example.com,pictures.example.com等)映射到 ELB负载均衡器,CloudFront发行版或S3网站存储桶。 / p>

其他资源:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?