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

 更新时间:2022年01月24日 09:13:07   投稿:daisy  
这篇文章主要给大家介绍了关于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域名解析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Nginx防盗链和Nginx访问控制与Nginx解析php的配置

    详解Nginx防盗链和Nginx访问控制与Nginx解析php的配置

    这篇文章主要介绍了详解Nginx防盗链和Nginx访问控制与Nginx解析php的配置的相关资料,这里提供实例帮助大家,学习理解这部分内容,需要的朋友可以参考下
    2017-08-08
  • Mac中使用Nginx实现80端口转发8080端口

    Mac中使用Nginx实现80端口转发8080端口

    端口转发(Port forwarding),有时被叫做隧道,是安全壳(SSH) 为网络安全通信使用的一种方法。端口转发是转发一个网络端口从一个网络节点到另一个网络节点的行为,其使一个外部用户从外部经过一个被激活的NAT路由器到达一个在私有内部IP地址(局域网内部)上的一个端口
    2017-09-09
  • 如何自定义Nginx JSON日志格式配置

    如何自定义Nginx JSON日志格式配置

    Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种结构化日志格式特别适合ELK等日志分析系统处理,感兴趣的朋友一起看看吧
    2025-03-03
  • 解决nginx重新加载配置文件,配置文件没生效问题

    解决nginx重新加载配置文件,配置文件没生效问题

    这篇文章主要介绍了解决nginx重新加载配置文件,配置文件没生效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Nginx实现防盗链的多种方式

    Nginx实现防盗链的多种方式

    防盗链指的是防止其他网站未经许可直接引用你的资源(如图片、音视频文件、文档等),这样做不仅能有效节约带宽,还能防止未经授权的内容被滥用,本文给大家介绍了Nginx实现防盗链的多种方式,需要的朋友可以参考下
    2025-01-01
  • nginx网站服务如何配置防盗链(推荐)

    nginx网站服务如何配置防盗链(推荐)

    这篇文章主要介绍了nginx网站服务如何配置防盗链,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • nginx服务器配置解决ajax的跨域问题

    nginx服务器配置解决ajax的跨域问题

    本文给大家分享的是一个nginx服务器配置解决ajax的跨域问题的小技巧,非常的实用,有相同需求的小伙伴可以参考下
    2017-03-03
  • nginx如何将http访问的网站改成https访问

    nginx如何将http访问的网站改成https访问

    这篇文章主要介绍了nginx如何将http访问的网站改成https访问,帮助大家更好的理解和使用nginx,感兴趣的朋友可以了解下
    2021-02-02
  • nginx中斜杠(‘/‘)的具体使用

    nginx中斜杠(‘/‘)的具体使用

    在Nginx配置的过程中,斜杠(/)经常使用到,它们不仅可以区分不同的路径,还有其他的作用,本文就详细的介绍了nginx中斜杠(‘/‘)的具体使用,感兴趣的可以了解一下,感兴趣的可以了解一下
    2023-10-10
  • Nginx配置之实现多台服务器负载均衡

    Nginx配置之实现多台服务器负载均衡

    这篇文章主要介绍了Nginx配置之实现多台服务器负载均衡,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论