首页 文章

在Kubernetes中,DNS无法解决NGINX问题

提问于
浏览
5

我有一个Kubernetes集群,我用kube-aws设置 . 我正在尝试运行自定义NGINX配置,该配置使用DNS解析到proxy_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日志中收到以下错误

[错误] 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;
}

2 回答

  • -1

    解析名称失败,因为您需要使用完全限定域名 . 也就是说,你应该使用:

    lead-api.<namespace>.svc.cluster.local

    不只是

    lead-api

    仅使用主机名通常会起作用,因为在kubernetes中 resolv.conf 配置了搜索域,因此您不必使用FQDN . 例如:

    search default.svc.cluster.local svc.cluster.local cluster.local
    nameserver 10.3.240.10
    options ndots:5
    

    但是,当您告诉nginx使用自定义解析程序时,指定FQDN是必要的,因为它没有获得这些域搜索规范的好处 .

  • 15

    你需要使用 Service

    http://kubernetes.io/docs/user-guide/services/

    一个kubernetes Service 代理流量到您的 Pods (即您所谓的'service',这是您的应用程序)

    我猜您使用Kubernetes来部署和扩展您的应用程序( Pods ),因此一旦您扩展并且您有多个Pod可以与之交互,则需要对它们进行负载 balancer . 这就是 Service 的作用 .

    Service 有自己的IP地址 . 只要 Service 存在,在上游引用此 Service 的Nginx Pod 就可以正常工作 .

    Nginx(免费版)在无法解析上游时死亡,但如果定义了 Service ,它就有自己的IP并得到解决 .

    如果 Service 后面的 Pods 没有运行,Nginx将不会看到,并将尝试转发流量,但将返回502(坏网关)

    所以,只需定义 Service ,然后使用正确的标签调出 Pods ,这样 Service 就会接收它们 . 您可以删除,缩放,替换那些 Pods ,而不会影响Nginx Pod . 只要在 Service 后面至少有一个Pod运行,Nginx将始终能够连接到您的API .

相关问题