您好,我有一个小困惑,为什么 SRV 记录不能与 Consul 和 Nginx 一起使用。
我的目标是使用 Consul DNS 将流量路由到通过 Nomad 部署的服务,其中使用动态端口分配。
我有 2 个 ec2 实例,其中安装了 Nomad、Consul、Nginx 用于托管服务。
具体来说,我希望Nginx自动从Consul的SRV记录中解析出正确的服务IP和端口, 允许我将流量路由到
zapper
服务的多个实例。
我有两个
zapper
服务实例。
ubuntu@master:/etc/nginx/sites-available$ consul 目录服务-tags
consul
dns primary
nomad http,rpc,serf
nomad-client http
python-http-server http,python-http-server
zapper-apps-lovestaco-com zapper.apps.lovestaco.com
我已按照文档在consul中启用了DNS转发。
当我挖掘服务时,它会给我服务的IP。
ubuntu@master:~$
dig @localhost -p 8600 zapper-apps-lovestaco-com.service.consul
; <<>> DiG 9.18.28-0ubuntu0.20.04.1-Ubuntu <<>> @localhost -p 8600 zapper-apps-lovestaco-com.service.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40800
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;zapper-apps-lovestaco-com.service.consul. IN A
;; ANSWER SECTION:
zapper-apps-lovestaco-com.service.consul. 0 IN A 132.71.22.71
;; Query time: 4 msec
;; SERVER: 127.0.0.1#8600(localhost) (UDP)
;; WHEN: Tue Sep 10 19:15:27 UTC 2024
;; MSG SIZE rcvd: 82
当我尝试使用 SRV 进行挖掘时,它会为我提供 IP 和动态分配的服务端口。
ubuntu@master:~$
dig @localhost -p 8600 zapper-apps-lovestaco-com.service.consul SRV
; <<>> DiG 9.18.28-0ubuntu0.20.04.1-Ubuntu <<>> @localhost -p 8600 zapper-apps-lovestaco-com.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43024
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 7
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;zapper-apps-lovestaco-com.service.consul. IN SRV
;; ANSWER SECTION:
zapper-apps-lovestaco-com.service.consul. 0 IN SRV 1 1 ac1f1647.addr.dc1.consul.
zapper-apps-lovestaco-com.service.consul. 0 IN SRV 1 1 25268 ac1f1647.addr.dc1.consul.
;; ADDITIONAL SECTION:
ac1f1647.addr.dc1.consul. 0 IN A 132.71.22.71
consul-master-server.node.dc1.consul. 0 IN TXT "consul-version=1.18.0"
consul-master-server.node.dc1.consul. 0 IN TXT "consul-network-segment="
ac1f1647.addr.dc1.consul. 0 IN A 132.71.22.71
consul-master-server.node.dc1.consul. 0 IN TXT "consul-version=1.18.0"
consul-master-server.node.dc1.consul. 0 IN TXT "consul-network-segment="
;; Query time: 8 msec
;; SERVER: 127.0.0.1#8600(localhost) (UDP)
;; WHEN: Tue Sep 10 19:15:31 UTC 2024
;; MSG SIZE rcvd: 352
当我访问该服务时,它会将我指向 Nginx 欢迎页面。
ubuntu@master:~$
curl zapper-apps-hexmos-com.service.consul
<!DOCTYPE html>
<html>
<title>Welcome to nginx!</title>
...
</html>
当我使用 SRV 记录中的端口进行卷曲时,它到达了服务。
ubuntu@master:~$
curl zapper-apps-hexmos-com.service.consul:24717
Accessing port 24717, version 79
健康也同样有效。 ubuntu@master:~$
curl zapper-apps-hexmos-com.service.consul:24717/health
{"status": "healthy"}
现在来到主要部分,当我尝试通过 Nginx 访问该服务时,它给了我欢迎页面。 这意味着 Nginx 无法将服务的流量路由到端口。
ubuntu@master:/etc/nginx/sites-available$
cat zapper.apps.lovestaco.com
resolver 127.0.0.1:8600 valid=10s;
upstream zapper_service {
zone upstream_dynamic 64k;
server zapper-apps-lovestaco-com.service.consul resolve;
}
server {
listen 80;
server_name zapper.apps.lovestaco.com;
location / {
proxy_pass http://zapper_service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
ubuntu@master:/etc/nginx/sites-available$
s /usr/sbin/nginx -V
nginx version: nginx/1.19.10
built by gcc 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)
built with OpenSSL 1.1.1f 31 Mar 2020
TLS SNI support enabled
configure arguments:
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-http_auth_request_module \
--with-http_v2_module \
--with-http_dav_module \
--with-http_slice_module \
--with-http_addition_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_sub_module \
--with-mail_ssl_module \
--with-stream_ssl_module \
--add-module=/usr/local/src/nginx-1.19.10/nginx-upstream-dynamic-servers
最近添加了 nginx-upstream-dynamic-servers 认为它可以解决 SRV 问题,但没有成功。
我找到的资源:
我没有 nginx plus,因此我要这样做。
请让我知道处理此问题的最佳方法是什么。
处理这个问题的最佳方法。
从 nomad 模板生成 nginx 配置的最佳方式如文档中所述 https://developer.hashicorp.com/nomad/tutorials/load-balancing/load-balancing-nginx 。一切都在那里解释。
总而言之,使用以下模板创建一个 nginx 作业:
template {
data = <<EOF
upstream zapper_service {
{{ range service "zapper_service" }}
server {{ .Address }}:{{ .Port }};
{{ else }}server 127.0.0.1:65535; # force a 502
{{ end }}
}
server {
listen 8080;
location / {
proxy_pass http://zapper_service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
EOF