国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

服務(wù)發(fā)現(xiàn)與 Docker

DataPipeline / 2657人閱讀

摘要:為了動(dòng)態(tài)配置管理,當(dāng)我們啟動(dòng)和停止一個(gè)新容器的時(shí)候,我們想后端能自動(dòng)注冊(cè)進(jìn)負(fù)載均衡器。這是基本需求,叫做服務(wù)發(fā)現(xiàn)我們想負(fù)載均衡器能自動(dòng)發(fā)現(xiàn)提供服務(wù)的容器。一個(gè)團(tuán)隊(duì)開(kāi)發(fā)的簡(jiǎn)單的服務(wù)發(fā)現(xiàn)的工具。服務(wù)發(fā)現(xiàn)目標(biāo)是減少或消除組件之間的手動(dòng)的連接。

  

注:該文由 adetante 編寫(xiě),原文地址為 Service discovery with Docker

這篇博客的第一篇文章,我將寫(xiě)一篇基于 Docker 容器構(gòu)建一個(gè)不可變架構(gòu)的解決方案的文章。

這個(gè)主題將通過(guò)系列文章來(lái)描述,從最簡(jiǎn)單的案例到更復(fù)雜的架構(gòu)。

總體的思想是設(shè)計(jì)一個(gè)“基于概念驗(yàn)證”的解決方案,它允許:

啟動(dòng)和停止一個(gè)新容器,如果系統(tǒng)需要擴(kuò)展或是下線

當(dāng)一個(gè)新版本的應(yīng)用準(zhǔn)備推送到生產(chǎn),這時(shí)使用新容器替換老的容器

使用服務(wù)注冊(cè)和發(fā)現(xiàn)來(lái)自動(dòng)把新的容器推送到生產(chǎn)架構(gòu)

概述

這個(gè)邏輯架構(gòu)是非常簡(jiǎn)單的,一個(gè)無(wú)狀態(tài)的應(yīng)用通過(guò)負(fù)載均衡器訪問(wèn)。

每個(gè)應(yīng)用的實(shí)例運(yùn)行在它自己的 docker 容器中。

為了動(dòng)態(tài)配置管理,當(dāng)我們啟動(dòng)和停止一個(gè)新容器的時(shí)候,我們想后端能自動(dòng)注冊(cè)進(jìn)負(fù)載均衡器。這是基本需求,叫做**服務(wù)發(fā)現(xiàn)***:我們想負(fù)載均衡器能自動(dòng)發(fā)現(xiàn)提供服務(wù)的容器。

在這篇文章中,所有的節(jié)點(diǎn)將運(yùn)行在相同的 docker 主機(jī)上。這是非常簡(jiǎn)單的,但是這是實(shí)現(xiàn)基礎(chǔ)概念的第一個(gè)方法。然后我們將通過(guò)允許在不同主機(jī)上透明的部署來(lái)是架構(gòu)復(fù)雜化。

工具集

第一個(gè)示例將使用以下工具實(shí)現(xiàn):

Docker。一個(gè)運(yùn)行應(yīng)用容器的開(kāi)源平臺(tái)

Synapse。一個(gè) Airbnb 團(tuán)隊(duì)開(kāi)發(fā)的簡(jiǎn)單的服務(wù)發(fā)現(xiàn)的工具

Haproxy。一個(gè)負(fù)載一個(gè)后端節(jié)點(diǎn)列表的 TCP 流量代理,它打開(kāi)一個(gè)本地的端口,然后把流量傳遞進(jìn)這個(gè)后端節(jié)點(diǎn)的端口。

服務(wù)發(fā)現(xiàn)

目標(biāo)是減少或消除組件之間的“手動(dòng)”的連接。當(dāng)你把你的應(yīng)用程序推送進(jìn)生產(chǎn)的時(shí)候,所有的這些事情都可以配置:數(shù)據(jù)庫(kù)服務(wù)器的主機(jī)和端口,REST 服務(wù)的 URL 等等,在一個(gè)高可擴(kuò)展的架構(gòu)中,這些連接可以動(dòng)態(tài)改變。一個(gè)新的后端可以被添加,一個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)可以被停止。你的應(yīng)用需要適應(yīng)這種動(dòng)態(tài)環(huán)境。

