问题
在k8s中使用nginx作为后端接口反向代理,大概配置如下:
location /api {
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://api-server-svc:8080/;
}
其中api-server-svc
是后端服务的service
这个配置会有两个问题:
- 要求
api-server-svc
这个service要先创建,否则nginx启动时会因为无法解析api-server-svc
而启动失败 - nginx服役期间,如果后端服务重启,svc ip改变了,代理会失败,因为nginx缓存了旧ip
解决
修改nginx配置如下:
# dns设置缓存时间5s,解决问题2
resolver kube-dns.kube-system.svc.cluster.local valid=5s;
# 使用变量方式,解决问题1
set $apiserver api-server-svc.xxx.svc.cluster.local;
location /api {
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
rewrite /api/(.*) /$1 break;
proxy_pass http://$apiserver:8080;
}
上述配置文件看起来简单,实际踩了很多坑才研究出来:
坑1
set $apiserver api-server-svc.xxx.svc.cluster.local;
中域名一定要写全域名,不能简写成api-server-svc
。
之前之所以可以简写,因为容器/etc/resolv.conf中有配置了search,在解析域名时会自动帮你补全域名。
但此处我们使用了resolver指定了域名服务器,在解析时是不会自动帮我们补全的
坑2
使用了proxy_pass http://$apiserver:8080;
后,反向代理时url会丢失造成访问404,例如你的请求地址是文章来源:https://www.toymoban.com/news/detail-444605.html
http://xxxx/api/a/b/c
代理后只剩下http://xxxx/
,所以一定要使用 rewrite /api/(.*) /$1 break;
文章来源地址https://www.toymoban.com/news/detail-444605.html
到了这里,关于k8s部署nginx自动更新域名及解除后端依赖的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!