Nginx不会在K8S中解析主机名

时间:2018-06-28 20:21:15

标签: nginx kubernetes google-cloud-platform

因此,我想让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"

但是,当我使用外壳程序(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无法解析主机名?

1 个答案:

答案 0 :(得分:0)

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

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

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