Docker與Traefik助微服務騰飛
【編者的話】Govind Fichtner是一位從業15年的德國IT老兵。先后擔任過開發工程師,系統管理員,咨詢師,架構師,敏捷訓練師,項目經理,部門經理甚至CTO。白天他是一位勤奮的DevOps,晚上則變身為狂熱的ARM設備愛好者。他現在為Hypriot成員,該組織成員以“Docker海盜”自稱,發布了多款ARM架構中的Docker應用。他們的身上完美的體現了Geek精神
幾周之前我發現了一款叫做 Tradefik 的小而美的HTTP反向代理。它可以作為一款為動態后端服務的前端代理,這個動態后端可以是Docker。
你發現了這個 動態 特性的重要性了嗎?
Traefik真正與眾不同的特點是,它能通過監聽Docker事件來增加或移除容器后端服務。所以當一個Dcoker容器啟動或停止時,Traefik都可以知道這個情況并能將將容器添加到它的活動后端服務列表中。
有了這個能力Traefix可以取代Nginx或者HAProxy,因為后者需要非常復雜的操作步驟且需要諸如 Registrator , Consul 和 Consul-Template 等工具來完成相同的功能。
所以讓我向你展示一個小例子來說明開始使用Traefik是多么簡單的事情...
你能看到下面的架構圖中我們有一個簡單的HTTP服務來響應請求。
我們有多個后端服務,因為要做高可用和負載均衡,它們運行在多個物理節點上。Traefik作為前端代理將請求均勻分發給可用的后端服務上。
Traefik同時作為一個后端服務運行在Docker Swarm集群中的容器內。在這個例子中每個后端服務將會響應所在的獨立的容器ID,以此來區分到底是哪個服務做出的響應。
在開始之前我們需要運行一套Docker Swarm集群。
創建Docker Swarm集群
一個最快速并且便捷地得到一套Docker Swarm集群的方法是使用我們的 Hypriot Cluter Lab 。
因為Cluster Lab已經預裝在樹莓派操作系統HypriotOS的“Barbossa”發行版中,我將向你展示怎樣使用它去設置Swarm集群。
為了能跟上我的操作,你至少需要三臺樹莓派主機。我將會使用具有五個節點的Pico-Cluster
第一步是將HypriotOS鏡像燒錄到SD中。
將Hypriot倉庫克隆到你作為燒錄機的操作系統中合適的目錄里。
$ git clone https://github.com/hypriot/flash.gi://github.com/hypriot/flash.git $ cd flash/Darwin
使用flash命令,我們可以為我們的 主節點 準備好SD卡。
$ ./flash --hostname cl-leader https://downloads.hypriot.com/hypriotos-rpi-v0.8.0.img.zip
為 從節點 重復此過程。
$ for i in {1..4} do; ./flash --hostname cl-follower${i} https://downloads.hypriot.com/hypriotos-rpi-v0.8.0.img.zip; done
當從節點還在燒錄時,你就可以啟動主節點了。
SSH到主節點并切換到root用戶:
$ ssh pirate@cl-leader.local $ sudo su
為了能使Cluster Lab與Traefik進行工作,我們需要升級它到最新版本:
$ apt-get update $ apt-get install hypriot-cluster-lab=0.2.13-1
然后啟動Hypriot Cluster Lab,并使用verbose參數來啟用日志輸出功能:
$ VERBOSE=true cluster-lab start
當Cluster Lab啟動,你能觀察到它是如何自我配置和進行自檢的。如果所有步驟不是綠的,你可以停下它并重新啟動。如果還是失敗,你需要看一下 錯誤指導部分 。
當主節點準備好后,是時候啟動其他的從節點了,步驟也是先升級然后使用相同的方式啟動Cluster Lab。現在你可以嘗試做做看,當一切搞定后我們再繼續。
好了,我們可以執行下面的命令檢查我們是否已經有了五個健康的Swarm Cluster 節點:
DOCKER_HOST=tcp://192.168.200.1:2378 docker info | grep Nodes Nodes: 5
瞧我們的集群中真的有了五個節點了。恭喜恭喜!
當你完成了以上的步驟,那么剩下的就是小菜一碟了!
使用Traefik組建我們的微服務
我們的微服務示例由兩部分組成。Traefik前端和WhoAmI后端應用。對于這兩部分我已經為你準備好了Docker鏡像,你可以從Docker Hub中拉取到本地。
Traefik鏡像叫做 hypriot/rpi-traefik ,WhoAmI鏡像叫做 hypriot/rpi-whoami 。兩個鏡像的Dockerfile可以在Github的 相關倉庫 中找到。
因為這兩個Dockerfile也是Go語言為基礎的鏡像的好示例,我將會在這里解釋一下其中的內容。
“rpi-traefik”的Dockerfile:
FROM hypriot/rpi-alpine-scratch RUN apk update &&\ apk upgrade &&\ apk add ca-certificates &&\ rm -rf /var/cache/apk/* ADD https://github.com/containous/traefik/releases/download/v1.0.0-beta.771/traefik_linux-arm /traefik RUN chmod +x /traefik EXPOSE 80 8080 ENTRYPOINT ["/traefik"]
它表示我們剛剛在Alpine linux鏡像之中增加了Traefik的可執行文件。這個鏡像非常精巧僅僅只有41MB。如果你靜態編譯Traefik可執行文件到一個空鏡像中,它的體積將會更小。
你將會在下面的WhoAmI鏡像的Dockerfile中看到這是怎么做的:
“rpi-whoami”的Dockerfile:
FROM scratch ADD http /http ENV PORT 8000 EXPOSE 8000 CMD ["/http"]
僅僅只有3MB的鏡像,這真是非常的小。
好了,現在是時候將組件放入一個Docker Compose應用中了。
克隆下面的倉庫到你的集群主節點中:
$ git clone https://github.com/hypriot/rpi-cluster-lab-demos
當克隆結束后切換到‘traefik’目錄,并使用Docker Compose在我們的微型Docker Swarm集群中啟動我們的應用:
$ cd rpi-cluster-lab-demos/traefik $ DOCKER_HOST=tcp://192.168.200.1:2378 docker-compose up -d Creating network "traefik_default" with the default driver Creating traefik_traefik_1 Creating traefik_whoami_1
這些命令將會使Docker Compose啟動兩個容器。一個主節點中Traefik容器,另一個是在四個從節點中啟動一個WhoAmI容器。
讓我們查看一下是否真是如此:
$ DOCKER_HOST=tcp://192.168.200.1:2378 docker ps | grep 'traefik\|whoami' cba8d9a7d8f7 hypriot/rpi-whoami "/http" About a minute ago Up About a minute 8000/tcp cl-follower1/traefik_whoami_1 7dc2b48a24e2 hypriot/rpi-traefik "/traefik --web --doc" About a minute ago Up About a minute 192.168.200.1:80->80/tcp, 192.168.200.1:8080->8080/tcp cl-leader/traefik_traefik_1
看起來不錯。那么讓我們發送一些HTTP請求到前端來測試一下我們的應用:
$ for i in {1..5}; do curl -H Host:whoami.docker.localhost http://192.168.200.1; done I'am f72892c9187c I'am f72892c9187c I'am f72892c9187c I'am f72892c9187c I'am f72892c9187c
正如你所見,所有的響應全部來自于同一個后端容器,并且這正是我所期望的。
接下來我們將會在Docker Compose scale命令的幫助下增加后端容器的數量。
$ DOCKER_HOST=tcp://192.168.200.1:2378 docker-compose scale whoami=5 Creating and starting traefik_whoami_2 ... done Creating and starting traefik_whoami_3 ... done Creating and starting traefik_whoami_4 ... done Creating and starting traefik_whoami_5 ... done
我們觀察到Docker Compose通知Docker Swarm增加了更多的容器。
讓我們再次檢查一下是否現在已經有五個后端容器運行了:
$ for i in {1..5}; do curl -H Host:whoami.docker.localhost http://192.168.200.1; done I'm 5d829fecbdaa I'm 5eb115353885 I'm e0313ac24554 I'm 642b5d2c8d09 I'm f72892c9187c
非常好。很顯然Traefik剛才識別出了我們已經啟動了更多的容器并且使他們自動與前端相連。
我們能通過Traefik容器的日志觀察到具體的執行過程:
$ DOCKER_HOST=tcp://192.168.200.1:2378 docker-compose logs traefik ... traefik_1 | time="2016-06-07T06:50:38Z" level=debug msg="Configuration received from provider docker: {\"backends\":{\"backend-whoami\":{\"servers\":{\"server-traefik_whoami_1\":{\"url\":\"http://10.0.0.3:8000\",\"weight\":1},\"server-traefik_whoami_2\":{\"url\":\"http://10.0.0.5:8000\",\"weight\":1},\"server-traefik_whoami_3\":{\"url\":\"http://10.0.0.6:8000\",\"weight\":1},\"server-traefik_whoami_4\":{\"url\":\"http://10.0.0.4:8000\",\"weight\":1},\"server-traefik_whoami_5\":{\"url\":\"http://10.0.0.7:8000\",\"weight\":1}}}},\"frontends\":{\"frontend-Host-whoami-docker-localhost\":{\"backend\":\"backend-whoami\",\"routes\":{\"route-frontend-Host-whoami-docker-localhost\":{\"rule\":\"Host:whoami.docker.localhost\"}},\"passHostHeader\":true}}}" traefik_1 | time="2016-06-07T06:50:38Z" level=debug msg="Last docker config received less than 2s, waiting..." traefik_1 | time="2016-06-07T06:50:40Z" level=debug msg="Waited for docker config, OK" traefik_1 | time="2016-06-07T06:50:40Z" level=debug msg="Creating frontend frontend-Host-whoami-docker-localhost" traefik_1 | time="2016-06-07T06:50:40Z" level=debug msg="Wiring frontend frontend-Host-whoami-docker-localhost to entryPoint http" traefik_1 | time="2016-06-07T06:50:40Z" level=debug msg="Creating route route-frontend-Host-whoami-docker-localhost Host:whoami.docker.localhost" traefik_1 | time="2016-06-07T06:50:40Z" level=debug msg="Creating backend backend-whoami" traefik_1 | time="2016-06-07T06:50:40Z" level=debug msg="Creating load-balancer wrr" traefik_1 | time="2016-06-07T06:50:40Z" level=debug msg="Creating server server-traefik_whoami_4 at http://10.0.0.4:8000 with weight 1" traefik_1 | time="2016-06-07T06:50:40Z" level=debug msg="Creating server server-traefik_whoami_3 at http://10.0.0.6:8000 with weight 1" traefik_1 | time="2016-06-07T06:50:40Z" level=debug msg="Creating server server-traefik_whoami_2 at http://10.0.0.5:8000 with weight 1" traefik_1 | time="2016-06-07T06:50:40Z" level=debug msg="Creating server server-traefik_whoami_1 at http://10.0.0.3:8000 with weight 1" traefik_1 | time="2016-06-07T06:50:40Z" level=debug msg="Creating server server-traefik_whoami_5 at http://10.0.0.7:8000 with weight 1" traefik_1 | time="2016-06-07T06:50:40Z" level=info msg="Server configuration reloaded on :80"
通過日志我們能清楚的看到Traefik是怎么獲取Docker事件并作出反應的。
這難道不很帥嗎?
好了。這就是我們的快速設置Docker和Traefik的簡單微服務例子。
剩下唯一要做的就是再次清理容器。
$ DOCKER_HOST=tcp://192.168.200.1:2378 docker-compose down -v
你們注意到了“-v”參數了嗎?這應該對清除所有的容器,包括overlay網絡都非常的重要。沒有“-v”參數,我們在下次使用Docker Compose啟動應用的時候會產生一個錯誤。
在你關閉樹莓派之前停止所有的節點中的Cluster Lab也是一個必要的步驟。
所以在所有節點上執行一下
$ cluster-lab stop
命令。
在這么短小的一篇博客中使用了這么多有趣的技術是非常棒的一件事情。并且使它們運行起來一點都不難,是不是?
這都歸功于 Hypriot Cluster Lab 的功勞,當然Docker-Engine,Docker-Swarm和Docker-Compose也居功至偉。
所以一定要試試我們的Hypriot Cluster,并且嘗試一下 Hypriot Cluster Lab Demos 倉庫中的例子,或者添加一些你自己的例子。同時也歡迎大家提Pull request。
原文鏈接: Microservices Bliss with Docker and Traefik (翻譯:高洪濤)
===========================================
譯者介紹
高洪濤,當當網架構師,開源數據庫分庫分表中間件Sharding-JDBC作者。目前從事Docker相關研究工作。
來自: http://dockone.io/article/1418