本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
详细聊聊K8s容器内nginx带变量的域名解析
makebo · 199浏览 · 发布于2022-01-24 +关注

这篇文章主要给大家介绍了关于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

根据 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
      ...


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


相关推荐

将Fedora 29升级到Fedora 30

吴振华 · 704浏览 · 2019-05-14 22:00:02
使用Nginx反向代理到go-fastdfs

iamitnan · 726浏览 · 2019-05-23 13:42:00
利用VLC搭建组播流服务器

追忆似水年华 · 2693浏览 · 2019-06-14 11:27:06
用Bash脚本监控Linux上的内存使用情况

吴振华 · 974浏览 · 2019-06-24 11:27:02
加载中

0评论

评论
没有最好,只有更好,一切都在路上!
分类专栏
小鸟云服务器
扫码进入手机网页