如何配置Nomad使容器内部获取自身容器IP/端口?
解决方法:让容器内部获取Consul注册的IP/端口对
可以实现,这里提供两种直接可行的方案:
方案1:用Nomad模板注入容器IP到环境变量
Nomad的Podman驱动会暴露容器的真实IP到NOMAD_DRIVER_PODMAN_IP环境变量,你可以通过env块把这个值传递给容器内部,同时搭配端口变量NOMAD_PORT_https,就能拿到和Consul注册一致的IP/端口对。
修改后的作业配置:
job "example" { type = "service" group "webserver" { network { port "https" { to = 443 } } task "caddy" { driver = "podman" config { image = "docker://docker.io/library/caddy" ports = ["https"] } # 把容器IP和端口注入到容器内部环境变量 env { APP_LISTEN_IP = "{{ env "NOMAD_DRIVER_PODMAN_IP" }}" APP_LISTEN_PORT = "{{ env "NOMAD_PORT_https" }}" } service { provider = "consul" port = "https" address_mode = "driver" } } } }
容器里的应用就可以通过APP_LISTEN_IP和APP_LISTEN_PORT获取目标IP/端口了。如果需要生成配置文件(比如Caddy的配置),也可以用template块来生成,替换成对应的变量即可。
方案2:切换到bridge网络模式
把group的网络模式改成bridge,此时Nomad会自动把NOMAD_IP_https设置为容器的bridge网络IP(而非127.0.0.1),和注册到Consul的IP一致。
修改后的作业配置:
job "example" { type = "service" group "webserver" { network { mode = "bridge" # 启用bridge网络模式 port "https" { to = 443 } } task "caddy" { driver = "podman" config { image = "docker://docker.io/library/caddy" ports = ["https"] } service { provider = "consul" port = "https" address_mode = "driver" } } } }
这种情况下,容器内部的NOMAD_IP_https就是容器的真实IP,直接用就行。
注意点
NOMAD_DRIVER_PODMAN_IP是Podman驱动专属的环境变量,只有当你用Podman作为驱动时才会存在- bridge模式下,Nomad会负责创建和管理bridge网络,不需要你手动配置Podman的网络
内容的提问来源于stack exchange,提问作者sbaildon
相关产品推荐
相关产品推荐

