我在本地进行开发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;
}
我现在想转到kubernetes
GKE,但最后一行给我带来了麻烦。
我尝试将解析器切换为:
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 和显式解析器(注释default
和kube-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 中,则无需设置解析器,因为它将解析到正确的位置。如果nginx
和webapp
位于同一个命名空间中,您可以简单地
proxy_pass http://webapp
只要您的 webapp 服务名称为 webapp 并使用端口 80。
如果 nginx 位于外部,则应使用入口控制或将 Web 应用的服务设置为节点端口。节点端口将在所有节点上打开相同的端口,以便您可以在 nginx 端对它们进行负载平衡。