這里有一些工具可以管理這些需求(Apache Zookeeper, etcd, ...)。這些工具的普遍原則是:當(dāng)啟動(dòng)的時(shí)候,一個(gè)服務(wù)的實(shí)例必須注冊(cè)進(jìn)配置服務(wù)器。當(dāng)停止的時(shí)候(完美停止或是 Crash 了),節(jié)點(diǎn)必須從配置服務(wù)中移除掉。注冊(cè)后,其他服務(wù)可以在配置服務(wù)器中搜索到提供制度服務(wù)的實(shí)例列表(主機(jī)和端口)。

Synapse

Synapse 是一個(gè)簡(jiǎn)單的服務(wù)發(fā)現(xiàn)的工具。Synapse 與以下倆個(gè)組件一起使用:

Watcher:它們經(jīng)常檢查一組服務(wù)器提供的服務(wù)。這可以通過(guò)連接 Zookeeper,etcd 或是通過(guò)使用 Docker API 來(lái)檢查 Docker 容器來(lái)實(shí)現(xiàn)。

Haproxy:Synapse 根據(jù) watcher 的結(jié)果來(lái)自動(dòng)改變 HAproxy 的配置。這個(gè)意味著當(dāng)一個(gè)新的實(shí)例被 watcher 發(fā)現(xiàn),一個(gè)后端會(huì)被添加進(jìn) HAproxy 并且可以通過(guò)代理的本地端口訪問(wèn)的。同樣地,當(dāng)實(shí)例停止的時(shí)候,Synapse 移除后端節(jié)點(diǎn)。

第一個(gè)解決方案

第一個(gè)解決方案將使用 Synapse 和 檢查 Docker 容器實(shí)現(xiàn)。

Synapse 管理一個(gè)運(yùn)行在安裝了 Docker 的相同的主機(jī)上的以 8080 端口運(yùn)行著的 HAproxy 實(shí)例。

Synapse 檢查 Docker 來(lái)發(fā)現(xiàn)容器是否運(yùn)行著一個(gè)指定鏡像并且暴露一個(gè)指定端口。為每一個(gè)匹配的容器,Synapse 把其添加進(jìn) HAproxy 的配置。

對(duì)于這個(gè)示例,我們從一個(gè)干凈的 *Ubuntu 14.04 amd64 安裝開(kāi)始。

安裝 Docker

安裝步驟已經(jīng)在 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

把以下行添加進(jìn) /etc/default/docker,使得 Docker API 在 tcp 上可用:

DOCKER_OPTS="-H 127.0.0.1:4243"

重起 docker:

$ sudo service docker restart

最后,定義以下環(huán)境變量來(lái)以便 docker 客戶端使用 tcp API:

$ export DOCKER_HOST=tcp://127.0.0.1:4243
為 web(nodejs)應(yīng)用程序創(chuàng)建鏡像

從 Docker 倉(cāng)庫(kù)獲取最新的 Ubuntu 鏡像

$ sudo -E docker pull ubuntu:latest

啟動(dòng)一個(gè)新的容器

$ sudo -E docker run -ti ubuntu bash

在這個(gè)容器中,安裝 nodejs

$ apt-get update && apt-get install -y nodejs

在這個(gè)容器中,使用以下內(nèi)容創(chuàng)建一個(gè)簡(jiǎn)單的 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/");

在這個(gè)容器中,使用以下內(nèi)容編寫(xiě)啟動(dòng)腳本 /run.sh

#! /bin/sh
/usr/bin/nodejs /server.js

$ chmod a+x /run.sh

停止容器并且創(chuàng)建一個(gè)新的鏡像:

$ 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

在主機(jī)上安裝 synapse

