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
  • 尝试加载到配置里面
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
...

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

抄也是一种态度

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes (k8s) 是一个流行的容器编排和管理工具,它能够自动部署、扩展和管理容器化应用程序。在Kubernetes中,容器一般是通过服务发现的方式来进行通信,在这个过程中,域名解析是至关重要的一环。 容器中的应用程序通常会使用DNS进行域名解析来定位其他容器或外部服务。Nginx作为一个常用的容器化Web服务器,也需要通过DNS解析来将域名转换为IP地址,以便与其他容器或外部服务进行通信。 然而,有时候在Kubernetes集群中,容器域名解析可能会出现不稳定性的问题。这可能导致Nginx无法解析需要的域名,使得容器间的网络通信出现故障或不可靠。 引起这种不稳定性的原因可能是多种多样的。首先,DNS解析问题可能与Kubernetes集群的配置有关。如果DNS服务配置不正确或不稳定,容器中的Nginx就无法准确地解析域名。 其次,网络问题也可能导致DNS解析不稳定。如果网络延迟高或者网络宽不足,DNS解析可能会超时或失败,从而影响到Nginx的正常运行。 最后,应用程序本身的问题也可能导致DNS解析的不稳定性。如果应用程序没有正确地处理域名解析失败的情况,可能会导致Nginx无法正常工作。 要解决这个问题,我们可以采取以下措施: 1. 检查Kubernetes集群的DNS配置,确保DNS服务正常运行并配置正确。 2. 检查网络状况,确保网络延迟低、宽充足,减少DNS解析超时的可能性。 3. 在应用程序中添加域名解析失败的错误处理机制,例如进行重试或回退到备用解析方案。 综上所述,k8s容器中的Nginx DNS解析不稳定的问题可能与Kubernetes集群的配置、网络问题或应用程序本身相关。通过检查和调整配置,优化网络状况以及合理处理解析失败,我们可以提高Nginx DNS解析的稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值