ELB(经典负载平衡器)代理协议不适用于Kubernetes集群

时间:2019-02-07 06:57:50

标签: kubernetes amazon-elb amazon-eks aws-elb

  • 在AWS(EKS)上创建了K8s集群。
  • 创建的部署工作负载。
  • 使用注释service.beta.kubernetes.io/aws-load-balancer-proxy-protocol创建的服务类型负载均衡器:“ *” (应在ELB上启用代理协议)用于TCP端口4334。

因此,在我的窗格中,我看不到保留客户端IP的代理协议。 尝试了数据包嗅探器和tcpdump,但没有看到客户端IP被协议保留的地方。

有人可以告诉我如何验证代理协议是否保留了客户端IP吗?

请参阅下面提到的负载均衡器。它具有名为“ k8s-proxyprotocol-enabled”的策略,该策略应用于实例端口31431上的“ BackendServerDescriptions”。

我观察到的一件事是,在“ ListenerDescriptions”中,实例端口31431策略名称为空。为了使代理协议按预期工作,是否需要在侦听器描述中的侦听器策略上应用“启用k8s-proxyprotocol-enabled”?

任何人都可以确认下面的配置足以使代理协议保留源IP还是必须进行额外的配置?

"LoadBalancerDescriptions": [
    {
        "Subnets": [
            "subnet-1",
            "subnet-2",
            "subnet-2"
        ],
        "CanonicalHostedZoneNameID": "******",
        "CanonicalHostedZoneName": "*************",
        "ListenerDescriptions": [
            {
                "Listener": {
                    "InstancePort": 31431,
                    "LoadBalancerPort": 4334,
                    "Protocol": "TCP",
                    "InstanceProtocol": "TCP"
                },
                "PolicyNames": []
            }
        ],
        "HealthCheck": {
            "HealthyThreshold": 2,
            "Interval": 10,
            "Target": "TCP:31499",
            "Timeout": 5,
            "UnhealthyThreshold": 6
        },
        "VPCId": "vpc-***********",
        "BackendServerDescriptions": [
            {
                "InstancePort": 31431,
                "PolicyNames": [
                    "k8s-proxyprotocol-enabled"
                ]
            }
        ],
        "Instances": [
            {
                "InstanceId": "i-085ece5ecf"
            },
            {
                "InstanceId": "i-0b4741cf"
            },
            {
                "InstanceId": "i-03aea99"
            }
        ],
        "DNSName": "***************************",
        "SecurityGroups": [
            "sg-********"
        ],
        "Policies": {
            "LBCookieStickinessPolicies": [],
            "AppCookieStickinessPolicies": [],
            "OtherPolicies": [
                "k8s-proxyprotocol-enabled"
            ]
        },
        "LoadBalancerName": "a1df476de2aa011e9aabe0af927e6700",
        "CreatedTime": "2019-02-07T06:18:01.020Z",
        "AvailabilityZones": [
            "us-east-1a",
            "us-east-1b",
            "us-east-1c"
        ],
        "Scheme": "internet-facing",
        "SourceSecurityGroup": {
            "OwnerAlias": "906391276258",
            "GroupName": "k8s-elb-a1df476de2aa011e9aabe0af927e6700"
        }
    }
]

1 个答案:

答案 0 :(得分:0)

是的,设置此注释足以在负载均衡器级别(ELB经典版)启用代理协议v1。

  

service.beta.kubernetes.io/aws-load-balancer-proxy-protocol:“ *”

我已经通过带有上述注释的LoadBalancer Service类型公开了Ingress-nginx控制器,并且在将日志记录级别设置为debug的情况下运行它时,我可以看到每个客户端请求都保留了真实的源IP:

  

172.20.32.78-[172.20.32.78]--[08 / Feb / 2019:18:02:43 +0000]“ PROXY TCP4 xxx.xxx.xxx.xx 172.20.xx.xxx 42795 80” 400157“ -“”-“ 0 0.172 []

     
     

xxx.xxx.xxx.xx-是我的私人IP地址,而不是LB一个。

另一件事是在LB的后端启用代理协议,以便它可以正确理解转发的客户端请求(此处描述了NGINX的步骤)。