摘要:為了動態配置管理,當我們啟動和停止一個新容器的時候,我們想后端能自動注冊進負載均衡器。這是基本需求,叫做服務發現我們想負載均衡器能自動發現提供服務的容器。一個團隊開發的簡單的服務發現的工具。服務發現目標是減少或消除組件之間的手動的連接。
注:該文由 adetante 編寫,原文地址為 Service discovery with Docker
這篇博客的第一篇文章,我將寫一篇基于 Docker 容器構建一個不可變架構的解決方案的文章。
這個主題將通過系列文章來描述,從最簡單的案例到更復雜的架構。
總體的思想是設計一個“基于概念驗證”的解決方案,它允許:
啟動和停止一個新容器,如果系統需要擴展或是下線
當一個新版本的應用準備推送到生產,這時使用新容器替換老的容器
使用服務注冊和發現來自動把新的容器推送到生產架構
概述這個邏輯架構是非常簡單的,一個無狀態的應用通過負載均衡器訪問。
每個應用的實例運行在它自己的 docker 容器中。
為了動態配置管理,當我們啟動和停止一個新容器的時候,我們想后端能自動注冊進負載均衡器。這是基本需求,叫做**服務發現***:我們想負載均衡器能自動發現提供服務的容器。
在這篇文章中,所有的節點將運行在相同的 docker 主機上。這是非常簡單的,但是這是實現基礎概念的第一個方法。然后我們將通過允許在不同主機上透明的部署來是架構復雜化。
工具集第一個示例將使用以下工具實現:
Docker。一個運行應用容器的開源平臺
Synapse。一個 Airbnb 團隊開發的簡單的服務發現的工具
Haproxy。一個負載一個后端節點列表的 TCP 流量代理,它打開一個本地的端口,然后把流量傳遞進這個后端節點的端口。
服務發現目標是減少或消除組件之間的“手動”的連接。當你把你的應用程序推送進生產的時候,所有的這些事情都可以配置:數據庫服務器的主機和端口,REST 服務的 URL 等等,在一個高可擴展的架構中,這些連接可以動態改變。一個新的后端可以被添加,一個數據庫節點可以被停止。你的應用需要適應這種動態環境。
這里有一些工具可以管理這些需求(Apache Zookeeper, etcd, ...)。這些工具的普遍原則是:當啟動的時候,一個服務的實例必須注冊進配置服務器。當停止的時候(完美停止或是 Crash 了),節點必須從配置服務中移除掉。注冊后,其他服務可以在配置服務器中搜索到提供制度服務的實例列表(主機和端口)。
SynapseSynapse 是一個簡單的服務發現的工具。Synapse 與以下倆個組件一起使用:
Watcher:它們經常檢查一組服務器提供的服務。這可以通過連接 Zookeeper,etcd 或是通過使用 Docker API 來檢查 Docker 容器來實現。
Haproxy:Synapse 根據 watcher 的結果來自動改變 HAproxy 的配置。這個意味著當一個新的實例被 watcher 發現,一個后端會被添加進 HAproxy 并且可以通過代理的本地端口訪問的。同樣地,當實例停止的時候,Synapse 移除后端節點。
第一個解決方案第一個解決方案將使用 Synapse 和 檢查 Docker 容器實現。
Synapse 管理一個運行在安裝了 Docker 的相同的主機上的以 8080 端口運行著的 HAproxy 實例。
Synapse 檢查 Docker 來發現容器是否運行著一個指定鏡像并且暴露一個指定端口。為每一個匹配的容器,Synapse 把其添加進 HAproxy 的配置。
對于這個示例,我們從一個干凈的 *Ubuntu 14.04 amd64 安裝開始。
安裝 Docker安裝步驟已經在 Docker 的文檔中描述了:
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 $ sudo sh -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list" $ sudo apt-get update $ sudo apt-get install lxc-docker
把以下行添加進 /etc/default/docker,使得 Docker API 在 tcp 上可用:
DOCKER_OPTS="-H 127.0.0.1:4243"
重起 docker:
$ sudo service docker restart
最后,定義以下環境變量來以便 docker 客戶端使用 tcp API:
$ export DOCKER_HOST=tcp://127.0.0.1:4243為 web(nodejs)應用程序創建鏡像
從 Docker 倉庫獲取最新的 Ubuntu 鏡像
$ sudo -E docker pull ubuntu:latest
啟動一個新的容器
$ sudo -E docker run -ti ubuntu bash
在這個容器中,安裝 nodejs
$ apt-get update && apt-get install -y nodejs
在這個容器中,使用以下內容創建一個簡單的 nodejs 腳本 /server.js
var http = require("http"); var os = require("os"); var server = http.createServer(function (request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.end("Hello from " + os.hostname() + " "); }); server.listen(8000); console.log("Server running at http://127.0.0.1:8000/");
在這個容器中,使用以下內容編寫啟動腳本 /run.sh
#! /bin/sh /usr/bin/nodejs /server.js $ chmod a+x /run.sh
停止容器并且創建一個新的鏡像:
$ exit # Get the ID of the container $ sudo -E docker ps -a # Change 3796ab3f5b76 in the following command with the ID listed above $ sudo -E docker commit 3796ab3f5b76 local/nodeapp # Remove the old container $ sudo -E docker rm 3796ab3f5b76
在主機上安裝 synapse
$ sudo apt-get install build-essential ruby ruby-dev haproxy $ sudo gem install synapse
編輯 /etc/default/haproxy 把 ENABLED 設置成 1。
啟動一個后端實例
啟動一個 webapp 容器的實例:
$ sudo -E docker run -d -p 8000 local/nodeapp /run.sh
通過直接在這個容器中調用 nodejs 來測試。我們必須首先獲取暴露的公共端口。
# Get the public port (mapped to 8000 in the container, here 49153) $ sudo docker ps $ curl http://127.0.0.1:49153 # Responds with "Hello from {container_id}"
使用 Synapse 自動配置 HAproxy
使用以下內容創建一個 /etc/synapse.json.conf 配置文件:
{ "services": { "nodesrv": { "discovery": { "method": "docker", "servers": [ { "name": "localhost", "host": "localhost" } ], "container_port": 8000, "image_name": "local/nodeapp" }, "haproxy": { "port": 8080, "listen": [ "mode http", "option httpchk /", "http-check expect string Hello" ] } } }, "haproxy": { "reload_command": "service haproxy reload", "config_file_path": "/etc/haproxy/haproxy.cfg", "do_writes": true, "do_reloads": true, "global": [ "chroot /var/lib/haproxy", "user haproxy", "group haproxy", "daemon" ], "defaults": [ "contimeout 5000", "clitimeout 50000", "srvtimeout 50000" ] } }
我們可以在這個文件中看到:
services.nodesrv.discovery: 配置的觀察者。這里我們使用 Docker API 來發現容器運行的名為 local/nodeapp 的鏡像以及它暴露的 8080 端口
services.nodesrv.haproxy:配置與 nodesrv service 有關的相關的 HAproxy 端口
haproxy:被 Synapse 管理的全局配置實例
啟動 HAproxy 和 Synapse
$ sudo service haproxy start $ sudo synapse -c /etc/synapse.json.conf
通過直接調用 HAproxy(監聽 8080 端口)來測試
$ curl http://localhost:8080 # Responds Hello from {container_id}
用 nodeapp 啟動第二個容器:
$ sudo -E docker run -d -p 8000 local/nodeapp /run.sh
通過 HAproxy 測試一些請求。幾秒后,每個節點都將響應。
在一個新的 shell 中,運行一下循環,每兩秒調用一次 HAproxy:
while : do curl http://localhost:8080 sleep 2 done
HAproxy 不是通過 container1 就是通過 container2 響應。
停止其中一個容器:
$ sudo -E docker stop {container_id}
幾秒后,僅僅剩下的容器響應。
但是在之前我們可以看到一些 503 Service Unavailable 錯誤。這是由于 Synapse 發現停止的容器并且從代理移除它的時候。
總結在第一篇文章中,我配置 HAprxoy 從 Docker 容器發現后端節點。Synapse 對使這個進程自動化給予了很多幫助。盡管如此,這個解決方案還有一些缺點:
因為 Synapse 使用 Docker API 發現后端服務,所有的被組織在一個 HAprxoxy 前端的服務必須是在同一個 Docker 主機上。
正如我們所看到的,當停止容器的時候,會有一些中斷。這是由于 Synapse 定期的調用 Docker API 來發現新的或是已經移除的容器。
在下一篇文章中,這個解決方案將被擴展成允許在多主機透明部署。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26343.html
摘要:由于沒有了中心化的負載均衡器,集群不會因某臺機器異常而導致整個服務對外不可用,很好的避免了單點問題,同時也帶了可擴展性。 Mesos/Marathon 折騰久了,我們一直希望有機會深入到 Swarm 內部一探究竟。 另外, Mesos 這一套東西雖然是久經企業級考驗的, 但是安裝、部署和使用相對復雜,上手有門檻。同時,在今年的 DockerCon 上,內置了Swarm 功能的 Dock...
摘要:是一個鍵值存儲,用于共享配置以及服務發現。對于我們而言,意味著注冊進程必須考慮到端口映射。這個方法被用于管理服務發現。如果未指定,將被從的端口映射找到意味著,你必須在運行的命令中指定它,比如。為了測試取消登記,停止一個容器將立即從中移除。 注:該文由 adetante 編寫,該文的原文地址為 Service discovery with Docker - 2 該文緊接著上篇文...
摘要:運行在上的微服務服務發現與注冊在上一節中,我們學習了如何在上構建一個風格的微服務。接下來,我們將學習如何把運行在上的微服務暴露在服務中心上,以便客戶端的調用。資源服務在關閉時需要將服務實例在服務中心進行注銷操作。響應用戶的終止。 運行在 Docker 上的微服務 - 服務發現與注冊 tags: Docker Microservice RESTful etcd Author: And...
摘要:之前提到的文件即可利用以下模板生成請注意,其中的與就是占位符。如將某一特定部署至生產環境并運行個實例。而另一種方式則是使用等負載均衡器即服務器端發現。可重配置且能夠在變更發生后立即將請求路由至新實例。 如今與Mesos相關的文章可謂層出不窮,不過展示能夠直接用于生產的完整基礎設施的資料卻相當少見。在今天的文章中,我將介紹各組件的配置與使用方式,旨在幫助大家利用Mesos構建起持續交付且...
摘要:后續將其他節點加入集群都會用到這個值將節點加入集群查看節點信息相關命令創建服務更新服務刪除服務減少服務實例增加服務實例查看所有服務查看服務的容器狀態查看服務的詳細信息。前言本篇是Docker第十三篇,Docker的使用至此就介紹完成,接下來繼續Kubernetes。Docker系列文章:為什么要學習DockerDocker基本概念Docker鏡像基本原理Docker容器數據卷Dockerfi...
閱讀 1185·2023-04-25 17:05
閱讀 3011·2021-11-19 09:40
閱讀 3544·2021-11-18 10:02
閱讀 1740·2021-09-23 11:45
閱讀 3022·2021-08-20 09:36
閱讀 2783·2021-08-13 15:07
閱讀 1133·2019-08-30 15:55
閱讀 2459·2019-08-30 14:11