这个问题在这里已经有了答案:





DNS does not resolve with NGINX in Kubernetes

(2 个回答)


3年前关闭。




所以,我想要nginx在请求时解析后端的主机名。我希望得到 HTTP 502 Bad Gateway当后端服务关闭时,我希望服务响应,当它启动时。

我用 nginx:1.15-alpine nginx 的图片这是我的配置:

server { 
 
  resolver kube-dns.kube-system.svc.cluster.local valid=5s; 
 
  server_name  mysystem.com; 
  listen       80; 
 
  client_max_body_size 20M; 
 
  location = /nginx_status { 
      stub_status on; 
      access_log off; 
  } 
 
  # Services configuration 
 
  location ~ /my-service/ { 
      set $service_endpoint http://my-service.namespace:8080; 
      proxy_pass $service_endpoint$request_uri; 
      include includes/defaults-inc.conf; 
      include includes/proxy-inc.conf; 
  } 
 
} 

因此,当我向 nginx 发出请求时,我收到 502 Bad Gateway 响应。 Nginx 的日志说找不到名称:
2018/06/28 19:49:18 [error] 7#7: *1 my-service.namespace could not be resolved (3: Host not found), client: 10.44.0.1, server: mysystem.com, request: "GET /my-service/version HTTP/1.1", host: "35.229.17.63:8080" 

但是,当我使用 shell ( kubectl exec ... -- sh ) 登录容器并测试 DNS 解析时,它运行良好。
 # nslookup my-service.namespace kube-dns.kube-system.svc.cluster.local 
Server:    10.47.240.10 
Address 1: 10.47.240.10 kube-dns.kube-system.svc.cluster.local 
 
Name:      my-service.namespace 
Address 1: 10.44.0.75 mysystem-namespace-mysystem-namespace-my-service-0.my-service.namespace.svc.cluster.local 

而且,我可以 wget http://my-service.namespace:8080/并得到回应。

为什么nginx无法解析主机名?

更新:我如何设法解决它:

nginx.confserver我添加了一个解析器设置:
resolver kube-dns.kube-system.svc.cluster.local valid=10s; 

然后我在 proxy_pass 中使用了 FQDN :
proxy_pass http://SERVICE-NAME.YOUR-NAMESPACE.svc.cluster.local:8080; 

请您参考如下方法:

它失败是因为您需要使用 FQDN 来解析名称。

只使用主机名通常会起作用,因为在 kubernetes 中 resolv.conf 配置了搜索域,因此您通常不需要提供服务的 FQDN。

但是,当您告诉 nginx 使用自定义名称服务器时,必须指定 FQDN,因为它无法从这些域搜索规范中受益。

在服务器级别添加的 nginx.conf 中:

resolver kube-dns.kube-system.svc.cluster.local valid=10s; 

然后在 proxy_pass 中使用 FQDN:
proxy_pass http://SERVICE-NAME.YOUR-NAMESPACE.svc.cluster.local:8080; 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!