背景說明
我們有些私有化部署的項目,使用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就可以了。
?
?