使用Swarm模式路由網格

Docker Engine羣模式可輕鬆發佈服務端口,以使其可用於集羣外部資源。所有節點都參與入口路由網格。路由網格使羣集中的每個節點都可以接受羣集中運行的任何服務的已發佈端口上的連接,即使節點上沒有任何任務在運行。路由網格將所有傳入請求路由到可用節點上的已發佈端口到活動容器。

要在羣集中使用入口網絡,在啓用羣集模式之前,需要在羣集節點之間打開以下端口:

  • 7946用於容器網絡發現的端口TCP / UDP。
  • 4789容器入口網絡的端口UDP。

您還必須打開羣集節點與需要訪問端口的任何外部資源(例如外部負載平衡器)之間的已發佈端口。

您也可以繞過給定服務的路由網格

發佈一個端口服務

創建服務時,請使用該--publish標誌發佈端口。target 用於指定容器內的端口,並且published用於指定要在路由網格上綁定的端口。如果不使用該published 端口,則會爲每個服務任務綁定一個隨機的高編號端口。您需要檢查任務以確定端口。

$ docker service create \
  --name <SERVICE-NAME> \
  --publish published=<PUBLISHED-PORT>,target=<CONTAINER-PORT> \
  <IMAGE>

注意:此語法的較早形式是用冒號分隔的字符串,其中發佈的端口爲第一個,目標端口爲第二個,例如 -p 8080:80。首選新語法,因爲它更易於閱讀並且具有更大的靈活性。

<PUBLISHED-PORT>是集羣提供服務的端口。如果您省略它,則將綁定一個隨機的高編號端口。該<CONTAINER-PORT>是其中容器偵聽的端口。此參數是必需的。

例如,以下命令將集羣中任何節點的Nginx容器中的端口80發佈到端口8080:

$ docker service create \
  --name my-web \
  --publish published=8080,target=80 \
  --replicas 2 \
  nginx

當您訪問任何節點上的端口8080時,Docker會將您的請求路由到活動容器。在集羣集節點本身上,端口8080可能實際上沒有綁定,但是路由網格知道如何路由流量並防止發生任何端口衝突。

路由網格在發佈的端口上偵聽分配給該節點的任何IP地址。對於外部可路由的IP地址,可以從主機外部訪問該端口。對於所有其他IP地址,只能從主機內部進行訪問。

service ingress image

您可以使用以下命令發佈現有服務的端口:

$ docker service update \
  --publish-add published=<PUBLISHED-PORT>,target=<CONTAINER-PORT> \
  <SERVICE>

您可以docker service inspect用來查看服務的發佈端口。例如:

$ docker service inspect --format="{{json .Endpoint.Spec.Ports}}" my-web

[{"Protocol":"tcp","TargetPort":80,"PublishedPort":8080}]

輸出顯示<CONTAINER-PORT>(標記爲TargetPort從容器)和 <PUBLISHED-PORT>(標記PublishedPort),其中節點監聽的服務請求。

發佈僅適用於TCP或僅適用於UDP的端口

默認情況下,發佈端口時,它是一個TCP端口。您可以專門發佈UDP端口,而不是發佈TCP端口或在TCP端口之外發布。同時發佈TCP和UDP端口時,如果省略協議說明符,則該端口將發佈爲TCP端口。如果您使用更長的語法(推薦用於Docker 1.13及更高版本),請將protocol屬性設置爲tcpudp

僅TCP

長語法:

$ docker service create --name dns-cache \
  --publish published=53,target=53 \
  dns-cache

簡短語法:

$ docker service create --name dns-cache \
  -p 53:53 \
  dns-cache

TCP和UDP

長語法:

$ docker service create --name dns-cache \
  --publish published=53,target=53 \
  --publish published=53,target=53,protocol=udp \
  dns-cache

簡短語法:

$ docker service create --name dns-cache \
  -p 53:53 \
  -p 53:53/udp \
  dns-cache

僅UDP

長語法:

$ docker service create --name dns-cache \
  --publish published=53,target=53,protocol=udp \
  dns-cache

簡短語法:

$ docker service create --name dns-cache \
  -p 53:53/udp \
  dns-cache

繞過路由網格

您可以繞過路由網格,以便在訪問給定節點上的綁定端口時,始終可以訪問在該節點上運行的服務的實例。這稱爲host模式。有幾件事要牢記。

  • 如果訪問未運行服務任務的節點,則該服務不會在該端口上偵聽。可能沒有人在監聽,或者有完全不同的應用程序在監聽。

  • 如果希望在每個節點上運行多個服務任務(例如,當您有5個節點但運行10個副本時),則不能指定靜態目標端口。允許Docker分配一個隨機的高編號端口(通過不使用 published),或者通過使用全局服務而不是複製的服務,或者通過使用放置約束,確保僅單個服務實例在給定節點上運行。 

要繞過路由網格,必須使用長語法--publish服務並將其設置modehost。如果省略mode屬性或將其設置爲ingress,則使用路由網格。以下命令使用host模式並繞過路由網格來創建全局服務 。

$ docker service create --name dns-cache \
  --publish published=53,target=53,protocol=udp,mode=host \
  --mode global \
  dns-cache

配置外部負載均衡器

您可以爲集羣服務配置外部負載均衡器,既可以與路由網格結合使用,也可以完全不使用路由網格。

使用路由網格

您可以配置外部負載均衡器以將請求路由到集羣服務。例如,您可以配置HAProxy以使請求平衡到發佈到端口8080的Nginx服務。

ingress with external load balancer image

在這種情況下,必須在負載均衡器和集羣中的節點之間打開端口8080。集羣節點可以駐留在專用網絡上,該專用網絡可由代理服務器訪問,但不能公共訪問。

您可以配置負載平衡器以平衡集羣中每個節點之間的請求,即使該節點上未計劃任何任務也是如此。例如,您可能在以下HAProxy配置中/etc/haproxy/haproxy.cfg

global
        log /dev/log    local0
        log /dev/log    local1 notice
...snip...

# Configure HAProxy to listen on port 80
frontend http_front
   bind *:80
   stats uri /haproxy?stats
   default_backend http_back

# Configure HAProxy to route requests to swarm nodes on port 8080
backend http_back
   balance roundrobin
   server node1 192.168.99.100:8080 check
   server node2 192.168.99.101:8080 check
   server node3 192.168.99.102:8080 check

當您在端口80上訪問HAProxy負載平衡器時,它將請求轉發到集羣中的節點。集羣路由網格將請求路由到活動任務。如果出於某種原因,羣集調度程序將任務分派到不同的節點,則無需重新配置負載均衡器。

您可以配置任何類型的負載均衡器以將請求路由到羣集節點。要了解有關HAProxy的更多信息,請參閱HAProxy文檔

不使用路由網格

要使用沒有路由網格的外部負載均衡器,請設置--endpoint-mode 爲dnsrr而不是默認值vip。在這種情況下,沒有單個虛擬IP。取而代之的是,Docker爲服務設置DNS條目,以便對服務名稱的DNS查詢返回IP地址列表,並且客戶端直接連接到其中之一。您負責向負載均衡器提供IP地址和端口的列表。請參閱 配置服務發現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章