文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

如果 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 文章所言可以推测:

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

所以当我 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;
	}
}

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

总结 

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-服务器
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