一、背景
AWS Elastic Load Balancer(简称ELB)有Application Load Balancer(简称ALB)和Network Load Balancer(简称NLB)两种。其中NLB是四层负债均衡器,常用于TCP/UDP协议的转发。又因为NLB支持使用固定的EIP或者内网IP作为流量入口,所以在特定场景下也会使用NLB转发HTTP和HTTPS流量。
NLB有两种类型,别分是Internet-facing和Internal NLB。前者用于直接对外提供互联网入口,对内连接到VPC内的内网资源;后者用于完全在VPC内的场景,其流量入口和目标组(Target Group)都是内网资源。
本文介绍如何查询NLB使用的IP地址。
二、通过界面查询NLB使用的IP地址
1、获取NLB的ARN ID
查询NLB使用的IP地址最直观的方式是通过AWS控制台完成。
首先进入AWS控制台,进入EC2界面,在左侧菜单中进入负载均衡器界面,查看当前的NLB。在负载均衡器的界面下,找到负载均衡器的ARN ID,例如如下:
arn:aws-cn:elasticloadbalancing:cn-northwest-1:420029960748:loadbalancer/net/GWLB-K8S-NLB/5d7541c3c34b9247
在这串ARN里边,获取关键字GWLB-K8S-NLB/5d7541c3c34b9247
,将用于稍后的查询。
2、在ENI网卡中检索关键字
进入EC2界面,在左侧菜单的Network & Security
菜单下,进入Network Interfaces
菜单,即可查看当前所有的ENI网卡。如下截图。
在以上截图中,使用NLB的名字做过滤,然后将滚动条向屏幕右侧移动,即可看到这个NLB是带有EIP的Internet-facing的NLB,同时也可以看它在内网的私有IP地址。
三、通过AWSCLI查询EKS服务创建的NLB所使用的IP地址
1、查询NLB信息
在配置好AWSCLI密钥的环境上,执行如下命令:
aws elbv2 describe-load-balancers --query 'LoadBalancers[*].LoadBalancerName'
由此将输出所有的NLB信息如下:
[
"k8s-default-phpdemo-09b2a08c2e",
"GWLB-K8S-NLB",
"k8s-default-servicen-3c94f843ab",
"GWLB-0af7f0b5ff10"
]
(END)
由此可看到,有两个NLB是EKS创建的Service NLB的地址。接下来确认下要查询的是隶属于哪一个EKS上的服务。
2、确认NLB与EKS上服务的对应关系
在配置了kubeconfig的能操作EKS的机器上,执行如下命令查询EKS创建的NLB信息,可以看到返回结果如下:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.50.0.1 <none> 443/TCP 21h
phpdemo LoadBalancer 10.50.0.7 k8s-default-phpdemo-09b2a08c2e-1f8eb1a58029c7d7.elb.cn-northwest-1.amazonaws.com.cn 80:31607/TCP 4m26s
service-nginx LoadBalancer 10.50.0.167 k8s-default-servicen-3c94f843ab-71646826f521646b.elb.cn-northwest-1.amazonaws.com.cn 80:30316/TCP 14h
在以上信息中,即可看到两个不同的Service分别使用的NLB的完整名称。我们以服务service-nginx
为例,获取到的NLB的完整地址是k8s-default-servicen-3c94f843ab-71646826f521646b.elb.cn-northwest-1.amazonaws.com.cn
。将这个地址和上一步查询NLB对照,在查询NLB时候返回的信息是k8s-default-servicen-3c94f843ab
,这里就能看到相同的ID,即可定位到要查询的是哪一个NLB。
现在将上一步查询确认的id复制下来,下一步查询会使用。
3、查询私有NLB使用的IP地址
构建如下查询命令,将上一步获得的NLB的ID填写到如下查询语句的Values位置,并且前后都要加上通配符*
。填写完毕后拼接如下:
aws ec2 describe-network-interfaces --filters Name=description,Values="*k8s-default-servicen-3c94f843ab*" --query 'NetworkInterfaces[*].[Description,AvailabilityZone,PrivateIpAddress,SubnetId]'
以上命令很长,请保持不要换行。查询结果如下:
[
[
"ELB net/k8s-default-servicen-3c94f843ab/71646826f521646b",
"cn-northwest-1b",
"10.2.102.201",
"subnet-071ddd4c1f4fad71a"
],
[
"ELB net/k8s-default-servicen-3c94f843ab/71646826f521646b",
"cn-northwest-1a",
"10.2.101.225",
"subnet-0f8b54b9d6813d041"
]
]
(END)
由此即可获得要查询的NLB对应的IP地址。
4、查询公有NLB的EIP和内网IP
查询公有NLB的EIP和内网IP的方法是在查询私有IP的基础上,在查询条件部分增加一个对Association.PublicIp
字段的查询。例如构建如下查询语句:
aws ec2 describe-network-interfaces --filters Name=description,Values="*GWLB-K8S*" --query 'NetworkInterfaces[*].[Description,AvailabilityZone,PrivateIpAddress,SubnetId,Association.PublicIp]'
查询结果如下:
[
[
"ELB net/GWLB-K8S-NLB/5d7541c3c34b9247",
"cn-northwest-1a",
"192.168.1.118",
"subnet-0f8e31ff9e3a2ee62",
"161.189.59.242"
],
[
"ELB net/GWLB-K8S-NLB/5d7541c3c34b9247",
"cn-northwest-1b",
"192.168.2.94",
"subnet-0c0fec83cd4fe1b0f",
"52.83.193.201"
]
]
(END)
四、参考文档
Elastic Load Balancing 发送到我的 Web 服务器的流量的源 IP 地址是什么?
https://aws.amazon.com/cn/premiumsupport/knowledge-center/elb-find-load-balancer-IP/