centos7下安裝docker(23.docker-swarm之如何訪問service)


 

 

 

如何訪問service呢?

為了便於分析,我們重新部署web-server

1.刪除service

執行命令docker service rm web-server

docker service rm刪除web-server,service所有的副本會被同時刪除

 

2.重新創建service,這次直接使用--replicas=2指定副本的數量

 

3.現在每個worker-node上分別運行了一個副本

 

那么現在如何訪問service呢?

可以想成現在有兩個docker host,分別運行了一個httpd容器,我們先去docker1上看一下網絡情況

容器監聽了80端口,但是沒有映射到Docker host,所以只能通過容器的IP訪問,查看容器的IP

容器的IP是172.17.0.2,實際上連接的是dcoker 默認的bridge網絡

我們可以直接在docker1上訪問容器的http服務

但這樣的訪問也僅僅是容器層面的訪問,服務沒有暴露給外部網絡,只能在dcoker 主機上訪問,也就是說,我們現在無法訪問service web-server

 

 

如何做到從外部訪問service呢?

之前我們學習dcoker網絡時知道只要將service暴露到外部,service也是同樣的方法,不同的是我們之前學習的是單台host上的單個容器,現在是多個host上的多個容器,

其實方法也很簡單,我們只要個整個的web-server添加端口映射就可以了

執行一下命令

docker service update --publish-add 8080:80 web-server

如果是新建service,可以直接使用--publish參數,比如:

 docker service create --name web-server --publish 8080:80 --replicas=2 httpd

可以看到現在service已經有端口了。

在瀏覽器中測試一下

 

當我們訪問任何節點的8080端口時,swarm內部的load balancer會將請求轉發給web-server其中的一個副本,這就是routing mesh的作用

盜圖

所以,無論訪問哪個節點,即使節點上沒有運行service,最終都能訪問到service

另外,我們還可以配置一個外部的load balancer,將請求路由到swarm service。比如配置haproxy,將請求分發到各個節點的8080端口。

ingress網絡

當我們用--publish-add 8080:80時,swarm會重新配置service,我們看看容器發生了哪些變化

所有副本都被shutdown,然后重啟了新的副本,我們查看一下新的副本的容器網絡配置

容器的網絡與--pubilc-add之前都不大一樣了,現在有兩塊網卡,每塊網卡連接不同的docker網絡。

 

實際上:

1.eth0連接的是一個overlay類型的網絡,名字為ingress,作用是讓運行在不同主機上的容器之間可以相互通信。

2.eth1連接的是bridge類型的網絡,名字為docker_gwbridge,作用是讓容器能夠訪問到外網

ingress網絡是swarm創建時dcoker為我們自動創建的,swarm中的每個node都能使用ingress

通過overlay網絡,主機與容器,容器與容器之間可以互相訪問;同時,routing mesh將外部請求路由到不同的主機,從而實現了外部網絡對service的訪問

 

 

 

 

service之間如何通信?

微服務的架構由若干service組成。比如:由運行httpd的web前端,有提供緩存的memcached,有存放數據庫的mysql,每一層都是swarm的一個service,每個service都運行了若干容器,在這樣的架構中,service之間時如何進行通信的呢?

 

服務發現:

一種實現方法是將所有的service都publish出去,然后通過routing mesh訪問。但明顯的缺陷是把memcache和mysql也暴露到外網,增加了安全隱患

如果不publish,swarm就要提供一種機制,能夠:

1.讓service通過簡單的方法訪問到其他service。

2.當service副本的IP發生變化的時候,不會影響到該service和其他的service

3.當service的副本數量發生變化的時候,不會影響該service和其他的service

這其實就是服務發現(service discovery)

docker swarm原生就提供了這種功能,通過服務發現,service的使用者都不需要知道service運行在哪里,IP是多少,有多少個副本,就能讓service通信。

 

創建overlay網絡

要使用服務發現,需要相互通信的service必須屬於同一個overlay網絡,所以我們先創建一個新的overlay網絡。

直接使用ingress行不行呢?

答案是不行,因為目前ingress沒有提供服務發現,必須創建自己的overlay網絡。

 

部署service到新建的overlay

部署一個web服務,並將其掛載到新創建的overlay網絡

docker service create --replicas=3 --network web --name my-web httpd

運行一個util服務用於測試,掛載到同一個overlay網絡

 docker service create --name util --network web busybox sleep 10000000

sleep 10000000的作用是保持busybox容器處於運行狀態,我們才能進入到容器訪問servcie my-web

 

 

驗證:

通過docker service ps util確認util所在的節點是docker1

登錄到docker1上的util容器中,ping my-web

可以看到,my-web的IP是10.0.0.5,這個IP是哪個副本的呢?我們先來查看一下

 

docker1上的my-web的副本的IP是10.0.0.6

docker2上的my-web的副本的IP也不是10.0.0.5,那這個10.0.0.5到底是什么呢?

其實他是一個VIP(virtual IP),swarm會將對VIP的訪問負載均衡到每一個副本。

 

向上面那樣一個一個的進入容器查看副本IP很麻煩,可以通過以下的方式來查看。

docker exec  util.1.ecqgk215q1g9mft3u02w4jrq6 nslookup tasks.my-web

可以看到解析出來的副本的IP與我們上面查詢的一致,。

對於服務的使用者,這里是util根本就不需要知道my-web副本的IP,也不需要知道my-web的VIP,只需直接用service的名字就能訪問服務

 

 

 

 

滾動更新service

滾動更新降低了應用更新的風險,如果某個副本更新失敗,整個更新將暫停,其他副本則可以繼續提供服務,同時,在更新的過程中,總是有副本在運行的,因此也保證了業務連續性。

試驗:運行三個副本的service,鏡像使用httpd:2.2.31,然后將其更新到httpd:2.2.32.

將web-update service更新到httpd:2.2.32

 docker service update --image httpd:2.2.32 web-update

從這個更新的過程中可以看到,是從一個副本開始更新,這個副本更新完成后,再更新之后的兩個

--image指定新的鏡像

 

swarm按照如下的步驟執行滾動更新

1.停止第一個副本

2.調度任務,選擇worker node

3.在worker上用新的鏡像啟動副本

4.如果更新成功則繼續更新下一個,如果失敗,暫停整個更新的過程

 

 

一個在更新,還有兩個副本在運行,保障了服務不間斷

默認情況下,swarm一次只更新一個副本,並且兩個副本之間沒有等待時間。

我們可以通過--update-parallelism設置並行更新的副本數,通過--update-delay指定滾動更新的時間間隔。

比如執行以下命令:

docker service update --repliacas 6 --update-parallelism 2 --update-delay 1m30s web-update

 

service副本增加到6個,每次更新兩個副本,時間間隔為1分半鍾

 

docker service inspect查看service當前的配置

docker service ps web-update確保6個副本處於運行的狀態

將目前6個副本更新到httpd:2.4.16

docker service update --image httpd:2.4.16 web-update

可以看到現在是兩個兩個的並行進行更新,

現在可以看到由於docker2上的副本更新失敗,所以已經暫停了更新,1分半鍾之后並沒有進行下一組副本的更新

現在遇到錯誤了,導致service中的副本版本不一致,怎么辦呢?

 

rollback

swarm還有個方便回滾的功能,如果更新后的效果不理想,可以通過--rollback快速恢復到更新之前的狀態

docker service update --rollback web-server

 

通過docker service ps web-server進行查看

注:--rollback只能回滾到上一次執行docker service update之前的狀態,並不能無限制的回滾。

 

我們重新來更新一下

還是兩個一組並行更新

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM