68 lines
No EOL
2 KiB
Markdown
68 lines
No EOL
2 KiB
Markdown
#### 背景
|
||
```
|
||
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;
|
||
}
|
||
}
|
||
``` |