#### 背景 ``` 1、kubernetes中某个nginx需要反向代理某个svc,虽然svc对应的pod有扩缩容或更新,或者svc重建时,svc链接不变,但是对应的ip已发生了变化。 2、proxy_pass配置的链接,nginx会在请求dns后,把对应的ip信息缓存起来,后续请求就一直使用缓存ip,直到nginx重启 ``` #### 目的 ``` 实现nginx热更新,即每次请求都使用新的ip地址 ``` #### 方法 ``` nginx使用resolver与set关键字。 resolver用于解析dns,set用于定义变量 ``` #### 具体实现 nginx的server配置段需要配置如下内容 ``` # server { listen 80; server_name localhost; # DNS resolver kube-dns.kube-system.svc.cluster.local valid=1s; # test # test命名空间中的一个端口为8080的service set $test test-svc.test.svc.cluster.local:8080; location / { proxy_pass http://$test; ## 后面不能跟/ proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ``` *** 问题来了 *** ``` 当需要反向代理多个后端,或者访问的uri中需要加字符串标识(即location不是/,反向代理需要加上/,实际访问后端链接不带location配置的字符串)时,实际访问的链接,是非期望的。 ``` *** 解决方法 *** ``` # server { listen 80; server_name localhost; # DNS resolver kube-dns.kube-system.svc.cluster.local valid=1s; # test # test命名空间中的一个端口为8080的service set $test test-svc.test.svc.cluster.local:8080; location /test/ { rewrite ^/test/(.*) /$1 break; proxy_pass http://$test; ## 后面不能跟/ proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ```