我根据 edge stack docs 和 digitalocean annotations docs 对 Load Balancer 进行了一些更改以捕获真实的客户端 IP。我在负载均衡器中做了以下更改:
服务中:
service.beta.kubernetes.io/do-loadbalancer-enable-proxy-protocol: "false"
service.beta.kubernetes.io/do-loadbalancer-protocol: http
service.beta.kubernetes.io/do-loadbalancer-tls-passthrough: "true"
service.beta.kubernetes.io/do-loadbalancer-redirect-http-to-https: "true"
在模块中:
apiVersion: getambassador.io/v3alpha1
kind: Module
metadata:
name: ambassador
namespace: ambassador
spec:
config:
xff_num_trusted_hops: 1
use_remote_address: false
在这些更改之后,我们能够在 HTTP 请求中检测到客户端 IP “xxx.xxx.xxx.xxx”,如日志中所示:
ACCESS [2022-09-13T08:43:06.434Z] "GET /v1/test/exp1 HTTP/1.1" 301 - 0 0 135 - "xxx.xxx.xxx.xxx" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36" "e0c33ab9-9b8b-43a1-927b-da6c324b16b2" "xyz.example.com" "-"
但是在 HTTPS 上,我们得到的客户端 IP 为 "-":
ACCESS [2022-09-13T08:43:18.619Z] "GET /v1/test/exp1 HTTP/1.1" 200 - 0 2 102 63 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36" "de9b20c1-53bb-447b-b336-45cd532c54c2" "xyz.example.com" "xx.xxx.xxx.xxx:80"
您在 HTTPS 上使用直通时遇到问题,但根据 digital ocean docs for passthrough
SSL 直通在后端分配解密负载 服务器,但每个服务器都必须具有证书信息。你 也不能添加或修改 HTTP 标头,因此您可能会丢失客户端的 IP X-forwarded-* 中包含的地址、端口和其他信息 标题。
根据 DO 文档的建议,我们需要使用证书,这样我们就不会丢失包括 X-Forwarded-For 的 HTTP 标头信息,因此需要以下步骤来解决此问题:
首先,使用此 DO API 创建证书:Create Certificate.
作为回应,您将获得类似于 uuid("892071a0-bb95-49bc-8021-3afd67a210bf") 的证书 ID,保存以备后用。
大使服务做了如下改动:
service.beta.kubernetes.io/do-loadbalancer-enable-proxy-protocol: "false"
service.beta.kubernetes.io/do-loadbalancer-protocol: http
service.beta.kubernetes.io/do-loadbalancer-certificate-id: "<HERE COMES CERTIFICATE ID>"
service.beta.kubernetes.io/do-loadbalancer-redirect-http-to-https: "true"
是否进行 helm upgrade 或 kubectl apply 以反映更改。
就是这样,享受......
我不清楚这个注解必须应用在哪个 Kubernetes 资源上?
它是否在 LoadBalancer 类型的服务上?