1. 程式人生 > >『中級篇』集群服務間通信之RoutingMesh(47)

『中級篇』集群服務間通信之RoutingMesh(47)

out att attach it人 over erl 作用 view 分享圖片

>原創文章,歡迎轉載。轉載請註明:轉載自IT人故事會,謝謝!
>原文鏈接地址:『中級篇』集群服務間通信之RoutingMesh(47)

上次講了通過service create 部署了wordpress,我們的這個wordpress有2個service組成一個wordpress,一個mysql。這2個service運行在不同的機器上邊,並且他們之前是可以進行通信的,可以通過servicename的方式通信。先創建mysql,wordpress查找mysql就是通過servicename這種方式。懂網絡的老鐵應該就知道了,這裏面肯定有DNS的功勞在裏面。

技術分享圖片

實驗的方式了解這個網絡
  • 必須創建overlay的network
sudo docker network create -d overlay demo

技術分享圖片

  • 創建一個service,這個service 使用whoami,這個image,這個image的作用,就是訪問後,返回當前訪問的主機名稱
docker service create --name whoami -p 8000:8000 --network demo jwilder/whoami
#查看service 裏面的服務
docker service ls
#查看whoami的信息
docker service ps whoami
#因為service ps whoami 在manager上運行,直接在manager查看ps下
docker ps 

技術分享圖片

技術分享圖片

#訪問下本地manager的whoami
curl 127.0.0.1:8000

技術分享圖片

  • 創建一個service,這個service 使用busybox,之前創建過是一個比較簡單的image,這個是為了當客戶端service之間的訪問。
docker service create --name client -d --network demo busybox sh -c "while true;do sleep 3600;done"
docker service ls
#運行在swam-worker1機器上
docker service ps client

技術分享圖片

#在swam-work1上進行運行 172.28.128.4 
docker exec -it busybox的容器ID sh
ping whoami

技術分享圖片

技術分享圖片

ping whoami ip地址是10.0.0.247

  • 測試whoami的ip是否發生變化

    在manager下進行scale 擴展為2個,查看到一個在worker2上邊,並在worker2的ps上可以查看到whoami的運行,嘗試繼續ping whoami,結果ip不發生變化。

    #manager機器上進行擴展
    docker service scale whoami=2
    #worker2 上運行 查看whoami 是否存在
    docker ps
    #worker1 上ping whoami發現ip沒有發生變化10.0.0.247
    ping whoami

    技術分享圖片

為什麽呢 ip不發生變化,其實我們ping的地址是一個虛擬的ip,docker 集群默認使用 Overlay 網絡驅動,Overlay 驅動實現了跨主機集群內部虛擬網絡。它的作用:將運行的多個容器(不同主機),附加(attach to)到一個網絡默認情況下,服務發現為群集中的每個服務分配虛擬IP地址(VIP)和 動態 DNS,使其可以通過服務名稱將其提供給同一網絡上的容器。即在一個 Overlay 虛擬網絡內,使用服務名稱訪問,將實現任務級別的負載均衡在群集中使用覆蓋網絡,需要在群集節點之間打開以下端口:
端口7946 TCP / UDP用於容器網絡發現。
端口4789 UDP用於容器覆蓋網絡。
機器進行遷移的時候有一套map<k,v>關系,虛擬ip 和實際的ip 有個對應的關系,

  • 輪訓的負載機制
    wget whoami:8000
    more index.html
    #因為目前就有2個whoami,
    #所以可以看到第三次執行wget獲取的時候發現id重復了也變成了65beb6796165

    技術分享圖片

Routing Mesh的體驗
  1. Internal --- Container 和Container 之間的訪問通過overlay網絡(通過VIP虛擬IP)
  2. Ingress---- 如果服務有綁定接口,則此服務可以通過任意swarm節點的響應接口訪問
Load Balancing

現在有3臺機器1個client,2個web,他們3個連通在同一個swam下,當client訪問web的時候其實,其實是訪問10.0.9.4,然後通過負載的方式映射到10.0.9.5或者10.0.9.6上面。

技術分享圖片

技術分享圖片

PS:內部負載均衡
當在docker swarm集群模式下創建一個服務時,會自動在服務所屬的網絡上給服務額外的分配一個虛擬IP,當解析服務名字時就會返回這個虛擬IP。對虛擬IP的請求會通過overlay網絡自動的負載到這個服務所有的健康任務上。這個方式也避免了客戶端的負載均衡,因為只有單獨的一個虛擬IP會返回到客戶端,docker會處理虛擬IP到具體任務的路由,並把請求平均的分配給所有的健康任務。
技術分享圖片

『中級篇』集群服務間通信之RoutingMesh(47)