端口和服务端口之间的区别?

时间:2016-03-28 15:30:49

标签: port mesos marathon

在探索马拉松REST API时,我遇到了以下API调用给出的信息(JSON输出)中定义的两个端口号(端口和服务端口) - curl http://x.y.z.w:8080/v2/tasks | python -m json.tool | less
示例输出如下:

{
  "tasks":[
    {
      "appId":"/test",
      "host":"172.20.75.145",
      "id":"test.1fc922a9-f4c8-11e5-8bff-005056a76a7f",
      "ipAddresses":[

      ],
      "ports":[
        31313
      ],
      "servicePorts":[
        10000
      ],
      "slaveId":"2130f59b-7289-40eb-b24d-72f0c6fe94c8-S1",
      "stagedAt":"2016-03-28T09:33:26.859Z",
      "startedAt":"2016-03-28T09:33:26.936Z",
      "version":"2016-03-28T09:33:26.800Z"
    }
  ]
}

有人知道端口和servicePorts之间的区别吗?还请添加更多信息。

2 个答案:

答案 0 :(得分:9)

根据Marathon文件:

  

servicePort:在Marathon中创建新应用程序时(通过REST API或前端),您可以为其分配一个或多个服务端口。您可以将所有有效端口号指定为服务端口,也可以使用0表示Marathon应自动为应用分配免费服务端口。如果您确实选择了自己的服务端口,则必须确保它在所有应用程序中都是唯一的。

让我根据Marathon的两个主要网络配置详细说明这一点,在我看到它的同时提供一些有关它们的信息。

主机模式

使用:Docker应用程序的默认选项,仅限非Docker应用程序的选项

在此配置下,您的应用程序将直接绑定到主机的端口。

不使用服务端口

您可以要求Marathon为您提供来自主机的任何两个端口,您希望将这些端口提供给您的应用程序。在应用程序配置文件中有两种方法:

"ports": [
    0, 0
],

"portDefinitions": [
      {"port": 0}, {"port": 0}
],

通过这样做,Marathon将从可用端口范围保留两个端口,并将它们分配给环境变量 PORT1PORT2Dockerfile

中直接调用它们非常容易
CMD ./launch.sh --listen-on $PORT1 --monitor-on $PORT2

或您的Marathon配置中的cmd定义:

"cmd": "./launch.sh --listen-on $PORT1 --monitor-on $PORT2"

使用服务端口

假设您在多个主机中运行您的应用程序(运行多个实例),并且您希望能够在特定端口中的任何主机上连接到您的应用程序。那是服务端口进入图片的时候 通过在配置文件中写入:

"ports": [
    3000, 3001
],

或:

"portDefinitions": [
    {"port": 3000}, {"port": 3001}
],

... Marathon将继续在主机上分配随机端口,它仍然会将它们分配给环境变量PORT1PORT2,并且它还会为您保留端口3000和3001使用

您可以使用服务发现机制将来自这些服务端口的流量路由到$PORT1$PORT2

您可以使服务端口等于主机端口(例如,如果您想避免使用服务发现机制),并为主机上的应用程序提供一致的端口。您可以在端口规范之后添加"requirePorts": true来执行此操作 需要注意的是,Marathon只能在具有这些端口的节点中安排您的应用程序。

桥接模式

使用:仅适用于Docker应用程序

在此配置下,一些指定的容器端口绑定到主机端口。

不使用服务端口

在此模式下,您不会使用"端口"或者" portDefinitions"指令,你使用" portMappings"代替。通过这样做,您实际上是在告诉Docker将流量从特定容器端口映射到主机端口,反之亦然。

您可以通过指定以下内容将容器端口映射到主机端口:

"portMappings": [
    { "containerPort": 80, "hostPort": 0, "protocol": "tcp"},
    { "containerPort": 443, "hostPort": 0, "protocol": "tcp"}
]

在这种情况下:
  - 将hostPort设置为0使其再次从中选择一个随机端口    可用的端口范围。这些端口再次分配给PORT1和。{    分别为PORT2 env变量   - 将containerPort设置为0将使其等于hostPort

使用服务端口

和以前一样,您可以通过在配置中指定它们来为主机上的应用程序启用一致的服务端口,如下所示:

"portMappings": [
    { "containerPort": 80, "hostPort": 0, "protocol": "tcp", "servicePort": 3000},
    { "containerPort": 443, "hostPort": 0, "protocol": "tcp", "servicePort": 3001}
]

您需要再次使用服务发现机制将来自这些服务端口的流量路由到$PORT1$PORT2

有关详细信息,请参阅:

马拉松港口: https://mesosphere.github.io/marathon/docs/ports.html
Docker主机模式: http://www.dasblinkenlichten.com/docker-networking-101-host-mode/
Docker桥接模式: http://www.dasblinkenlichten.com/docker-networking-101/

答案 1 :(得分:2)

基本上通过服务端口marathon告诉你在这个端口上监听的haproxy(或服务发现),我将为你提供我的实例主机ip和端口列表,你必须在那里路由你的流量。 haproxy使用自己的路由算法在实例列表中分配流量。