Nginx 转发请求到kubernetes集群内的有效方法

490 阅读1分钟

有一些应用场景下我们会在k8s集群内部署nginx,通过自定义路径将请求转发到k8s集群内特定的服务。

查询集群内的DNS解析

cat /etc/resolv.conf

image.png

172.20.0.10 是集群内DNS解析使用的IP

配置nginx的转发

    resolver 172.20.0.10 valid=5s;
    location ^~ /site/domain/check-dns/ {
        set $service xxx-service.[namespace].svc.cluster.local;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_pass http://$service/$request_uri;
    }
  • 利用nginx的resolver动态解析k8s svc域名,获取svc服务endpoint对应的IP;
  • 设置变量$service 定义成svc的内部域名,此域名一定要用集群内完整的地址,格式:service-name.namespace.svc.cluster.local
  • 配置转发 proxy_pass http://$service/$request_uri;利用内置变量$request_uri可以将匹配的URL/site/domain/check-dns一起转发到后端服务。

这样的配置可以解决后端的Pod发生变更(如:更新,迁移)时所有的请求仍可以正常的转发到后端服务。