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

資訊專欄INFORMATION COLUMN

使用 Etcd 和 Haproxy 做 Docker 服務發現

caozhijian / 1388人閱讀

摘要:服務發現服務發現被容器處理。主機首先,我們啟動注冊我們的地址是。首先,啟動然后,啟動一個簡單的客戶端容器并傳給它。這時,構造一些請求給服務端口來看他們的負載。同樣地,的事件和容器減輕了服務注冊和使用注冊服務發現比如的困難。

使用 Etcd 和 Haproxy 做 Docker 服務發現

標簽(空格分隔): Etcd Haproxy Docker 服務發現 architecture discovery docker-gen golang service


  

本文作者是 jwilder,本文的原文是 Docker Service Discovery Using Etcd and Haproxy

在前一篇文章中,我們展示了一種為 Docker 容器在同一臺主機上創建一個自動化 Nginx 反向代理的方式。那個設置對于前端 web app 來說工作的很好,但是對于后端服務來說它不是一個好的點子,因為通常它們跨越多個主機。

這篇文章描述了一個為后端服務的 Docker 容器提供服務發現的解決方案。

我們將構建的架構體系是模仿 SmartStack,但是使用 etcd 代替 Zookeeper,和兩個 docker 容器運行 docker-gen 和 haproxy 代替 nerve 和 synapse。

它怎樣工作的

類似于 SmartStack,我們的組件服務作為一個注冊(etcd),一個注冊伙伴進程(docker-register),發現伙伴進程(docker-discover),一些后端服務(whoami)以及最后一個消費者(ubuntu/curl)。

注冊和發現組件作為設備與應用程序容器工作,因此在后端或消費者容器的注冊或發現代碼不是被嵌入的。它們僅僅監聽端口或連接其他本地端口。

服務注冊 - Etcd

在任何事情被注冊之前,我們需要一些地方跟蹤注冊條目(比如,服務的 IP 和端口)。我們使用 etcd,因為它由服務注冊的簡單程序模型和支持鍵的 TTLs 以及目錄。

通常,你將運行 3到5個 etcd 節點,但是我們僅僅使用一個來保持事情簡化。

沒有理由為什么我們不能使用 Consul 或任何其他存儲選項支持 TTL 過期。

開始 etcd:

docker run -d --name etcd -p 4001:4001 -p 7001:7001 coreos/etcd
服務注冊 - docker-register

注冊服務容器被 jwilder/docker-register 容器處理。這個容器注冊其他運行在同一臺主機上的容器到 etcd 中。我們想注冊的容器必須暴露一個端口。容器在不同的主機上運行相同的鏡像是在 etcd 中被分組并將構成一個負載均衡集群。容器怎樣分組是有點亂的,為這個演練我已經選擇了容器鏡像名字。在一個真實的部署中,你可能想通過環境變量,服務版本或其他的元數據分組。

(當前的實現僅僅支持每個容器一個端口并假設它當前是 TCP,沒有理由為什么不能支持多個端口和類型以及不同的分組屬性)

docker-register 使用 docker-gen連同一個 Python 腳本作為一個模板。當運行的時候,動態的生成一個腳本,將在 /backends 目錄注冊每個容器的 IP 和端口。

docker-gen 關注監控 docker events和調用在一個間隔調用生成腳本來確保 TTLs 始終在最近的日期,如果 docker-register 停止了,注冊過期。

為了啟動 docker-register,我們需要傳遞主機的外部 IP,其他的主機能訪問它的容器以及你的 etcd 主機的地址。 為了調用它的 API,docker-gen 要求訪問 docker daemon,因此我們也綁定掛載 docker 的 unix socket 到容器中。

HOST_IP=$(hostname --all-ip-addresses | awk "{print $1}")
ETCD_HOST=w.x.y.z:4001
docker run --name docker-register -d -e HOST_IP=$HOST_IP -e ETCD_HOST=$ETCD_HOST -v /var/run/docker.sock:/var/run/docker.sock -t jwilder/docker-register
服務發現 - docker-discover

服務發現被 jwilder/docker-discover 容器處理。 docker-discover 周期性的投票 etcd 并通過監聽每個服務類型來生成一個 haproxy 配置文件。

比如,容器運行 jwilder/whoami 被注冊在 /backends/whoami/以及被暴露在主機上的端口是 8000。

其他的容器需要調用 jwilder/whoami 服務,可以發送請求到 docker bridge IP:8000 或主機 IP:8000。

如果任何的后端服務宕了,haproxy 健康檢查從池子中移除它并將在一臺健康的主機上嘗試請求。這確保后端服務可以隨著需求被啟動和停止,以及處理注冊信息的不一致同時確保最小化的客戶端影響。

