marathon參考(11):ports埠設定(轉)

weixin_34119545發表於2016-08-25

Ports

marathon中應用的埠配置可能被混淆,並有一個懸而未決的問題,需要重新設計 ports API。這個頁面試圖更清楚地解釋它們是如何工作的。

定義

containerPort:在容器內部,是一個容器埠。在使用docker容器的時候,當我們使用BRIDGE網路模式,這是埠對映的一部分,必須設定。

hostPort:主機上的埠。當使用BRIDGE網路模式的時候,你需要指定從主機埠到容器的埠的對映。在HOST網路模式中,預設請求埠是主機埠。

BRIDGE networking:BRIDGE模式的網路使用在docker應用中。在這模式中,容器埠(容器內部的埠)會被對映到主機的埠上,應用在容器內部繫結一個指定埠,docker網路在主機上繫結一個指定埠。

HOST networking:HOST網路使用在非docker的marathon應用和docker應用上。在這種模式下,應用直接繫結一個或多個埠在主機上。

portMapping:對docker應用來說埠對映是必須的,docker應用需要使用BRIDGE網路模式,它包含一組host port、container port、service port和protocol。多個埠對映可能會被一個marathon應用指定。

ports:ports陣列用來定義埠。它必須定義成陣列,如果你使用的是HOST網路模式,並且沒有指定埠對映。ports和portDefinitions可以同時定義。

portDefinitions:portDefinition陣列用來定義埠。它必須定義成陣列,如果你使用的是HOST網路模式,並且沒有指定埠對映。portDefinition這個陣列可以替代ports陣列,它可以指定埠名稱、協議和標籤。ports和portDefinitions可以同時定義。

protocol:指定埠的協議(如tcp、udp、或者是tcp和udp)。在docker容器中使用BRIDGE網路模式時,埠對映是必須的。

requirePorts: requirePorts是一個屬性,指定marathon是否需要指定埠。這樣可以確保在mesos代理上繫結埠。這個屬性不支援BRIDGE網路模式。

servicePort:服務埠是一個埠用於描述服務應該可用的埠。marathon不繫結到指定的服務埠,但確保你不能有多個應用程式使用相同的服務埠相同的主機上執行。服務埠通常只使用外部應用程式(例如HAProxy)使應用程式可以在指定的埠。更多請參考服務發現和負載均衡

隨機埠分配

設定埠是使用0這個值,marathon會為應用分配隨機埠。但是如果在埠對映portMapping中containerPort設定成0,containerPort的埠將會hostPort一樣。

環境變數

每個主機的埠號可以通過環境變數$PORT0,$PORT1暴露。預設情況下每個marathon應用分配一個埠,所以$PORT0總是有效的。執行在marathon上執行的docker容器中,這些環境變數也是有效的。

當使用BRIDGE網路模式的時候,確保在portMapping埠對映中設定containerPort容器埠號。但是,如果你設定containerPort為0,那麼它和hostPort是一樣的,並且你可以使用$PORT環境變數。

配置例項

Host模式

host網路模式是預設的網路模式,docker和非docker容器應用都可以使用。注意在你的Dockerfile中EXPOSE不是必須的。

開啟Host模式

對容器來說Host模式是預設開啟的。如果希望顯示配置,可以通過network屬性指定。

對於非docker應用,你不需要指定任何東西。

指定埠

通過ports陣列指定埠。

或者通過portDefinitions陣列指定:

在這個例子中,我們指定3個隨機分配的主機埠號,可以通過環境變數$PORT0,$PORT1,$PORT2使用這個三個埠號。marathon將隨機分配三個服務埠號service port。

指定服務埠號service port:

或者:

在這個例子中,主機埠$PORT0,$PORT1,$PORT2任然是隨機分配的。但是服務埠號service port是2001,2002,3000。使用一個服務發現的解決方案,如HAProxy,代理請求從服務埠service port到主機埠host port,需要按照上面的方式配置。

如果想讓服務埠service port和主機埠host port一樣,你需要設定requirePorts為true,預設情況下這個值是false。

如果你不適用服務發現方案,這個屬性是非常有用的。

定義portDefinitions陣列,你可以為每個埠指定協議,名稱和標籤。當開始一個新任務,marathon向mesos傳送後設資料。mesos將在任務的discovery欄位暴露這個資訊。自定義網路發現方案會使用這個欄位。

下面是定義portDefinitions的例項:

port欄位是必填的。protocol,name,labels是可選的。如果portDefinitions陣列只設定埠port,那麼和設定ports陣列是一樣的。

注意ports和portDefinitions不能一起使用。

引用埠

你可以在Dockerfile檔案中引用主機的埠:

另外,如果你不使用docker或者使用在你的marathon應用中定義cmd,方式都是一樣的:

 

Bridge模式

Bridge網路模式可以對映主機埠到容器內部埠,目前只支援docker容器。如果你使用容器映象並且埠是固定的,這個模式是非常有用的。注意在Dockerfile中EXPOSE埠不是必須的。

開啟Bridge模式

通過network屬性指定bridge模式:

 

指定埠

埠對映類似於docker命令中的引數-p。它指定在容器內的主機和埠的對映管理。

在container中配置埠對映portMappings:

這個例項中,主機埠是隨機的,並且容器埠號和主機埠號是一致的。此處定義了三個埠對映,在容器內部可以使用環境變數$PORT0、$PORT1、$PORT2引用埠號。

另外,固定容器埠號,配置如下:

在這個例子中,marathon會隨機分配主機埠對映到80,443,4000埠。環境變數$PORT是很重要的,在上面的例子中,$PORT0表示第一個對映中的hostPort值。

指定協議

你也可以為埠指定協議,預設為tcp:

 

指定服務埠

預設情況下,marathon隨機建立服務埠service port。服務埠用做服務發現,將服務埠設定成常用埠是一個可取的方案。使用servicePort設定服務埠:

在這個例子中$PORT0、$PORT1、$PORT2任然是隨機分配的。但是服務埠後被設定為2001、2002和3000。外部代理,如HAProxy,負責服務埠到主機埠的路由。

引用埠

如果containerPort設定為0,你應該在Dockerfile指定埠:

但是,如果你已經指定的containerPort的值,你只要在Dockerfile中使用這些埠值:

另外,在你的marathon應用定義中指定了cmd,你可以使用相同的方式定義埠:

或是使用固定值:

相關文章