2 KiB
2 KiB
背景
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;
}
}