nginx 中的 kubernetes dns 解析器

nginx 中的 kubernetes dns 解析器

我在本地进行开发docker-compose,并且有一个 nginx 容器在做一个简单的操作,proxy_pass如下:

location /app/ {
    proxy_pass http://webapp:3000/;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;

    resolver 127.0.0.11;
}

我现在想转到kubernetesGKE,但最后一行给我带来了麻烦。

我尝试将解析器切换为:

    resolver kube-dns;

我还尝试了其他各种 IP 和名称,但总是收到如下错误:

nginx: [emerg] host not found in resolver "kube-dns"

我的 kubernetes 设置是,我有一个单独的 pod,里面有两个容器:“webapp”和“nginx”。我只想有一个service指向 nginx 的外部容器,它可以proxy_pass指向 webapp。

有任何想法吗?

答案1

您必须为 kube-dns 和服务指定 FQDN。
例如,对于 GKE kube-dns 标准,它将是:kube-dns.kube-系统.svc.cluster.local
如果你在默认命名空间中网络应用服务,那么它将是:web 应用程序.默认.svc.集群.本地

我知道原来的问题已经过时了,但也许它可以对某些人有所帮助。

答案2

location /app {
  resolver kube-dns.kube-system.svc.cluster.local;

  proxy_pass http://webapp.default.svc.cluster.local;
}

这种具有 FQDN 和显式解析器(注释defaultkube-system显式命名空间)的配置对我有用(webapp是 Kuberentes 服务名称)

答案3

通过以下步骤使用 Kind 在本地运行集群实现了此目的:

1. 检查正在运行的 pod 的 DNS 配置

kubectl exec -it <pod name> -- cat /etc/resolv.conf

search default.svc.cluster.local svc.cluster.local cluster.local home
nameserver 10.96.0.10
options ndots:5

2. 将名称服务器 IP 指定为 Nginx 解析器

http {
    server {
        resolver 10.96.0.10 valid=10s;

答案4

如果 nginx 位于 kubernetes 中,则无需设置解析器,因为它将解析到正确的位置。如果nginxwebapp位于同一个命名空间中,您可以简单地

proxy_pass http://webapp

只要您的 webapp 服务名称为 webapp 并使用端口 80。

如果 nginx 位于外部,则应使用入口控制或将 Web 应用的服务设置为节点端口。节点端口将在所有节点上打开相同的端口,以便您可以在 nginx 端对它们进行负载平衡。

相关内容