【发布时间】:2017-04-02 15:14:21
【问题描述】:
我有一个使用 kube-aws 设置的 Kubernetes 集群。我正在尝试运行自定义 NGINX 配置,该配置使用 DNS 解析来代理_pass。这是 NGINX 代码块
location /api/v1/lead {
resolver 10.3.0.10 ipv6=off;
set $container lead-api;
proxy_pass http://$container:3000;
}
10.3.0.10 来自 Kubernetes 中找到的 DNS 服务的集群 IP。我还尝试了 127.0.0.11,这是我们在 docker-compose/docker 环境中使用的。
$ kubectl describe --namespace=kube-system service kube-dns
Name: kube-dns
Namespace: kube-system
Labels: k8s-app=kube-dns
kubernetes.io/cluster-service=true
kubernetes.io/name=KubeDNS
Selector: k8s-app=kube-dns
Type: ClusterIP
IP: 10.3.0.10
Port: dns 53/UDP
Endpoints: 10.2.26.61:53
Port: dns-tcp 53/TCP
Endpoints: 10.2.26.61:53
Session Affinity: None
此配置适用于使用 docker-compose 的三种不同环境。但是,我在 Kubernetes 集群的 NGINX 日志中收到以下错误
[error] 9#9: *20 lead-api 无法解析(2:服务器故障),客户端:10.2.26.0,服务器:,请求:“GET /api/v1/lead/661DF757-722B- 41BB-81BD-C7FD398BBC88 HTTP/1.1"
如果我在 NGINX pod 中运行 nslookup,我可以使用相同的 dns 服务器解析主机:
$ kubectl exec nginx-1855584872-kdiwh -- nslookup lead-api
Server: 10.3.0.10
Address: 10.3.0.10#53
Name: lead-api.default.svc.cluster.local
Address: 10.3.0.167
我不知道这是否重要,但请注意错误的“服务器”部分为空。当我查看 dnsmasq 的 pod 日志时,我看不到任何相关内容。如果我将 NGINX 块更改为对 proxy_pass 进行硬编码,那么它可以很好地解决。但是,我还有其他需要动态代理名称的配置。我可以用这种方式对每个上游进行硬编码,但我想知道如何使 DNS 解析器工作。
location /api/v1/lead {
proxy_pass http://lead-api:3000;
}
【问题讨论】:
-
您可能需要使用完整的限定名称,即lead-api。
.svc.cluster.local: -
顺便说一句,不知道为什么不使用使用服务来代替这个?该服务将从 NGINX 负载平衡到您后面的任何 pod。
-
我可以从 nginx 容器中使用 nslookup 仅使用 lead-api 并且它解决得很好。另外,我有几个单独运行的后端 API,我想在单个 url 下运行。我研究过使用入口控制器,但这些对于我想要完成的任务来说太复杂了。
-
@MrE 我更新了 OP 以显示 nslookup 作品
-
我不知道 nginx 解析是如何工作的,但我知道有多种方法可以做到这一点,而且我之前遇到过很多 DNS 问题,所以我不会推断,因为 nslookup 有效, nginx 解析应该可以工作。在 nginx 中尝试 FQDN 看看是否有帮助。我仍然不确定您到底在做什么:lead-api 是一项服务,对吗?那么为什么需要使用 resolve 指令呢?
标签: amazon-web-services nginx dns kubernetes