1. 程式人生 > >基於Docker的Consul叢集部署方案

基於Docker的Consul叢集部署方案

關於Consul

Consul 是一個支援多資料中心分散式高可用的服務發現和配置共享的服務軟體.
Consul 由 HashiCorp公司用Go語言開發, 基於Mozilla Public License 2.0的協議進行開源.
Consul 支援健康檢查,並允許 HTTP 和 DNS 協議呼叫 API 儲存鍵值對.
命令列超級好用的虛擬機器管理軟體 vgrant 也是 HashiCorp 公司開發的產品.
一致性協議採用 Raft 演算法,用來保證服務的高可用. 使用 GOSSIP 協議管理成員和廣播訊息, 並且支援 ACL 訪問控制.

關於官方consul映象

關於官方consul映象,三點說明:
+ 想對於其他版本映象,其stars和pull數量是最多的, pull達到10M+;
+ 官方文件可讀性相對不夠好, 有些繞;
+ 目前官方映象更新進度基本與consul最新版本保持一致。

多機部署consul:0.8.5版本操作參考

部分引數說明
  • –net=host docker引數, 使得docker容器越過了net namespace的隔離,免去手動指定埠對映的步驟
  • -server consul支援以server或client的模式執行, server是服務發現模組的核心, client主要用於轉發請求
  • -advertise 將本機私有IP傳遞到consul
  • -bootstrap-expect 指定consul將等待幾個節點連通,成為一個完整的叢集
  • -retry-join 指定要加入的consul節點地址,失敗會重試, 可多次指定不同的地址
  • -client consul繫結在哪個client地址上,這個地址提供HTTP、DNS、RPC等服務,預設是127.0.0.1
  • -bind 該地址用來在叢集內部的通訊,叢集內的所有節點到地址都必須是可達的,預設是0.0.0.0
  • allow_stale 設定為true, 表明可以從consul叢集的任一server節點獲取dns資訊, false則表明每次請求都會經過consul server leader
叢集的多機部署參考
  • 多中心部署結構圖

    consul部署模式
    生產環境下, 一般一個宿主host一個consul節點;
    server節點建議一個數據中心部署3-5個, client節點可部署任意節點。

  • 啟動consul server節點, 在對應的機器上root許可權下執行以下指令碼(需修改節點列表: nodes=(…) ):

#!/bin/bash
conf_dir=/opt/consul/conf mkdir -p ${conf_dir} nodes=( 192.168.1.10 192.168.1.11 192.168.1.12 ) consul_ver=0.8.5 retry_interval=15s contain_svr_name=consul_server privIP=$(/sbin/ifconfig eth0 | sed -n 's/.*inet \(addr:\)\?\([0-9.]\{7,15\}\) .*/\2/p') if [[ !("${nodes[@]}" =~ $privIP) ]]; then echo -e "Current node:${privIP} not in configured server nodes.\n" exit fi svr_runing=$(docker ps -a | grep "${contain_svr_name}" | egrep "Up [About]|[0-9]{1,}") if [[ ${svr_runing} != "" ]]; then echo -e "Current container of consul server has been running.\n" exit else svr_exists=$(docker ps -a | grep "${contain_svr_name}") if [[ ${svr_exists} != "" ]]; then echo -e "Now try to start the container as it stopped...\n" docker start ${svr_exists} sleep 2 docker ps -a grep "${contain_svr_name}" exit fi fi echo -e "To start a new container for consul...\n" echo -e "To initialize configuration...\n" nodels="" for host in ${nodes[*]} do if [[ $nodels != "" ]]; then nodels=$nodels, fi nodels=$nodels"\"$host\"" done config="{\n \"datacenter\": \"dctest\",\n \"retry_join\": [${nodels}],\n \"retry_interval\": \"${retry_interval}\",\n \"rejoin_after_leave\": true,\n \"start_join\": [${nodels}],\n \"bootstrap_expect\": 3,\n \"server\": true,\n \"ui\": true,\n \"dns_config\": {\"allow_stale\": true, \"max_stale\": \"5s\"},\n \"node_name\": \"$HOSTNAME\"\n }\n" echo $config echo -e ${config} > ${conf_dir}/server.json echo -e ${config} docker run -d -v ${conf_dir}:${conf_dir} \ --name ${contain_svr_name} \ --net=host consul:${consul_ver} agent \ -config-dir=${conf_dir} \ -client=0.0.0.0 \ -bind=${privIP} \ -advertise=${privIP} sleep 2 svr_runing=$(docker ps -a | grep "${contain_svr_name}" | egrep "Up [About]|[0-9]{1,}") if [[ ${svr_runing} == "" ]]; then echo -e "\nError: docker-consul failed to start...\n" exit fi echo -e "\nOK: docker-consul has started as background server.\n"
  • 啟動consul client節點(任意數量或不部署), 在需要部署的機器上執行(需修改svrnodes列表):
