游牧者的困境:NOMAD_IP_myport是我的外部接口IP,即使我使用的是network.mode =“bridge”

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

我在 2 个 VPS 上设置了一个游牧集群,一个带有

nomad
服务器、
consul
服务器和
vault
,另一个带有
nomad
consul
客户端。

在客户端节点上,我尝试运行

nomad job
,例如内部网络上的其他容器应该可以访问的
postgres
服务。所以我选择了
bridge
模式,如下所示:

    group "myservices" {
        count = 1

        network {
            mode = "bridge"
            port "postgrestcp" {
                to = 5432 
            }
        }

        service {
            name = "svc-postgres"
            port = "postgrestcp"
            tags = ["postgres","primary"]
   ...
        task "task-postgres" {
            driver = "docker"

            config {
                image = "docker.io/postgres:16-alpine"
                ports = ["postgrestcp"]
            }
   ...

当我开始工作并

exec
进入已启动的容器时(
nomad exec -task task-postgres -t $(nomad job status myjob-postgres | grep -A2 Alloc | tail -n1 | awk '{ print $1 }') bash

我发现容器中所有相关的

NOMAD_ADDR...
环境变量都包含我的外部接口 IP,而不是默认网桥的 IP(即名称为
nomad
)。该桥存在并且有一个 IP,我希望在提到的环境变量中找到它。

> networkctl status nomad | grep -e Type -e '^\s*Address:'
                          Type: bridge
                       Address: 172.26.64.1

无论我如何尝试,我都无法摆脱

nomad
指的是公共IP。 (我一开始以为是因为我之前用的是
podman
任务驱动,但是改成
docker
并没有什么区别)。

这是怎么回事?

consul nomad
1个回答
0
投票

在Nomad网络规范中,“桥接”网络模式意味着将在组中的任务之间创建一个桥。这不是“桥接”docker 接口,它意味着不同的东西。请参阅https://developer.hashicorp.com/nomad/docs/networking#bridge-networking Nomad 正在重定向在 Nomad 客户端服务配置中配置的接口。请参阅https://developer.hashicorp.com/nomad/docs/configuration/client#host_network-block

。默认接口是用于连接的接口,即“外部”接口。我通常还会添加

host_network "lo" { interface = "lo" } 以拥有本地主机。考虑使用防火墙来防止外部内容访问您的服务。通常,拥有许多服务器,您希望它成为外部端口,以便其他服务可以访问它。

其他容器
可以

使用分配到的IP和端口连接到服务。

在作业中的组内使用${NOMAD_ADDR_postgrescp}进行连接。如果不在组内,即来自其他任务和其他任何内容,您必须从 Nomad 中提取该信息。你可以:


在 consul 或 nomad 提供商中注册服务,请参阅
    https://developer.hashicorp.com/nomad/docs/job-specation/service
  • 并生成具有指向服务的配置的模板,请参阅或者在 consul 中注册服务,将 consul DNS 集成到您的系统(请参阅
  • https://developer.hashicorp.com/consul/tutorials/networking/dns-forwarding
  • ),并集成像 fabio 或 traefik 这样的代理,请参阅 https://developer.hashicorp.com/nomad/tutorials/load-balancing/load-balancing-fabio,使用 DNS 从 consul 提取 IP 和端口 连接到喜欢
      postgrestcp.service.consul.your.domain.com
    • 也使用 Consul 的 DNS 提取分配的服务端口,请参阅 
    • https://developer.hashicorp.com/consul/docs/services/discovery/dns-static-lookups#rfc-2782-lookup
    • . 注意:一些服务本身支持 RFC 2782 DNS SRV,不知道 postgres。
    或其他服务也可以直接与 Nomad API 接口以查找分配给该服务的 IP 和端口
  • 有什么东西
      nomad operator api /v1/job/yourservice/allocations | jq 'filter(.Status == "running") | .[0].ID' | xargs nomad alloc status -json | jq '.Resources.Networks | <find the port with postgrestcp label>'
    • 或者我创建了 
    • nomad-port
    • https://pypi.org/project/nomad-tools/
      的一部分,它确实做到了这一点 - 打印 IP 和端口。
  • 在我们的网络中,我们有 fabio 和 consul。对于 HTTP 服务,我们只需选择一个名称,将其添加到
urlprefix-name.service.consul.our.domain

以在作业中领事服务标签,然后连接到浏览器中的 URL。对于其他服务,最常见的模板用于生成其他服务配置,例如连接到 postgres 或 redis 的气流。

    

© www.soinside.com 2019 - 2024. All rights reserved.