查询EKS创建的NLB所使用的IP地址

一、背景

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/