#!/bin/bash

conf_dir=/opt/consul/conf
mkdir -p ${conf_dir}

svrnodes=(
192.168.1.10
192.168.1.11
192.168.1.12
)
privIP=$(/sbin/ifconfig eth0 | sed -n 's/.*inet \(addr:\)\?\([0-9.]\{7,15\}\) .*/\2/p')
consul_ver=0.8.5
retry_interval=15s
contain_cli_name=consul_client

if [[ "${svrnodes[@]}" =~ $privIP ]];
then
    echo -e "Current node:${privIP} is configured for server consul, not to run client mode.\n"
    exit
fi

svr_runing=$(docker ps -a | grep "${contain_cli_name}" | egrep "Up [About]|[0-9]{1,}")
if [[ ${svr_runing} != "" ]];
then
    echo -e "Current container of consul client has been running.\n"
    exit
else
    svr_exists=$(docker ps -a | grep "${contain_cli_name}")
    if [[ ${svr_exists} != "" ]];
    then
        echo -e "Now try to start the container as it stopped...\n"
        docker start ${svr_exists}
        sleep 2
        docker ps -a grep "${contain_cli_name}"
        exit
    fi
fi

echo -e "To start a new container for consul...\n"
echo -e "To initialize configuration...\n"

nodels=""
for host in ${svrnodes[*]}
do
    if [[ $nodels != "" ]];
    then
        nodels=$nodels,
    fi
    nodels=$nodels"\"$host\""
done

config="{\n
\"retry_join\": [${nodels}],\n
\"retry_interval\": \"${retry_interval}\",\n
\"rejoin_after_leave\": true,\n
\"start_join\": [${nodels}],\n
\"server\": false,\n
\"ui\": true,\n
\"node_name\": \"$HOSTNAME\"\n
}\n"

echo $config
echo -e ${config} > ${conf_dir}/client.json
echo -e ${config}

docker run -d -v ${conf_dir}:${conf_dir} \
    --name ${contain_cli_name} \
    --net=host consul:${consul_ver} agent \
    -config-dir=${conf_dir} \
    -client=0.0.0.0 \
    -advertise=${privIP}

sleep 2

svr_runing=$(docker ps -a | grep "${contain_cli_name}" | egrep "Up [About]|[0-9]{1,}")
if [[ ${svr_runing} == "" ]];
then
    echo -e "\nError: docker-consul client node failed to start...\n"
    exit
fi
echo -e "\nOK: docker-consul has started as a client node.\n"
  • 檢查叢集的狀態

    通過webUI地址: http://<其中一個節點ip>:8500/ui/可檢視叢集狀態,正常情況下會顯示3 passing
    通過docker命令列:

[email protected]:~# docker exec -it consul_server consul members
Node                          Address             Status  Type    Build  Protocol  DC
hostname1  192.168.1.10:8301  alive   server  0.8.5  2         dctest
hostname2  192.168.1.11:8301  alive   server  0.8.5  2         dctest
hostname3  192.168.1.12:8301  alive   server  0.8.5  2         dctest
hostname4  192.168.1.13:8301  alive   client  0.8.5  2         dctest

相關推薦

基於Docker的Consul叢集部署方案

關於Consul Consul 是一個支援多資料中心分散式高可用的服務發現和配置共享的服務軟體. Consul 由 HashiCorp公司用Go語言開發, 基於Mozilla Public Licen

redis叢集部署方案

1)     系統包安裝 配置作業系統yum 源安裝以下系統包 安裝gcc:yum install gcc 安裝zlib:yum install zib 安裝ruby:yum install ruby 2.0以上 安裝rubygems:yum install

高可用的K8S叢集部署方案