$ sudo apt-get install build-essential ruby ruby-dev haproxy
$ sudo gem install synapse

編輯 /etc/default/haproxy 把 ENABLED 設(shè)置成 1

啟動(dòng)一個(gè)后端實(shí)例

啟動(dòng)一個(gè) webapp 容器的實(shí)例:

$ sudo -E docker run -d -p 8000 local/nodeapp /run.sh

通過(guò)直接在這個(gè)容器中調(diào)用 nodejs 來(lái)測(cè)試。我們必須首先獲取暴露的公共端口。

# 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 自動(dòng)配置 HAproxy

使用以下內(nèi)容創(chuàng)建一個(gè) /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"
    ]
  }
}

我們可以在這個(gè)文件中看到:

services.nodesrv.discovery: 配置的觀察者。這里我們使用 Docker API 來(lái)發(fā)現(xiàn)容器運(yùn)行的名為 local/nodeapp 的鏡像以及它暴露的 8080 端口

services.nodesrv.haproxy:配置與 nodesrv service 有關(guān)的相關(guān)的 HAproxy 端口

haproxy:被 Synapse 管理的全局配置實(shí)例

啟動(dòng) HAproxy 和 Synapse

$ sudo service haproxy start
$ sudo synapse -c /etc/synapse.json.conf

通過(guò)直接調(diào)用 HAproxy(監(jiān)聽(tīng) 8080 端口)來(lái)測(cè)試

$ curl http://localhost:8080
# Responds Hello from {container_id}

用 nodeapp 啟動(dòng)第二個(gè)容器:

$ sudo -E docker run -d -p 8000 local/nodeapp /run.sh

通過(guò) HAproxy 測(cè)試一些請(qǐng)求。幾秒后,每個(gè)節(jié)點(diǎn)都將響應(yīng)。
在一個(gè)新的 shell 中,運(yùn)行一下循環(huán),每?jī)擅胝{(diào)用一次 HAproxy:

while :
do
    curl http://localhost:8080
    sleep 2
done

HAproxy 不是通過(guò) container1 就是通過(guò) container2 響應(yīng)。

停止其中一個(gè)容器:

$ sudo -E docker stop {container_id}

幾秒后,僅僅剩下的容器響應(yīng)。

但是在之前我們可以看到一些 503 Service Unavailable 錯(cuò)誤。這是由于 Synapse 發(fā)現(xiàn)停止的容器并且從代理移除它的時(shí)候。

總結(jié)

在第一篇文章中,我配置 HAprxoy 從 Docker 容器發(fā)現(xiàn)后端節(jié)點(diǎn)。Synapse 對(duì)使這個(gè)進(jìn)程自動(dòng)化給予了很多幫助。盡管如此,這個(gè)解決方案還有一些缺點(diǎn):

因?yàn)?Synapse 使用 Docker API 發(fā)現(xiàn)后端服務(wù),所有的被組織在一個(gè) HAprxoxy 前端的服務(wù)必須是在同一個(gè) Docker 主機(jī)上。

正如我們所看到的,當(dāng)停止容器的時(shí)候,會(huì)有一些中斷。這是由于 Synapse 定期的調(diào)用 Docker API 來(lái)發(fā)現(xiàn)新的或是已經(jīng)移除的容器。

在下一篇文章中,這個(gè)解決方案將被擴(kuò)展成允許在多主機(jī)透明部署。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/26343.html

