NGINX 反向代理 + ngx_upstream_resolveMK - 尝试从 ECS 服务发现 Route53 自动命名解析 SRV

NGINX Reverse Proxy + ngx_upstream_resolveMK - Trying to resolve SRV from ECS Service Discovery Route53 Auto Naming

我目前遇到 ECS 服务发现和 Route53 自动命名问题。

我已将服务注册表添加到服务中,所有托管区域记录都将自动填充。 但我似乎无法弄清楚如何使用 NGINX + ngx_upstream_resolveMK.

解析 DNS SRV 记录
# DNS RESOLVER
resolver ns-x.awsdns-xx.com valid=10s;

# UPSTREAMS
upstream kibana {
  resolveMK servicediscovery.ecs service=kibana;
}

# HOST - kibana.example.com
server {
  server_name kibana.example.com;
  listen 80;
  location / {
    proxy_pass https://kibana/;
    rewrite ^/(.*)$ / break;
  }
}

错误:nginx: [emerg] host not found in upstream "servicediscovery.ecs" in /usr/local/nginx/sites-enabled/kibana.conf:3

看来缺少 A 记录需要解析 "servicediscovery.ecs" 到 Route 53 私有区域。

我需要手动添加吗?或者有没有办法动态添加这条A记录?

我认为这就是问题的原因,但我仍在学习,可能还有很长的路要走。

更新:

我读到你也可以使用 xxx.xxx.xxx.2 通过 AWS VPC 访问 DNS 我已经使用新的解析器进行了测试,但运气不佳。

# DNS RESOLVER
resolver xxx.xxx.0.2 valid=10s;

我们通过切换到 HAProxy 解决了这个问题。

另一个问题是使用正确的服务发现格式。

创建一个名为 _ip.xxxxxxx.ecs 的新私有命名空间,并将服务发现名称命名为 _prometheus。当您在 ecs.

中创建新服务时,两者都可以实现

当您想在 ECS 中使用内部 DNS 时,Nginx 会出现问题。

我使用HA-Proxy后成功了

它使用 Docker 的 "links" 选项,HA-Proxy 支持使用 /etc/hosts 文件。

  1. 首先,使用Docker的"links"选项并设置"environment variables"(例如LINK_APPLINK_PORT)。

  2. 其次,将这些"environment variables"填入haproxy.cfg

此外,我建议您使用 "dynamic port mapping" 进行 ALB。它使工作更灵活。

taskdef.json:

{
    "executionRoleArn": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<APP_NAME>_ecsTaskExecutionRole",
    "containerDefinitions": [
      {
        "name": "<APP_NAME>-rp",
        "image": "gnokoheat/ecs-reverse-proxy:latest",
        "essential": true,
        "memoryReservation": <MEMORY_RESV>,
        "portMappings": [
          {
            "hostPort": 0,
            "containerPort": 80,
            "protocol": "tcp"
          }
        ],
        "links": [
          "<APP_NAME>"
        ],
        "environment": [
          {
            "name": "LINK_PORT",
            "value": "<SERVICE_PORT>"
          },
          {
            "name": "LINK_APP",
            "value": "<APP_NAME>"
          }
        ]
      },
      {
        "name": "<APP_NAME>",
        "image": "<IMAGE_NAME>",
        "essential": true,
        "memoryReservation": <MEMORY_RESV>,
        "portMappings": [
          {
            "protocol": "tcp",
            "containerPort": <SERVICE_PORT>
          }
        ],
        "environment": [
          {
            "name": "PORT",
            "value": "<SERVICE_PORT>"
          },
          {
            "name": "APP_NAME",
            "value": "<APP_NAME>"
          }
        ]
      }
    ],
    "requiresCompatibilities": [
      "EC2"
    ],
    "networkMode": "bridge",
    "family": "<APP_NAME>"
  }

haproxy.cfg:


global
    daemon
    pidfile /var/run/haproxy.pid

defaults
    log global
    mode http
    retries 3
    timeout connect 5000
    timeout client 50000
    timeout server 50000

frontend http
    bind *:80

    http-request set-header X-Forwarded-Host %[req.hdr(Host)]

    compression algo gzip
    compression type text/css text/javascript text/plain application/json application/xml

    default_backend app

backend app
    server static "${LINK_APP}":"${LINK_PORT}"

See :

Github : https://github.com/gnokoheat/ecs-reverse-proxy

Docker image : gnokoheat/ecs-reverse-proxy:latest

这里有更多详细信息a solution