詳細(xì)聊聊K8s容器內(nèi)nginx帶變量的域名解析
如果 nginx 的 proxy_pass 指令帶有變量名的話:
server {
server_name ~^(\w+)\.example\.com$;
location / {
proxy_pass http://svc-$1;
}
}
不配置 resolver 是不能使用的(雖然可以成功加載配置):
$ curl --resolve 'a.example.com:80:127.0.0.1' a.example.com <html> <head><title>502 Bad Gateway</title></head> <body bgcolor="white"> <center><h1>502 Bad Gateway</h1></center> <hr><center>nginx/1.14.2</center> </body> </html>
nginx 的錯(cuò)誤日志:
[error] 615#615: *1 no resolver defined to resolve svc-a
查看當(dāng)前的 resolve 配置:
$ cat /etc/resolv.conf search default.svc.cluster.local svc.cluster.local cluster.local nameserver 10.152.183.10 options ndots:5
嘗試把它添加到 nginx 的配置里面:
server {
server_name ~^(\w+)\.example\.com$;
location / {
resolver 10.152.183.10;
proxy_pass http://svc-$1;
}
}
結(jié)果是仍然不能可用:
[error] 3817#3817: *10 svc-a could not be resolved (3: Host not found)
nginx 要求配置 resolver 指令,那么可以猜測,它沒有使用系統(tǒng)的 resolve.conf 文件,也就是:不走系統(tǒng)那一套來解析域名。 所以現(xiàn)在的差異就在于下面 search 這一行了:
search default.svc.cluster.local svc.cluster.local cluster.local
search 指令的用途:當(dāng)名字無法解析時(shí),加上這些后綴再嘗試解析。
根據(jù) K8s 的 Service 的 DNS 文章所言可以推測:
- cluster.local 是 K8s 的 cluster_domain
- default.svc.cluster.local 是名字空間的域名( default 是我的名字空間)
而服務(wù)的域名則是:<服務(wù)>.<名字空間域名>。
所以當(dāng)我 curl svc-a 的時(shí)候,實(shí)際上返回的是 svc-a.default.svc.cluster.local 的結(jié)果:
$ host svc-a svc-a.default.svc.cluster.local has address 10.152.183.160 $ host svc-a.default svc-a.default.svc.cluster.local has address 10.152.183.160 $ host svc-a.default.svc svc-a.default.svc.cluster.local has address 10.152.183.160 $ host svc-a.default.svc.cluster.local svc-a.default.svc.cluster.local has address 10.152.183.160
看出來了嗎?以上命令省略的恰好是 search 指令列出來的部分。
但是,nginx 的 resolver 不支持 search,所以應(yīng)該寫完整的域名。
server {
server_name ~^(\w+)\.example\.com$;
location / {
resolver 10.152.183.10;
proxy_pass http://svc-$1.default.svc.cluster.local;
}
}
以上這樣配置就沒有問題了。 但是,hardcode 了一個(gè) resolver,不好,得去掉,用服務(wù)名的方式找到 K8s DNS 的域名。 我的 K8s 的域名是 kube-dns 服務(wù)提供的,名字空間是 kube-system,所以完整的 resolver 是: kube-dns.kube-system.svc.cluster.local。
$ host kube-dns.kube-system.svc.cluster.local kube-dns.kube-system.svc.cluster.local has address 10.152.183.10
最終的 nginx 配置:
server {
server_name ~^(\w+)\.example\.com$;
location / {
resolver kube-dns.kube-system.svc.cluster.local;
proxy_pass http://svc-$1.default.svc.cluster.local;
}
}
其中的變量,應(yīng)該按你的場景來修改:
kube-dns 是我的集群使用的 DNS 服務(wù)
kube-system 是我的 DNS 服務(wù)所在的名字空間
default 是我的名字空間
cluster.local 是集群域名(cluster_domain)
有至少兩種方式可以拿到這個(gè)集群域名:
/etc/resolv.conf 文件的 search 指令。
這是 kubelet 的一個(gè)啟動(dòng)參數(shù),可以找到你的集群啟動(dòng)參數(shù)來獲取到。 我這里用的是 microk8s 搭建的測試集群,其中就有一個(gè)集群域名參數(shù)的值。
$ ps aux|grep kubelet root 728595 16.0 11.1 3549776 872556 ? Ssl 02:25 9:44 /snap/microk8s/2870/kubelite --scheduler-args-file=/var/snap/microk8s/2870/args/kube-scheduler --controller-manager-args-file=/var/snap/microk8s/2870/args/kube-controller-manager --proxy-args-file=/var/snap/microk8s/2870/args/kube-proxy --kubelet-args-file=/var/snap/microk8s/2870/args/kubelet --apiserver-args-file=/var/snap/microk8s/2870/args/kube-apiserver --kubeconfig-file=/var/snap/microk8s/2870/credentials/client.config --start-control-plane=true $ cat /var/snap/microk8s/2870/args/kubelet ... --cluster-domain=cluster.local ...
由于集群域名不是變化的量,所以每次從文件里面讀取并無必要(第一種方式),所以推薦第二種。
總結(jié)
到此這篇關(guān)于K8s容器內(nèi)nginx帶變量域名解析的文章就介紹到這了,更多相關(guān)K8s容器內(nèi)nginx域名解析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Nginx防盜鏈和Nginx訪問控制與Nginx解析php的配置
這篇文章主要介紹了詳解Nginx防盜鏈和Nginx訪問控制與Nginx解析php的配置的相關(guān)資料,這里提供實(shí)例幫助大家,學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下2017-08-08
Mac中使用Nginx實(shí)現(xiàn)80端口轉(zhuǎn)發(fā)8080端口
端口轉(zhuǎn)發(fā)(Port forwarding),有時(shí)被叫做隧道,是安全殼(SSH) 為網(wǎng)絡(luò)安全通信使用的一種方法。端口轉(zhuǎn)發(fā)是轉(zhuǎn)發(fā)一個(gè)網(wǎng)絡(luò)端口從一個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)到另一個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)的行為,其使一個(gè)外部用戶從外部經(jīng)過一個(gè)被激活的NAT路由器到達(dá)一個(gè)在私有內(nèi)部IP地址(局域網(wǎng)內(nèi)部)上的一個(gè)端口2017-09-09
nginx網(wǎng)站服務(wù)如何配置防盜鏈(推薦)
這篇文章主要介紹了nginx網(wǎng)站服務(wù)如何配置防盜鏈,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
nginx如何將http訪問的網(wǎng)站改成https訪問
這篇文章主要介紹了nginx如何將http訪問的網(wǎng)站改成https訪問,幫助大家更好的理解和使用nginx,感興趣的朋友可以了解下2021-02-02
Nginx配置之實(shí)現(xiàn)多臺(tái)服務(wù)器負(fù)載均衡
這篇文章主要介紹了Nginx配置之實(shí)現(xiàn)多臺(tái)服務(wù)器負(fù)載均衡,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07

