【问题标题】:nginx won't resolve hostname in K8S [duplicate]nginx不会解析K8S中的主机名[重复]
【发布时间】:2018-12-07 23:54:56
【问题描述】:

所以,我想让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;

【问题讨论】:

  • 嗨 Max,你能解释一下(如果)你是如何工作的
  • @rex:在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;
  • 谢谢,已经这样做了。也感谢您更新问题。

标签: nginx kubernetes google-cloud-platform


【解决方案1】:

失败是因为您需要使用 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;

【讨论】:

猜你喜欢
  • 2019-07-24
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 2023-04-02
  • 2011-04-14
相关资源
最近更新 更多