微服務架構的應用由若幹 service 組成。比如有運作 httpd 的 web 前端,有提供緩存的 memcached,有存放資料的 mysql,每一層都是 swarm 的一個 service,每個 service 運作了若幹容器。在這樣的架構中,service 之間是必然要通信的。
一種實作方法是将所有 service 都 publish 出去,然後通過 routing mesh 通路。但明顯的缺點是把 memcached 和 mysql 也暴露到外網,增加了安全隐患。
如果不 publish,那麼 swarm 就要提供一種機制,能夠:
讓 service 通過簡單的方法通路到其他 service。
當 service 副本的 IP 發生變化時,不會影響通路該 service 的其他 service。
當 service 的副本數發生變化時,不會影響通路該 service 的其他 service。
這其實就是服務發現(service discovery)。Docker Swarm 原生就提供了這項功能,通過服務發現,service 的使用者不需要知道 service 運作在哪裡,IP 是多少,有多少個副本,就能與 service 通信。下面我們開始實踐。
要使用服務發現,需要互相通信的 service 必須屬于同一個 overlay 網絡,是以我們先得建立一個新的 overlay 網絡。
直接使用 <code>ingress</code> 行不行?
很遺憾,目前 <code>ingress</code> 沒有提供服務發現,必須建立自己的 overlay 網絡。
部署一個 web 服務,并将其挂載到新建立的 overlay 網絡。
部署一個 util 服務用于測試,挂載到同一個 overlay 網絡。
<code>sleep 10000000</code> 的作用是保持 busybox 容器處于運作的狀态,我們才能夠進入到容器中通路 service <code>my_web</code>。
通過 <code>docker service ps util</code> 确認 util 所在的節點為 swarm-worker1。
登入到 swarm-worker1,在容器 util.1 中 ping 服務 <code>my_web</code>。
可以看到 <code>my_web</code> 的 IP 為 <code>10.0.0.2</code>,這是哪個副本的 IP 呢?
其實哪個副本的 IP 都不是。<code>10.0.0.2</code> 是 <code>my_web</code> service 的 VIP(Virtual IP),swarm 會将對 VIP 的通路負載均衡到每一個副本。
我們可以執行下面的指令檢視每個副本的 IP。
<code>10.0.0.3</code>、<code>10.0.0.4</code>、<code>10.0.0.5</code> 才是各個副本自己的 IP。不過對于服務的使用者(這裡是 util.1),根本不需要知道 <code>my_web</code>副本的 IP,也不需要知道 <code>my_web</code> 的 VIP,隻需直接用 service 的名字 <code>my_web</code> 就能通路服務。
Service 的通路就讨論到這裡,下一節我們學習 Rolling Update。
書籍:
1.《每天5分鐘玩轉Docker容器技術》
<a href="https://item.jd.com/16936307278.html" target="_blank">https://item.jd.com/16936307278.html</a>
2.《每天5分鐘玩轉OpenStack》
<a href="https://item.jd.com/12086376.html" target="_blank">https://item.jd.com/12086376.html</a>