目录:
AWS概述
EMR Serverless
AWS VPC及其网络
关于AWS网络架构的思考
AWS S3 和 Lambda 使用
在AWS K8S中部署的业务,有不同的流量路径。
流量进入
客户端请求
普通的客户端流量流向从前到后是:
- 客户端
- 公司网关(endpoint)
- 业务的Endpoint Service
- Load Balancers(监听80和443)
- TargetGroupA(将LB的80端口请求转发到端口A),targetGroupB(将LB的443端口请求转发到端口B)。TargetGroup的实例是需要通过 Auto Scaling Group 来注册的。
- Ingress Nginx,该服务是Load Balancer类型,内部 endpoints 80,443,A 和 B 四个端口,外部 endpoints 是 80 和 443。
- Ingress 通过路由规则将流量转发给业务service,再经过4层的负载均衡将流量发给pod。
通过以上步骤客户端流量到达了服务端。其中1~6部都是公司通用平台负责完成,业务只需要定义好ingress路由规则即可。
网络请求
对于其他第三方从网络上进入的流量,需要通过 API Gateway 来转发到内部网络。其流量从前到后的路径是:
- API GW
- VPC Link (内含NLB)
- NLB(Network Load Balancer) 监听 80 端口
- TargetGroup(将LB的80端口请求转发到端口C),TargetGroup实例由Auto Scaling Group 注册。
- 业务Service改为NodePort类型,监听所有target group实例上C端口的请求。
通过以上步骤,网络流量就可以达到服务端。这部分全部都由业务方自己管理,其中第4步中 ASG 和 客户端请求的第5步的 ASG 是相同的,业务方只需要将其关联上就行:resource "aws_lb_target_group_attachment" "tg_http_attachment"
第2步中VPC Link 关联的 NLB 可以手动创建(包括后面的targetGroup),当流量通过这个手动创建的NLB流向 node节点后,由NodePort类型的Business Service监听。
在AWS上还有一种做法是,Business Service直接定义为 LoadBalancer 类型:
apiVersion: v1
kind: Service
metadata:
name: my-service
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: nlb
spec:
type: LoadBalancer
selector:
app: my-service
ports:
- name: http
protocol: TCP
port: 80
targetPort: 8080
nodePort: 30080
- name: https
protocol: TCP
port: 443
targetPort: 8081
nodePort: 30443
这样AWS 的 EKS 会通过 AWS Load Balancer Controller 自动创建 NLB,只要将 API GW 的 VPC Link 关联上这个自动创建的 NLB 即可。当流量通过这个自动创建的 NLB 流向 node 节点后,由 LoadBalancer 类型的 Business Service 负责监听指定的端口(比如这里监听http请求的30080和https的30443端口)。
相同VPC内的其他服务
对于相同VPC内的其他服务,通过 Route53 将通过域名发出的请求转发到服务的 Endpoint,然后进入客户端请求的第3步。
流量到互联网
对于出去的流量,在 AWS 中有两种方式,一种是通过 NAT 出,一种是通过 Internet Gateway 直接出。
普通的 VPC 的子网是私有子网,不能直接与 Internet 通信,因此需要通过 NAT 转发到网络上。具体请参考博主另一篇文章 AWS VPC 网络。
由于流量从 NAT 出去的,所以网络的出口 ip 即 NAT 的 ip 地址。
如果 VPC 的子网是公有的,则可以直接与 Internet 通信,无需经过 NAT 转换。网络出口地址是 EC2 实例的 公有 ip 地址。
NAT 局限
正常服务到公网的流量走NAT就够了,但是如果服务需要大量建立与第三方某域名的连接,如代理服务,可能会出现 NAT 并发连接错误。举个例子来说,假设现在代理服务需要建立60万个连接来访问腾讯的某个域名,而该域名只能解析出5个ip地址。默认情况下,公有 NAT 网络只能关联2个弹性IP地址,每个弹性ip地址最多支持与唯一目标(由目标ip,端口和协议组合标识)建立55000个并发连接。因此两个弹性ip与5个目标ip最多同时建立 55000 * 2 * 5 = 550000 个连接。
在这种情况下,NAT 就会出现并发连接错误,即使只有55万个连接,这些连接也不是平均分配到不同目标的,显然也会出现并发连接错误。此时经 NAT 转发网络请求的方案是有问题的,可以考虑直接使用公有子网来访问网络。