港口和服务港口的区别?

gzjq41n4  于 2021-06-26  发布在  Mesos
关注(0)|答案(2)|浏览(286)

在探索marathonrestapi时,我遇到了两个端口号(端口和服务端口),它们是在以下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"
    }
  ]
}

有人知道端口和服务端口的区别吗?请补充更多信息。

t9eec4r0

t9eec4r01#

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

vjhs03f7

vjhs03f72#

根据马拉松记录:
serviceport:在marathon中创建新应用程序时(通过restapi或前端),可以为其分配一个或多个服务端口。您可以将所有有效端口号指定为服务端口,也可以使用0指示marathon应自动为应用程序分配免费服务端口。如果您选择了自己的服务端口,则必须确保它在所有应用程序中都是唯一的。
让我根据马拉松的两个主要网络配置来详细说明这一点,在我进行马拉松时提供一些关于它们的信息。

主机模式

使用:docker应用程序的默认选项,非docker应用程序的唯一选项
在此配置下,应用程序将直接绑定到主机的端口。

不使用服务端口

您可以要求marathon为您提供主机上的任意两个端口,这两个端口都是您想要提供给应用程序的端口。有两种方法可以在应用程序配置文件中执行此操作:

"ports": [
    0, 0
],

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

通过这样做,marathon将从可用端口范围中保留两个端口,并将它们分配给环境变量 PORT1 ,和 PORT2 .
在您的应用程序中直接调用它们是非常容易的 Dockerfile :

CMD ./launch.sh --listen-on $PORT1 --monitor-on $PORT2

或者在你的 cmd 马拉松配置中的定义:

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

使用服务端口

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

"ports": [
    3000, 3001
],

或:

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

... marathon仍然会在主机上分配随机端口,它仍然会将它们分配给环境变量 PORT1 以及 PORT2 ,它还将保留端口3000和3001供您使用。
您可以使用服务发现机制将流量从这些服务端口路由到 $PORT1 以及 $PORT2 .
您可以使服务端口与主机端口相等(例如,如果您希望避免使用服务发现机制),并使应用程序跨主机具有一致的端口。您可以通过添加 "requirePorts": true 在你的端口规格之后。
这里需要注意的是,marathon只能在具有这些端口的节点中调度应用程序。

桥接模式

用途:仅用于docker应用程序
在此配置下,一些指定的容器端口绑定到主机端口。

不使用服务端口

在这种模式下,您不使用“ports”或“portdefinitions”指令,而是使用“portmappings”。这样做可以有效地告诉docker将特定集装箱港口的流量Map到主机港口,反之亦然。
可以通过指定以下内容将容器端口Map到主机端口:

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

在这种情况下:
-设置 hostPort 如果设置为0,则再次从可用端口范围中选择一个随机端口。这些端口再次分配给 PORT1 以及 PORT2 环境变量。
-设置 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/

相关问题