Nomad端口映射疑问:为何指定to=80才能让Ingress正常工作?
为什么移除Nomad任务network中的
to=80后Ingress会失效? 你的问题核心在于Nomad端口映射逻辑和容器内服务监听端口的匹配关系,和Ingress是否直接引用80端口无关,具体拆解如下:
1. 带to=80时的端口流转逻辑
当你在network.port中指定to=80时,Nomad会完成以下映射:
- 调度器给服务分配一个主机动态端口(比如你的例子里的28868)
- 将主机的这个动态端口,转发到容器内部的80端口
而你用的官方nginx镜像默认就是监听容器内的80端口,所以Ingress请求到http://192.168.86.36:28868时,流量能顺利转发到nginx的监听端口,服务正常响应。
2. 移除to=80后的端口问题
根据Nomad文档,省略to或设为-1时,Nomad会把主机分配的动态端口,直接映射到容器内部的同一个动态端口(也就是主机用28868,容器内也映射到28868)。但此时:
- 你的nginx容器默认只监听内部80端口,完全没监听这个动态端口
- Ingress请求到主机动态端口后,流量转发到容器内的同端口,但没有服务在那接收,自然就会连接失败,Ingress也就无法工作了
解决方案
你有两种可选方案:
- 方案一(推荐):保留
to=80配置
这是最简单的方式,直接匹配nginx默认的监听端口,不需要修改容器内的服务配置。 - 方案二:修改nginx监听Nomad分配的动态端口
如果一定要用动态端口映射到容器内的同端口,需要让nginx监听Nomad通过环境变量传递的端口:- 在任务中添加模板,生成自定义的nginx配置文件,读取
NOMAD_PORT_http环境变量 - 或者使用支持通过环境变量配置监听端口的nginx镜像
- 在任务中添加模板,生成自定义的nginx配置文件,读取
示例修改后的任务片段(添加模板配置):
task "hello" { driver = "docker" template { data = <<EOF server { listen ${NOMAD_PORT_http}; location / { root /usr/share/nginx/html; index index.html index.htm; } } EOF destination = "local/nginx.conf" } config { image = "nginx" ports = ["http"] volumes = ["local/nginx.conf:/etc/nginx/conf.d/default.conf"] } }
这样配置后,nginx会监听Nomad分配的动态端口,此时移除network.port中的to=80也能正常工作。
内容的提问来源于stack exchange,提问作者sssilver
相关产品推荐
相关产品推荐