涉及到的內容 LVS HAProxy Harbor etcd Kubernetes (Master Worker) 整體拓補圖 以上是最小生產可用的整體拓補圖(相關節點根據需要進行增加,但不能減少) 按功能組劃分 SLB LVS HAProxy etcd K8S Node (Master / W

Ice系列--基於IceGrid的部署方案

前言 前一篇文章介紹了IceGrid的簡單應用。這篇文章來介紹一下它的高階玩法—如何將模板,複製組,知名物件應用於部署方案及其作用。   基於模板的部署方案 之前介紹了xml格式的配置檔案通過各種描述符如node,server,adaptor等,描述應用部署資訊。當服務部署複雜度增加時,書寫這些描述

基於docker-compose部署tendermint多節點叢集

一.我們可以通過 docker-compose 來啟動多個 container 通過官方文件我們知道啟動 tendermint 叢集需要下面幾個步驟: 每個 node 都需要通過 tendermint init 來進行初始化; 需要有一個包含所有 validator 節點

在Linux安裝Memcached基於記憶體的快取及加速叢集部署防止單點現象

關於實現 memcached 快取叢集可以有多種方式,一種是使用 Repcached(memcached同步補丁),Repcached 優點主要是資料冗餘,兩臺 memcached 都可以進行讀寫操作,缺點是隻支援單對單,指支援 1.2.x 版本,所以受到的侷限性

基於Hadoop分散式叢集部署Hive2.3

1. 基於docker安裝mysql 由於自己以前在Ubuntu kylin 16.04的系統上安裝mysql5.7一直有問題,後來學會了使用docker安裝mysql。覺得這個方法很方便,所以這次繼續使用docker安裝mysql。 ① 安裝docker 參考

龍芯電腦平臺kubernetes叢集編譯及部署方案

http://ask.loongnix.org/?/article/105  一、環境 作業系統: loongnix 核心: 3.10.84 go版本: go1.9.2 linux/mips64le cfssl(1.2.0) etcd(3.2.12) flannel(0.9.1) k

基於ubuntu14.04的ambari安裝及叢集部署

第一節. Ambari簡介Ambari跟Hadoop等開源軟體一樣,也是Apache Software Foundation中的一個專案,並且是頂級專案。目前最新的釋出版本是2.4.1。就Ambari的作用來說,就是建立、管理、監視Hadoop的叢集,但是這裡的Hadoop是廣義,指的是Hadoop整個生態圈

docker搭建基於percona-xtradb-cluster方案的myql叢集

一、部署環境 序號 hostname ip 備註 1 manager107 10.0.3.107 centos7;3.10.0-957.1.3.el7.x86_64 2 worke

【Docker】基於例項專案的叢集部署(三)Linux基礎命令

Linux系統作為優秀的企業級伺服器系統,有多處優點: 可靠的安全性 良好的穩定性 完善的網路功能 多使用者任務 豐富的軟體支援 跨平臺的硬體支援 目錄結構 我們可以通過以下結構瞭解Linux的目錄作用: 命令操作

【Docker】基於例項專案的叢集部署(二)部署專案例項介紹與搭建

部署專案簡介 我們要部署的專案是人人網的一個基於前後端分離的專案:renren-fast。 你可以在這裡對該專案進行下載,並對相關介紹文件進行了解: https://www.renren.io/community/project https://www.renren.io/guide

【Docker】基於例項專案的叢集部署(一)安裝環境搭建

叢集 叢集具有三高特點: 高效能 高負載 高可用 現在的環境中,經常會用到叢集,如資料庫叢集。如,我們在主機上部署資料庫節點,形成叢集。 安裝環境與配置 在Docker中部署叢集,首先要安裝Linux環境,這裡我們使用VMware虛擬機

ActiveMq 叢集部署 三種方案 + 負載均衡+其他細節點

備忘用 訊息的儲存三種方式 : kahaDB ,levelDB,資料庫。 (1) kahaDB 可以通過檔案共享來實現 高可用,需要對linux進行配置,這裡不做具體介紹。 (2)levelDB 是 activeMq 支援的一種高可用策略 ,需要搭建至少三

Mycat之——Mycat叢集部署基於HAProxy + Mycat)

一、軟體版本 作業系統:CentOS-6.5-x86_64 JDK版本:jdk1.7.0_80 HAProxy版本:haproxy-1.5.19.tar.gz Mycat版本:Mycat-server-1.5.1-RELEASE-20170717215510-linux.

基於 Ansible 快速部署 kubernetes 1.10.4 HA 高可用叢集

一、背景       菜鳥只是拿來試試,順便記錄下過程。二、部署過程2.1  準備機器      本次實驗準備了4臺虛機,192.168.5.201~204 ,主機名 node-01 ~ node-04      node-01 當作部署機,node-01~02 作為 Mas

基於kubeadm的kubernetes叢集部署

目標:使用kubeadm部署kubernetes叢集環境:CentOS 7步驟:基礎環境配置->kubernetes安裝前設定(源、映象及相關配置)->kubeadm部署(master)->啟用基於flannel的Pod網路->kubeadm加入nod

kubernetes v1.12.0叢集部署(二進位制方式+基於CA簽名雙向數字證書認證方式)

kubernetes 最簡單的方式是通過yum install kubernetes 直接安裝,但是預設安裝的是v5版本的kubernetes,所以不推薦使用,還有一種是在v1.4版本開始引入了的kubeadm工具一鍵部署,但是如果 沒有訪問gcr.io的網路環境的話部署過程

基於Docker、Jenkins和Saltstack的持續部署方案

一、基礎環境 1、Centos7.2 # cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) # docker version Client: Version: 1.12.6 A

基於Kafka如何部署一個穩定可靠的zookeeper叢集服務

背景 一個月左右zk掛了2次,在此期間 Mafka和其他服務不可用,因為業務(使用不當)原因導致zk掛掉,間接影響其他服務(包括mafka)可用性,目前線上多個業務和多種服務共同一套mobile-zk叢集, 只要一個業務使用不當,對zk造成影響或不可用,就