当前位置 博文首页 > 适己而忘人者,人之所弃;克己而立人者,众之所戴。:Marathon(

    适己而忘人者,人之所弃;克己而立人者,众之所戴。:Marathon(

    作者:[db:作者] 时间:2021-07-11 10:01

    端口

    在Marathon中,对应用程序端口的配置可能会造成混淆,并且有一个悬而未决的问题,需要重新设计的端口API。本文尝试更清楚的解释Marathon的端口是如何工作的。

    如果你是在DC/OS集群中运行Marathon,你可以使用虚拟地址(VIP:Virtual addresses) ,使端口的管理更容易。VIP简化应用间的通讯,并实现可靠的面向服务的架构。VIP从单个虚拟地址向多个IP地址和端口映射的流量。

    定义

    containerPort:用来指定容器内部的一个端口。当使用BRIDGEUSER网络模式连接Docker容器时,必须将这个属性设置为port mapping的一部分。

    hostPort:用来指定绑定到主机上的一个端口。当使用BRIDGEUSER网络模式,你可以指定一个port mapping将一个主机端口映射到容器端口。在HOST网络模式下,默认的请求端口就是主机的端口。请注意,主机端口只可以通过环境变量提供给一个任务。

    BRIDGE网络模式:指定Docker应用程序使用BRIDGE网络模式。在这种模式下,容器端口(容器内部的端口)被映射到主机端口(主机上的端口)。在这种模式下,应用程序被绑定到容器内的指定端口,容器的端口被绑定到主机上的指定端口。

    USER网络模式:指定Docker应用程序使用USER网络模式。在这种模式下,容器端口(容器内部的端口)被映射到主机端口(主机上的端口)。在这种模式下,应用程序被绑定到容器内的指定端口,容器的端口被绑定到主机上的指定端口。在与“用户自定义”Docker网络集成时,USER网络模式将会非常有用。在Mesos世界,这种网络通常是通过使用与Mesos CNI网络隔离的 CNI 插件访问。

    HOST网络模式:该种模式在Marathon应用为非容器化而其它应用为容器化的情况下使用。在这种模式下,应用程序直接绑定到主机上的一个或多个端口。

    portMapping:在Docker BRIDGE模式下,在容器外部可被访问到的端口都需要做端口映射。端口映射是一个包含host port, container port, service port和协议的元组。可以为Marathon应用指定多个端口映射; 未指定hostPort,则其默认值为0(意味着Marathon将随机分配一个)。在Docker USER模式下,hostPort的语义为稍有点变化:USER模式不需要指定hostPort,如果未指定Marathon不会自动分配一个随机的。这允许在USER网络模式下部署容器,包括containerPort和发现信息,但不暴露主机网络上的这些端口(意味着将不消耗主机端口资源)。

    port:该端口数组被用来定义在HOST网络模式下应被视为资源提供的一部分的端口。在没有指定端口映射的情况下这个属性是必须的。一个应用程序只需要定义端口或portDefinitions两者其中之一。

    portDefinitionsportDefinitions数组用于定义应被认为是资源提供一部分的端口。在使用HOST网络模式和没有指定端口映射的情况下,需要定义portDefinitions数组。这个数组是为了替换port数组,并可以为其指定一个端口名,协议和标签。一个应用程序只需要定义端口或portDefinitions两者其中之一。

    protocol:protocol用于指定端口使用的因特网协议(例如tcpudp或者udp,tcp)。这只需要在Docker容器环境下使用BRIDGEUSER网络模式时,在port mapping属性下设置。

    requirePortsrequirePorts是指定Marathon是否应该在收到资源提供请求时,专门寻找指定端口的一个属性。这确保了这些端口是可用的,可以绑定到上Mesos Agent上的。这不支持BRIDGEUSER网络模式。

    servicePort:当您在Marathon上(不管是通过REST API或界面)创建一个新的应用程序,你可以指定一个或多个服务端口给它。可以指定所有有效的端口号为服务端口,也可以用0表示Marathon应该自动分配的可用服务端口给应用程序使用。如果你选择自己的服务端口,你必须自己确保,这个端口在所有应用程序中是唯一的。

    随机端口分配
    使用值0,表示你想让Marathon随机分配一个端口。但是,如果在portMapping属性内部,将containerPort的值设置为0,意味着使用与hostPort相同的端口。

    环境变量

    每个host port值是通过 PORT0???? PORT1等等的环境变量暴露给正在运行的应用程序实例。每个Marathon应用默认被分配一个端口,因此 PORT0??MarathonDocker使??NAME???? PORT_NAME访问。

    当使用BRIDGEUSER模式的网络,确保你的应用程序绑定到你在portMapping中声明的containerPort的端口上。但是,如果设置containerPort的值为0,那么这个端口将与hostPort的端口一样,你可以使用$PORT环境变量。

    示例配置

    Host模式

    Host模式网络是Docker容器默认的组网方式,是非Docker应用程序的唯一网络模式。注意,没有必要在Dockerfile文件中EXPOSE这个端口。

    启用Host模式

    Host模式默认情况下在Docker中是启用状态。如果你想明确的指定,你也可以手工在network属性上指定:

      "container": {
        "type": "DOCKER",
        "docker": {
          "image": "my-image:1.0",
          "network": "HOST"
        }
      },

    对于非Docker应用程序,你不需要指定任何东西。

    指定端口

    您可以通过ports数组指定端口:

        "ports": [
            0, 0, 0
        ],

    或通过portDefinitions数组:

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

    在这个例子中,我们指定三个随机分配主机端口,这可以通过环境变量 PORT0???? PORT1$PORT2提供给我们的命令行使用。Marathon也会在这三个主机端口之外,随机分配三个服务端口(service port)。

    您也可以指定特定的服务端口(service port):

     "ports": [
            2001, 2002, 3000
        ],

    或者:

        "portDefinitions": [
            {"port": 2001}, {"port": 2002}, {"port": 3000}
        ],

    在这种情况下,主机端口 PORT0?