k8s部署nginx自动更新域名及解除后端依赖

本文介绍了在Kubernetes(k8s)环境中,如何使用Nginx作为后端接口的反向代理,并详细解析了配置过程中的两个问题:1) Nginx启动时依赖后端服务的存在;2) 后端服务重启导致的IP变化影响代理。解决方案包括设置DNS解析缓存时间和使用变量方式避免直接引用服务名。同时,文中还强调了配置细节,如完整域名的使用和rewite规则的必要性,以防止URL丢失引发的404错误。
摘要由CSDN通过智能技术生成

问题

在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
这个配置会有两个问题:

  1. 要求api-server-svc这个service要先创建,否则nginx启动时会因为无法解析api-server-svc而启动失败
  2. 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,例如你的请求地址是

http://xxxx/api/a/b/c

代理后只剩下http://xxxx/,所以一定要使用 rewrite /api/(.*) /$1 break;

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值