我在 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
并没有什么区别)。
这是怎么回事?
在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 中提取该信息。你可以:
urlprefix-name.service.consul.our.domain
以在作业中领事服务标签,然后连接到浏览器中的 URL。对于其他服务,最常见的模板用于生成其他服务配置,例如连接到 postgres 或 redis 的气流。