![](/img/trans.png)
[英]How to reference the EXTERNAL-IP from ingress-nginx-controller in a kubernetes deployment specification?
[英]Updating ingress-nginx-controller ConfigMap to Pass Client IP to Backend Service
在 kube.netes 集群中有一個ingress-nginx-controller
部署,它將請求傳遞給集群內的后端服務,這一切目前都按預期工作。
現在有一個后端服務要求從內部獲取調用者的客戶端 IP 地址,但是,在其默認配置中使用 nginx controller,后端服務在調用HttpServletRequest.getRemoteAddr()
時只能看到 kube.netes 集群的 .network IP 地址HttpServletRequest.getRemoteAddr()
而不是客戶端調用者的 IP 地址。
我知道代理時的請求可以覆蓋客戶端 IP 地址,我假設這就是請求通過 nginx controller 時發生的情況。
我在后端服務中添加了一個調試日志,以打印收到的請求中的所有相關標頭,並且在其默認配置中使用 nginx controller,我在收到的每個請求中看到以下X-
標頭:
x-request-id:3821cea91ffdfd04bed8516586869bdd5
x-real-ip:100.10.75.1
x-forwarded-proto:https
x-forwarded-host:www.myexample.com
x-forwarded-port:443
x-scheme:https
我在不同的地方讀到 nginx 可以配置為在X-Forwarded-For
header 中傳遞客戶端的 IP 地址(例如,從上面的調試日志中可以看出,它目前不包含在客戶端請求中)。
查看ingress-nginx-controller Deployment中的nginx.conf
,后端的域服務器配置有如下設置:
proxy_set_header X-Request-ID $req_id;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $pass_access_scheme;
proxy_set_header X-Forwarded-Host $best_http_host;
proxy_set_header X-Forwarded-Port $pass_port;
proxy_set_header X-Scheme $pass_access_scheme;
# Pass the original X-Forwarded-For
proxy_set_header X-Original-Forwarded-For $http_x_forwarded_for;
執行kubectl describe deploy -n ingress-nginx ingress-nginx-controller
顯示 nginx controller 具有以下配置映射參數:--configmap --configmap=ingress-nginx/ingress-nginx-controller
因此,使用此信息,我需要做什么包含在自定義 yaml 中,然后我可以應用它以覆蓋 nginx 配置設置,使其將客戶端 IP 傳遞到后端服務?
In order to have the nginx controller pass the client's ip address to the backend service I applied the following configmap yaml config:
apiVersion: v1
kind: ConfigMap
metadata:
labels:
helm.sh/chart: ingress-nginx-3.10.1
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/version: 0.41.2
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: controller
name: ingress-nginx-controller
namespace: ingress-nginx
data:
compute-full-forwarded-for: "true"
use-forwarded-headers: "false"
real-ip-header: proxy_protocol
我相信此配置中重要的配置部分是以下行: real-ip-header: proxy_protocol
With this configmap
applied to the nginx controller
I can now see the client's IP address (no longer the kubernetes cluster's network IP address) shown in the request's x-real-ip
header.
傳遞真正的客戶端 IP,無需太多配置更改。 我們需要在 ConfigMap 中使用 use-forwarded-headers: 'true' ,如下面的代碼片段所示。
apiVersion: v1
kind: ConfigMap
metadata:
labels:
helm.sh/chart: ingress-nginx-4.0.15
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/version: 1.1.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: controller
name: ingress-nginx-controller
namespace: ingress-nginx
data:
allow-snippet-annotations: 'true'
ssl-redirect: 'false'
use-forwarded-headers: 'true'
使用轉發頭¶
如果為真,NGINX 會將傳入的 X-Forwarded-* 標頭傳遞給上游。 當 NGINX 位於另一個設置這些標頭的 L7 代理/負載平衡器后面時,請使用此選項。
如果為 false,NGINX 將忽略傳入的 X-Forwarded-* 標頭,並用它看到的請求信息填充它們。 如果 NGINX 直接暴露給 inte.net,或者它位於不會更改數據包中源 IP 的基於 L3/數據包的負載平衡器之后,請使用此選項。
通過啟用此 header,X-Forwarded-* header 將不會被任何內部 IP 附加或替換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.