详细聊聊K8s容器内nginx带变量的域名解析

详细聊聊K8s容器内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 的错误日志:

[error] 615#615: *1 no resolver defined to resolve svc-a

查看当前的 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; } }

结果是仍然不能可用:

[error] 3817#3817: *10 svc-a could not be resolved (3: Host not found)

nginx 要求配置 resolver 指令,那么可以猜测,它没有使用系统的 resolve.conf 文件,也就是:不走系统那一套来解析域名。 所以现在的差异就在于下面 search 这一行了:

search default.svc.cluster.local svc.cluster.local cluster.local

search 指令的用途:当名字无法解析时,加上这些后缀再尝试解析。

根据 K8s 的 Service 的 DNS 文章所言可以推测:

cluster.local 是 K8s 的 cluster_domain

default.svc.cluster.local 是名字空间的域名( default 是我的名字空间)

而服务的域名则是:<服务>.<名字空间域名>。

所以当我 curl svc-a 的时候,实际上返回的是 svc-a.default.svc.cluster.local 的结果:

$ 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,所以应该写完整的域名。

server { server_name ~^(\w+)\.example\.com$; location / { resolver 10.152.183.10; proxy_pass http://svc-$1.default.svc.cluster.local; } }

以上这样配置就没有问题了。 但是,hardcode 了一个 resolver,不好,得去掉,用服务名的方式找到 K8s DNS 的域名。 我的 K8s 的域名是 kube-dns 服务提供的,名字空间是 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; } }

其中的变量,应该按你的场景来修改:

kube-dns 是我的集群使用的 DNS 服务kube-system 是我的 DNS 服务所在的名字空间default 是我的名字空间cluster.local 是集群域名(cluster_domain)

有至少两种方式可以拿到这个集群域名:

/etc/resolv.conf 文件的 search 指令。这是 kubelet 的一个启动参数,可以找到你的集群启动参数来获取到。 我这里用的是 microk8s 搭建的测试集群,其中就有一个集群域名参数的值。

$ 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 ...

由于集群域名不是变化的量,所以每次从文件里面读取并无必要(第一种方式),所以推荐第二种。

总结 

到此这篇关于K8s容器内nginx带变量域名解析的文章就介绍到这了,更多相关K8s容器内nginx域名解析内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    学习写字楼新选择6000元主流配置

    学习写字楼新选择6000元主流配置,,这种配置需要考虑双核心的办公和娱乐平台,充分考虑办公室的办公需求和娱乐需求,以约6000元的预算和cost-e

    酷睿I7 配置

    酷睿I7 配置,配置,玩家国度啦华硕 Rampage II Extreme(3800元)如果米不够,也可以把Extreme改为Gene,不过是小板内存推荐金士顿6G DDR3 2000骇

    提高3A四核羿龙II游戏配置的性能

    提高3A四核羿龙II游戏配置的性能,,以节能环保为主题的IT产业,目前3A低端平台处理器、主板芯片组、独立开发卡性能突出,特别是在与AMD的处理

    opporeno8参数配置及价格

    opporeno8参数配置及价格,面部,亿元,Oppo的荣誉2020年1月4日,接近屏幕关闭传感器是否支持双卡:支持oppor11splus什么时候上市的Oppo R11S P

    查看配置:酷睿i3530集展示办公平台

    查看配置:酷睿i3530集展示办公平台,,由于时间和精力的关系,我们不可能对所有的配置进行评论,希望我们能理解,我希望我们的评论能在那些需要帮

    3500元超额值学生娱乐结构的优化配置

    3500元超额值学生娱乐结构的优化配置,,作为一个DIY的主流用户领域的学生,每个用户51学生攒机的高峰。因为学生用户没有稳定的收入来源,攒机

    电脑配置快捷键|查看电脑配置快捷键

    电脑配置快捷键|查看电脑配置快捷键,,查看电脑配置快捷键1.在win10中,快捷键组合win+E已经变成了“快速访问”,不再是以前的“我的电脑了”2

    6000元教你黑盒5000+权限配置

    6000元教你黑盒5000+权限配置,,一系列的价格后,最经典的AMD双核处理器mdash;mdash;Athlon 64 X2 5000 +黑版mdash;mdash;目前的价格已经低至565