背景说明
我们有些私有化部署的项目,使用k8s来承载服务,通过ingress-nginx转发外部的请求到集群。有时候业主的域名没有申请下来,我们会配置临时的域名,测试同事配置主机hosts来完成功能验证,等功能验证完毕后,交给业主使用,业主配置hosts比较麻烦,这里通过配置Nginx直接使用公网IP访问服务。
拓扑架构
上面是访问的路径图。在k8s集群上配置了域名为“www.example.com”,
配置实现
在自建k8s集群中,通过IP访问k8s中的服务可以使用NodePort类型的Service来实现,因为集群部署了ingress-nginx ingress controller,这里没有采用NodePort类型的Service。
客户端访问服务时直接使用公网IP地址,请求到达Nginx时没有携带主机头“Host”,请求到达后端k8s集群返回是404状态码,技巧就是在Nginx将请求转发到后端k8s集群时,人为配置上“Host”主机头,这样请求就可以路由到正确的Pod,
Nginx的配置,
upstream k8s-entry {server 192.168.0.2:80; # ingress controller监听地址
}server {listen 80;server_name _; # 捕获全部的请求access_log /var/log/nginx/host.access.log main;location / {proxy_pass http://k8s-entry;proxy_set_header Host www.example.com; # 手动加入Host主机头proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Connection "";proxy_request_buffering off;}}
这样客户端就可以直接通过公网IP来访问服务了,等正式的域名完成备案,替换掉www.example.com就可以了。