最后,stats 可以通過在 docker-discover 容器上訪問端口 1936 來查看。

運行 docker-discover:

ETCD_HOST=w.x.y.z:4001
docker run -d --net host --name docker-discover -e ETCD_HOST=$ETCD_HOST -p 127.0.0.1:1936:1936 -t jwilder/docker-discover

我們正在使用 --net host 以至于容器使用主機網絡棧。當這個容器綁定 8000 端口,它實際是綁定在主機的網絡上。這個簡化了代理的設置。

AWS Demo

我們將在 4 臺 AWS 主機上運行整套服務:一臺 etcd 主機, 一臺 client 主機 和 兩臺后端主機。后端服務 是一個簡單的返回主機名的 golang HTTP 服務。

Etcd 主機

首先,我們啟動 etcd 注冊:

$ hostname --all-ip-addresses | awk "{print $1}"
10.170.71.226

$ docker run -d --name etcd -p 4001:4001 -p 7001:7001 coreos/etcd

我們的 etcd 地址是 10.170.71.226。我們將在其他主機上使用它。如果我們正在運行的是一個在線環境,我們可以分配一個 EIP 和 DNS 地址給它使得它更容易配置。

后端主機

下一步,我們在每臺主機上啟動這個服務和 docker-register。該服務被配置成監聽容器中的 8000 端口并且我們讓 docker 把它發布在一臺主機上的隨機端口。

后端主機 1:

$ docker run -d -p 8000:8000 --name whoami -t jwilder/whoami
736ab83847bb12ffffdd8b09969433f3a02d64d5b0be48f7a5c59a594e3a6a3541
$ docker run --name docker-register -d -e HOST_IP=$(hostname --all-ip-addresses | awk "{print $1}") -e ETCD_HOST=10.170.71.226:4001 -v /var/run/docker.sock:/var/run/docker.sock -t jwilder/docker-register
77a49f732797333ca0c7695c6b590a64a7d75c14b5ffa0f89f8e0e21ae47ae3e

$ docker ps
CONTAINER ID        IMAGE                            COMMAND                CREATED             STATUS              PORTS                     NAMES
736ab83847bb        jwilder/whoami:latest            /app/http              48 seconds ago      Up 47 seconds       0.0.0.0:49153->8000/tcp   whoami
77a49f732797        jwilder/docker-register:latest   "/bin/sh -c "docker-   28 minutes ago      Up 28 minutes                                 docker-register

后端主機 2:

$ docker run -d -p 8000:8000 --name whoami -t jwilder/whoami
4eb0498e52076275ee0702d80c0d8297813e89d492cdecbd6df9b263a3df1c28
$ docker run --name docker-register -d -e HOST_IP=$(hostname --all-ip-addresses | awk "{print $1}") -e ETCD_HOST=10.170.71.226:4001 -v /var/run/docker.sock:/var/run/docker.sock -t jwilder/docker-register
832e77c83591cb33bba53859153eb91d897f5a278a74d4ec1f66bc9b97deb221

$ docker ps
CONTAINER ID        IMAGE                            COMMAND                CREATED             STATUS              PORTS                     NAMES
4eb0498e5207        jwilder/whoami:latest            /app/http              59 seconds ago      Up 58 seconds       0.0.0.0:49154->8000/tcp   whoami
832e77c83591        jwilder/docker-register:latest   "/bin/sh -c "docker-   34 minutes ago      Up 34 minutes                                 docker-register
客戶端主機

在客戶端主機,我們需要啟動 docker-discover 和一個客戶端服務。對于這個客戶端容器,我使用 Ubuntu Trusty 并將做一些 curl 請求。

首先,啟動 docker-discover:

$ docker run -d --net host --name docker-discover -e ETCD_HOST=10.170.71.226:4001 -p 127.0.0.1:1936:1936 -t jwilder/docker-discover

然后,啟動一個簡單的客戶端容器并傳給它 HOST_IP。我們正在使用 eth0 地址,但也可以使用 docker0 IP。我們正以一個環境變量傳給它因為它是被配置的在兩個部署之間變化的。

$ docker run -e HOST_IP=$(hostname --all-ip-addresses | awk "{print $1}") -i -t ubuntu:14.04 /bin/bash
$ root@2af5f52de069:/# apt-get update && apt-get -y install curl

這時,構造一些請求給 whoami 服務端口 8000 來看他們的負載。

$ root@2af5f52de069:/# curl $HOST_IP:8000
I"m 4eb0498e5207
$ root@2af5f52de069:/# curl $HOST_IP:8000
I"m 736ab83847bb
$ root@2af5f52de069:/# curl $HOST_IP:8000
I"m 4eb0498e5207
$ root@2af5f52de069:/# curl $HOST_IP:8000
I"m 736ab83847bb

