我有一个Kubernetes集群,我用kube-aws设置 . 我正在尝试运行自定义NGINX配置,该配置使用DNS解析到proxy_pass . 这是NGINX代码块
location /api/v1/lead {
resolver 10.3.0.10 ipv6=off;
set $container lead-api;
proxy_pass http://$container:3000;
}
10.3.0.10来自Kubernetes中的DNS服务的集群IP . 我也尝试过127.0.0.11,这是我们在docker-compose / docker环境中使用的 .
$ kubectl describe --namespace=kube-system service kube-dns
Name: kube-dns
Namespace: kube-system
Labels: k8s-app=kube-dns
kubernetes.io/cluster-service=true
kubernetes.io/name=KubeDNS
Selector: k8s-app=kube-dns
Type: ClusterIP
IP: 10.3.0.10
Port: dns 53/UDP
Endpoints: 10.2.26.61:53
Port: dns-tcp 53/TCP
Endpoints: 10.2.26.61:53
Session Affinity: None
此配置适用于使用docker-compose的三种不同环境 . 但是,我在Kubernetes集群的NGINX日志中收到以下错误
[错误] 9#9:* 20无法解决lead-api(2:服务器故障),客户端:10.2.26.0,服务器:,请求:“GET / api / v1 / lead / 661DF757-722B-41BB- 81BD-C7FD398BBC88 HTTP / 1.1“
如果我在NGINX pod中运行nslookup,我可以使用相同的dns服务器解析主机:
$ kubectl exec nginx-1855584872-kdiwh -- nslookup lead-api
Server: 10.3.0.10
Address: 10.3.0.10#53
Name: lead-api.default.svc.cluster.local
Address: 10.3.0.167
我不知道它是否重要,但请注意错误的“服务器”部分是空的 . 当我查看dnsmasq的pod日志时,我看不到任何相关内容 . 如果我更改NGINX块以对proxy_pass进行硬编码,那么它就可以解决 . 但是,我有其他需要动态代理名称的配置 . 我可以通过这种方式对每个上游进行硬编码,但我想知道如何使DNS解析器工作 .
location /api/v1/lead {
proxy_pass http://lead-api:3000;
}
2 回答
解析名称失败,因为您需要使用完全限定域名 . 也就是说,你应该使用:
lead-api.<namespace>.svc.cluster.local
不只是
lead-api
仅使用主机名通常会起作用,因为在kubernetes中
resolv.conf
配置了搜索域,因此您不必使用FQDN . 例如:但是,当您告诉nginx使用自定义解析程序时,指定FQDN是必要的,因为它没有获得这些域搜索规范的好处 .
你需要使用
Service
http://kubernetes.io/docs/user-guide/services/
一个kubernetes
Service
代理流量到您的Pods
(即您所谓的'service',这是您的应用程序)我猜您使用Kubernetes来部署和扩展您的应用程序(
Pods
),因此一旦您扩展并且您有多个Pod可以与之交互,则需要对它们进行负载 balancer . 这就是Service
的作用 .Service
有自己的IP地址 . 只要Service
存在,在上游引用此Service
的NginxPod
就可以正常工作 .Nginx(免费版)在无法解析上游时死亡,但如果定义了
Service
,它就有自己的IP并得到解决 .如果
Service
后面的Pods
没有运行,Nginx将不会看到,并将尝试转发流量,但将返回502(坏网关)所以,只需定义
Service
,然后使用正确的标签调出Pods
,这样Service
就会接收它们 . 您可以删除,缩放,替换那些Pods
,而不会影响NginxPod
. 只要在Service
后面至少有一个Pod运行,Nginx将始终能够连接到您的API .