在前面我们已经能查看到对应项目访问的日志了,但是可以发现一个问题就是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的案例。





















还没有评论,来说两句吧...