相關(guān)文章

  • 基于 Docker 1.12 Swarm 的集群管理開(kāi)發(fā)實(shí)踐

    摘要:由于沒(méi)有了中心化的負(fù)載均衡器,集群不會(huì)因某臺(tái)機(jī)器異常而導(dǎo)致整個(gè)服務(wù)對(duì)外不可用,很好的避免了單點(diǎn)問(wèn)題,同時(shí)也帶了可擴(kuò)展性。 Mesos/Marathon 折騰久了,我們一直希望有機(jī)會(huì)深入到 Swarm 內(nèi)部一探究竟。 另外, Mesos 這一套東西雖然是久經(jīng)企業(yè)級(jí)考驗(yàn)的, 但是安裝、部署和使用相對(duì)復(fù)雜,上手有門(mén)檻。同時(shí),在今年的 DockerCon 上,內(nèi)置了Swarm 功能的 Dock...

    My_Oh_My 評(píng)論0 收藏0
  • Docker 服務(wù)發(fā)現(xiàn) - 2

    摘要:是一個(gè)鍵值存儲(chǔ),用于共享配置以及服務(wù)發(fā)現(xiàn)。對(duì)于我們而言,意味著注冊(cè)進(jìn)程必須考慮到端口映射。這個(gè)方法被用于管理服務(wù)發(fā)現(xiàn)。如果未指定,將被從的端口映射找到意味著,你必須在運(yùn)行的命令中指定它,比如。為了測(cè)試取消登記,停止一個(gè)容器將立即從中移除。 注:該文由 adetante 編寫(xiě),該文的原文地址為 Service discovery with Docker - 2 該文緊接著上篇文...

    madthumb 評(píng)論0 收藏0
  • 運(yùn)行在 Docker 上的微服務(wù) - 服務(wù)發(fā)現(xiàn)注冊(cè)

    摘要:運(yùn)行在上的微服務(wù)服務(wù)發(fā)現(xiàn)與注冊(cè)在上一節(jié)中,我們學(xué)習(xí)了如何在上構(gòu)建一個(gè)風(fēng)格的微服務(wù)。接下來(lái),我們將學(xué)習(xí)如何把運(yùn)行在上的微服務(wù)暴露在服務(wù)中心上,以便客戶端的調(diào)用。資源服務(wù)在關(guān)閉時(shí)需要將服務(wù)實(shí)例在服務(wù)中心進(jìn)行注銷(xiāo)操作。響應(yīng)用戶的終止。 運(yùn)行在 Docker 上的微服務(wù) - 服務(wù)發(fā)現(xiàn)與注冊(cè) tags: Docker Microservice RESTful etcd Author: And...

    陳偉 評(píng)論0 收藏0
  • 技術(shù)實(shí)踐 | Mesos 全方位“烹飪”指南

    摘要:之前提到的文件即可利用以下模板生成請(qǐng)注意,其中的與就是占位符。如將某一特定部署至生產(chǎn)環(huán)境并運(yùn)行個(gè)實(shí)例。而另一種方式則是使用等負(fù)載均衡器即服務(wù)器端發(fā)現(xiàn)。可重配置且能夠在變更發(fā)生后立即將請(qǐng)求路由至新實(shí)例。 如今與Mesos相關(guān)的文章可謂層出不窮,不過(guò)展示能夠直接用于生產(chǎn)的完整基礎(chǔ)設(shè)施的資料卻相當(dāng)少見(jiàn)。在今天的文章中,我將介紹各組件的配置與使用方式,旨在幫助大家利用Mesos構(gòu)建起持續(xù)交付且...

    archieyang 評(píng)論0 收藏0
  • Docker Swarm介紹

    摘要:后續(xù)將其他節(jié)點(diǎn)加入集群都會(huì)用到這個(gè)值將節(jié)點(diǎn)加入集群查看節(jié)點(diǎn)信息相關(guān)命令創(chuàng)建服務(wù)更新服務(wù)刪除服務(wù)減少服務(wù)實(shí)例增加服務(wù)實(shí)例查看所有服務(wù)查看服務(wù)的容器狀態(tài)查看服務(wù)的詳細(xì)信息。前言本篇是Docker第十三篇,Docker的使用至此就介紹完成,接下來(lái)繼續(xù)Kubernetes。Docker系列文章:為什么要學(xué)習(xí)DockerDocker基本概念Docker鏡像基本原理Docker容器數(shù)據(jù)卷Dockerfi...

    番茄西紅柿 評(píng)論0 收藏2637

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<