我們可以在后端啟動一些實例:

$ docker run -d -p :8000 --name whoami-2 -t jwilder/whoami
$ docker run -d -p :8000 --name whoami-3 -t jwilder/whoami

$ docker ps
CONTAINER ID        IMAGE                            COMMAND                CREATED             STATUS              PORTS                     NAMES
5d5c12c96192        jwilder/whoami:latest            /app/http              3 seconds ago       Up 1 seconds        0.0.0.0:49156->8000/tcp   whoami-2
bb2a408b8ec5        jwilder/whoami:latest            /app/http              21 seconds ago      Up 20 seconds       0.0.0.0:49155->8000/tcp   whoami-3
4eb0498e5207        jwilder/whoami:latest            /app/http              2 minutes ago       Up 2 minutes        0.0.0.0:49154->8000/tcp   whoami
832e77c83591        jwilder/docker-register:latest   "/bin/sh -c "docker-   36 minutes ago      Up 36 minutes                                 docker-register

然后再次在客戶端主機上構造一些請求:

$ root@2af5f52de069:/# curl $HOST_IP:8000
I"m 736ab83847bb
$ root@2af5f52de069:/# curl $HOST_IP:8000
I"m 4eb0498e5207
$ root@2af5f52de069:/# curl $HOST_IP:8000
I"m bb2a408b8ec5
$ root@2af5f52de069:/# curl $HOST_IP:8000
I"m 5d5c12c96192
$ root@2af5f52de069:/# curl $HOST_IP:8000
I"m 736ab83847bb

最后,我們關閉一些容器,路由將被更新。這個殺死在后端 2 的任何東西。

$ docker kill 5d5c12c96192 bb2a408b8ec5 4eb0498e5207

$ root@2af5f52de069:/# curl $HOST_IP:8000
I"m 736ab83847bb
$ root@2af5f52de069:/# curl $HOST_IP:8000
I"m 67c3cccbb8ba
$ root@2af5f52de069:/# curl $HOST_IP:8000
I"m 736ab83847bb
$ root@2af5f52de069:/# curl $HOST_IP:8000
I"m 67c3cccbb8ba

如果你想看 haproxy 是怎樣負載流量的或監控錯誤,我們可以在 web 瀏覽器訪問客戶端主機的 1936 端口。

總結

雖然有不同的方式來實現服務發現,SmartStack 的伙伴注冊行為和代理保持應用程序代碼簡單以及非常容易的融合進一個分布式環境,真的適合 Docker 容器。

同樣地,Docker 的事件和容器 APIs 減輕了服務注冊和使用注冊服務發現(比如 etcd)的困難。

docker-register 和 docker-discover 的代碼在 github 上。雖然兩個都是有用的,但是有很多地方需要提升。請隨時提交或提出改進意見。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26353.html

相關文章

  • Docker服務發現 - 2

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

    madthumb 評論0 收藏0
  • 服務發現Docker

    摘要:為了動態配置管理,當我們啟動和停止一個新容器的時候,我們想后端能自動注冊進負載均衡器。這是基本需求,叫做服務發現我們想負載均衡器能自動發現提供服務的容器。一個團隊開發的簡單的服務發現的工具。服務發現目標是減少或消除組件之間的手動的連接。 注:該文由 adetante 編寫,原文地址為 Service discovery with Docker 這篇博客的第一篇文章,我將寫一篇...

    DataPipeline 評論0 收藏0
  • 閑談 Kubernetes 的主要特性經驗分享

    摘要:主要介紹的主要特性和一些經驗。先從整體上看一下的一些理念和基本架構,然后從網絡資源管理存儲服務發現負載均衡高可用安全監控等方面向大家簡單介紹的這些主要特性。集群范圍內的監控主要由和如構建。 主要介紹 Kubernetes 的主要特性和一些經驗。先從整體上看一下Kubernetes的一些理念和基本架構, 然后從網絡、 資源管理、存儲、服務發現、負載均衡、高可用、rolling upgra...

    Guakin_Huang 評論0 收藏0
  • 閑談 Kubernetes 的主要特性經驗分享

    摘要:主要介紹的主要特性和一些經驗。先從整體上看一下的一些理念和基本架構,然后從網絡資源管理存儲服務發現負載均衡高可用安全監控等方面向大家簡單介紹的這些主要特性。集群范圍內的監控主要由和如構建。 主要介紹 Kubernetes 的主要特性和一些經驗。先從整體上看一下Kubernetes的一些理念和基本架構, 然后從網絡、 資源管理、存儲、服務發現、負載均衡、高可用、rolling upgra...

    shevy 評論0 收藏0

發表評論

0條評論

caozhijian

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<