SRV 记录与 Consul 和 Nginx 集成,用于 Nomad 中的动态服务发现

问题描述 投票:0回答:1

您好,我有一个小困惑,为什么 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 问题,但没有成功。

我找到的资源:

  1. nginx-upsync-模块
  2. ngx_http_consul_backend_module

我没有 nginx plus,因此我要这样做。

请让我知道处理此问题的最佳方法是什么。

nginx dns nginx-reverse-proxy consul nomad
1个回答
0
投票

处理这个问题的最佳方法。

从 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
© www.soinside.com 2019 - 2024. All rights reserved.