K8S ingress 传递用户真实IP
作者:myluzh 分类: Kubernetes 长度:2392 阅读:727
0x01 前言
今天发现后端获取到的用户客户端ip都是内网地址 172.29.241.163。
访问逻辑为:用户访问->nginx->k8s-ingress->后端pod。
但是后端pod获取客户端的ip一直是172.29.241.163,原来这个ip的ingress的上游nginx的ip。
# nginx节点
root@iZbp12bkuvg20e1j3y9gtvZ:/etc/nginx/conf.d# ifconfig | grep 172
inet 172.29.241.163 netmask 255.255.240.0 broadcast 172.29.255.255
# nginx反向代理到k8s-ingress的配置文件
root@iZbp12bkuvg20e1j3y9gtvZ:/etc/nginx/conf.d# cat prd-all.conf
upstream prd-nginx-server {
server 172.29.241.160:80;
server 172.30.82.215:80;
keepalive 10;
keepalive_requests 100;
}
server {
listen 80;
server_name *.xxxxx.com;
#root html;
#index index.html index.htm;
client_max_body_size 10m;
location / {
proxy_set_header Host $host;
# 这里nginx已经配置了将客户端的真实IP地址传递给后端的服务器,证明没问题
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://prd-nginx-server/;
}
}
排障思路为:
1、首先查看nginx这侧的配置文件,有没有把remote地址转发给ingress,发现是存在的。
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
2、那问题就在ingress上了,ingress没有把上游nginx的header转发到下面,经过一番折腾定位到了问题原因,通常,用户ip的传递依靠的是X-Forwarded-*参数。但是默认情况下,ingress是没有开启的。
0x02 解决
在ingress-nginx-controller的configmap中添加use-forwarded-headers: ture,如下:
root@iZbp12bkuvg20e1j3y9gtxZ:~# kubectl get configmap -n ingress-nginx
NAME DATA AGE
ingress-controller-leader 0 479d
ingress-controller-leader-nginx 0 479d
ingress-nginx-controller 0 479d
kube-root-ca.crt 1 479d
root@iZbp12bkuvg20e1j3y9gtxZ:~# kubectl edit configmap ingress-nginx-controller -n ingress-nginx
apiVersion: v1
kind: ConfigMap
data:
use-forwarded-headers: "true"
...
0x99 参考文章
ingress nginx传递用户真实ip问题
k8s ingress 添加获取客户端真实ip配置
ingress获取客户端真实IP配置记录
解决K8s中Ingress Nginx控制器无法获取真实客户端IP的问题
k8s nginx Ingress ip use-forwarded-headers X-Real-IP X-Forwarded-For