【问题标题】:ELB(Classic Load Balancer) Proxy Protocol Not working on Kubernetes ClusterELB(经典负载均衡器)代理协议不适用于 Kubernetes 集群
【发布时间】:2019-02-09 02:37:28
【问题描述】:
  • 在 AWS (EKS) 上创建了 K8s 集群。
  • 已创建部署工作负载。
  • 使用注释 service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*" 创建了服务类型负载均衡器 (应该在 ELB 上启用代理协议)TCP 端口 4334。

所以在我的 pod 中,我无法看到保留客户端 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"
        }
    }
]

【问题讨论】:

  • 出于好奇,我尝试使用命令“set-load-balancer-policies-of-listener --load-balancer-port 4334”将“k8s-proxyprotocl-enabled”添加到侦听器策略中—— policy-names k8s-proxyprotocol-enabled --region us-east-1 抛出此错误:调用 SetLoadBalancerPoliciesOfListener 操作时发生错误(InvalidConfigurationRequest):无法启用 k8s-proxyprotocol-enabled

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


【解决方案1】:

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

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

我通过带有上述注释的 LoadBalancer 服务类型公开了 ingress-nginx 控制器,当以设置为 debug 的日志记录级别运行它时,我可以看到每个客户端请求都保留了真实的源 IP:

172.20.32.78 - [172.20.32.78] - - [08/Feb/2019:18:02:43 +0000] "代理 TCP4 xxx.xxx.xxx.xx 172.20.xx.xxx 42795 80" 400 157 " -" "-" 0 0.172 []


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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 2019-01-02
    • 2019-04-21
    • 2017-07-28
    相关资源
    最近更新 更多