在前面我们已经能查看到对应项目访问的日志了,但是可以发现一个问题就是nginx记录的日志里面ip是kubernetes给集群组件分配的ip,示例图如下:
所以这里我们看到的数据其实就是不准确的了,那此时怎么办呢?我们需要调整下,这里调整的内容比较多,我们来挨个介绍下:
1)修改ingressNginxController的configmap
这里第一步我们修改的主要是ingressNginxController的configmap文件,这里和主流网上的介绍是一样的,也就是在configmap里面添加几个内容:
compute-full-forwarded-for: 'true' forwarded-for-header: X-Forwarded-For use-forwarded-headers: 'true'
这里具体修改步骤如下:
1、登录kuboard界面
然后我们切换名称空间,把名称空间换成ingress-nginx
然后我们点击下面的配置中心
再点击配置字典
然后我们找到右侧带有标签的controller
点击右侧的查看按钮:
然后点击编辑按钮,把上面三个内容给他添加进去:
添加进去之后,这里我们就编辑完毕了,查看yaml文件的时候,可以看到有data相关的数据:
2)修改ingressNginxController的service
当我们创建一个ingress的时候,其实ingress也可以算作是一个pod在运行,我们可以通过kuboard页面的工作负载看到:
点击进去我们可以把它看作是一个pod在运行:
所以这里我们需要修改它的service,这里我们找到服务模块:
在右侧我们可以看到对外提供服务的service
这里我们点击右侧的yaml文件,找到externalTrafficPolicy这个可以,把它配置为Local
编辑完毕之后我们点击保存即可。
此时我们再访问下这个show-web
然后登录这个show-web的pod,查看下日志:
然后我们看到获取到的ip是10.234.240.55,这是我们ingress pod的ip:
到这里我们肯定纳闷,这个配置没生效啊,获取到的还不是真实的ip,这也是很多小伙伴可能配置了ingress之后还是无法获取到真实ip的问题。
其实这里我们配置是没有问题的,只是nginx的日志输出字段和我们理想的不一样,所以这里我们修改下nginx的日志输出字段即可。如果是使用java代码的话,获取到的ip就是真实的ip了。
3)修改nginx日志输出
这里我们继续回到前面VUE的项目中,详见《Kubernetes部署微服务实战(一)打包VUE项目》,在这里我们创建一个nginx.conf文件,示例内容如下:
user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format weblog '$http_x_forwarded_for - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" '; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; real_ip_header X-Forwarded-For; real_ip_recursive on; include /etc/nginx/conf.d/*.conf; }
这个文件我们没有啥改变,主要是因为需要添加一个log_format的输出,因此需要替换掉容器原来自带的log_format,因此这里我们的Dockerfile文件也需要改下,最新的Dockerfile文件示例内容如下:
FROM nginx:latest MAINTAINER "admin" LABEL description="docker show test" COPY dist/ /www/test/ COPY default.conf /etc/nginx/conf.d/default.conf COPY nginx.conf /etc/nginx/nginx.conf env.UTF-8
这里主要是添加了一个把nginx.conf文件拷贝到容器里面去的过程。
接着我们修改下default.conf文件,在输出日志的时候,添加上刚才的日志级别weblog,完整的default.conf文件内容如下:
server { listen 9000; server_name localhost; location / { root /www/test/; proxy_set_header Host $host; try_files $uri $uri/ /index.html; index index.html index.htm; } error_log /var/log/nginx/show-error.log; access_log /var/log/nginx/show-access.log weblog; location /school { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header x-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://192.168.31.200:32081; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
然后我们把整个VUE项目重新打包,版本为2.0
然后修改下k8s里面的show-web,把镜像版本修改为2.0
然后点击保存,等待show-web启动起来,我们再访问下show-web应用,然后进入到容器查看日志,此时我们就可以看到nginx输出的是我本地的ip了
以上就是配置ingress-nginx获取真实ip的案例。
还没有评论,来说两句吧...