1. 程式人生 > >Docker 1.12 Swarm叢集實戰(第五章)

Docker 1.12 Swarm叢集實戰(第五章)

補充一些遺漏的問題.

本章主要內容:

  1. 使用 constraints 指定 service 約束.
  2. service 掛載使用本地volume.
  3. ELK日誌平臺使用GELF日誌驅動收集日誌.

1. 指定service約束

在前幾章中, 我們建立的 registry 服務,是由swarm自動排程定義執行在某個節點上的. 這樣的話我們如果我們重啟 service 以後, registry 服務可能會被啟動再隨機的節點.

造成我們上傳的映象都不見了. 如何解決這個問題呢?

在建立service的時候可以使用 --constraints 引數,後面跟表示式,限制service容器在每個節點的排程情況.比如你想指定service執行在某個節點上等.

例如指定service執行在node01上:

docker service create --name registry --publish 5000:5000 \
--constraint 'node.hostname==node01' registry

除了 hostname 也可以使用其他節點屬性來建立約束表示式寫法參見下表:

節點屬性 匹配 示例
node.id 節點 ID node.id == 2ivku8v2gvtg4
node.hostname 節點 hostname node.hostname != node02
node.role 節點 role: manager node.role == manager
node.labels 使用者自定義 node labels node.labels.security == high
engine.labels Docker Engine labels engine.labels.operatingsystem == ubuntu 14.04

使用者自定義labels可以使用 docker node update 命令新增, 例如:

# docker node update --label-add security=high node01

檢視自定義labels

# docker node inspect node01
[ { "ID": "0nhjsflo3tbd0b7hv2cyrjpin", ... "Spec": { "Labels": { "security": "high" }, "Role": "manager", "Availability": "active" }, "Description": { "Hostname": "node01", "Platform": { "Architecture": "x86_64", "OS": "linux" }, ... } ]

對於已有service, 可以通過 docker service update ,新增 constraint配置, 例如:

docker service update registry \
--constraint-add 'node.labels.security==high'

2. volume 建立管理

有了service約束, 我們可以保證我們的 registry 服務, 一直在node01節點上了. 不過還有一個問題, 就是如果我們刪除了 registry 服務. 那我們上傳的容器映象也就被刪除了.

如何保證即使 registry 服務被刪除, 映象可以保留呢?

這裡我們可以使用 docker volume 指定掛載一個數據卷用來儲存映象, 即使 registry 服務被刪除了. 我們重新啟動一個服務, 掛載這個資料卷. 我們上傳的映象還可以儲存的.

在 swarm 叢集中我們可以建立本地卷或者全域性捲來掛載到容器, 用來儲存資料.

  • 全域性卷可以被掛載在 swarm 叢集的任意節點, 所以不管你的服務容器啟動在哪個節點, 都可以訪問到資料. 不過docker目前還沒有預設的全域性卷驅動支援, 你可以安裝一些外掛驅動來實現全域性卷例如Flocker, Portworx等.

  • 本地卷, 就只存在與某個節點本地的一個掛載卷.

Storage is Hard 這裡我們還是使用簡單的本地卷吧, ^_^ .

為我們剛剛新建的 registry 服務, 掛載一個本地卷,可以使用如下命令:

docker service update registry \
       --mount-add type=volume,source=registry-vol,target=/var/lib/registry

source=registry-vol 中 registry-vol 為卷名字, 執行上述命令以後,docker會自動為我們建立一個 registry-vol 本地卷.

可以使用 docker volume ls 命令檢視:

# docker volume ls
DRIVER              VOLUME NAME
local               registry-vol

# docker volume inspect registry-vol
[
    {
        "Name": "registry-vol",
        "Driver": "local",
        "Mountpoint": "/var/lib/docker/volumes/registry-vol/_data",
        "Labels": null,
        "Scope": "local"
    }
]

上面命令, 可以看到本機卷掛載到節點的目錄.

這樣即使我們現在刪除 registry 服務. 也可以只用如下命令重新建立一個 registry 服務, 掛載 registry-vol 來找回我們的映象.

docker service create --name registry --publish 5000:5000 \
--mount source=registry-vol,type=volume,target=/var/lib/registry \
-e SEARCH_BACKEND=sqlalchemy \
--constraint 'node.hostname==node01' registry

測試

使用docker-compose 編譯上傳我們的docker幣映象

[[email protected] ~]# git clone https://github.com/jpetazzo/orchestration-workshop.git
[[email protected] ~]# orchestration-workshop/dockercoins
[[email protected] dockercoins]# cat docker-compose.yml-images
version: "2"

services:
  rng:
    build: rng
    image: ${REGISTRY_SLASH}rng${COLON_TAG}
    ports:
    - "8001:80"

  hasher:
    build: hasher
    image: ${REGISTRY_SLASH}hasher${COLON_TAG}
    ports:
    - "8002:80"

  webui:
    build: webui
    image: ${REGISTRY_SLASH}webui${COLON_TAG}
    ports:
    - "8000:80"
    volumes:
    - "./webui/files/:/files/"

  redis:
    image: redis

  worker:
    build: worker
    image: ${REGISTRY_SLASH}worker${COLON_TAG}

上傳我們的應用映象到 registry

export REGISTRY_SLASH=localhost:5000/
export COLON_TAG=:v0.01
docker-compose -f docker-compose.yml-images build
docker-compose -f docker-compose.yml-images push

測試 registry 內容

[root@node01 dockercoins]# curl localhost:5000/v2/_catalog
{"repositories":["hasher","rng","webui","worker"]}

刪除 registry 服務

[[email protected] dockercoins]# docker service ls
ID            NAME      REPLICAS  IMAGE     COMMAND
5qvu78ths5wb  registry  1/1       registry  
[root@node01 dockercoins]# docker service rm registry
registry

服務刪除以後我們可以看到本地卷還在.

[[email protected] dockercoins]# docker volume ls
DRIVER              VOLUME NAME
local               registry-vol

重建 registry 服務, 掛載 registry-vol 卷.

[[email protected] dockercoins]#  docker service create --name registry --publish 5000:5000  --mount source=registry-vol,type=volume,target=/var/lib/registry  -e SEARCH_BACKEND=sqlalchemy  --constraint 'node.hostname==node01' registry
[[email protected] dockercoins]# curl localhost:5000/v2/_catalog
{"repositories":["hasher","rng","webui","worker"]}

3. ELK日誌平臺使用GELF驅動收集日誌

上一章我們介紹了ELK日誌平臺, 用於管理收集swarm叢集的應用日誌. 當時我們使用的logspout容器, 自動將我們swarm節點上所有容器日誌傳送的日誌平臺.

可是如果我們關心特定容器的日誌, 並不想收集其他容器的日誌怎麼辦呢?

我們可以時候建立service的時候使用 --log-driver 引數, 使用GELF驅動將日誌傳送到ELK平臺.

建立ELK平臺

上一章已經有詳細說明了, 下面這裡簡單過一下, 湊字數.哈哈…

建立Logging網路

docker network create --driver overlay logging

建立Elasticsearch服務

docker service create --network logging --name elasticsearch \
--mount source=elasticsearch-vol,type=volume,target=/usr/share/elasticsearch \
--constraint 'node.hostname==node02' \
elasticsearch

建立Kibana服務

docker service create --network logging --name kibana --publish 5601:5601 \
      -e LOGSPOUT=ignore -e ELASTICSEARCH_URL=http://elasticsearch:9200 kibana

建立Logstash服務

我們重新build一個logstash映象, 使用 ~/orchestration-workshop/elk/logstash.conf 這個配置檔案.

[[email protected] ~]cd ~/orchestration-workshop/elk/
[[email protected] elk]# cat Dockerfile
FROM logstash
COPY logstash.conf /etc/logstash/
CMD ["-f", "/etc/logstash/logstash.conf"]
[[email protected] elk]# docker build -t localhost:5000/logstash .
[[email protected] elk]# docker push localhost:5000/logstash

啟動logstash

docker service create --network logging --name logstash -p 12201:12201/udp \
       localhost:5000/logstash

傳送容器日誌到logstash

我們已經有了ELK平臺, 下面我們啟動 docker幣 應用, 傳送容器日誌到logstash.

很簡單, 只要在建立 service 的時候新增 --log-driver 和 --log-opt兩個引數就行了.

#建立應用網路
docker network create --driver overlay dockercoins
#啟動我們的docker幣 webui應用
DOCKER_REGISTRY=localhost:5000
TAG=v0.01
docker service create --network dockercoins --name webui \
--log-driver gelf --log-opt gelf-address=udp://127.0.0.1:12201 \
       -p 8000:80 $DOCKER_REGISTRY/webui:$TAG

使用下面這段指令碼啟動hasher rng worker 應用:

DOCKER_REGISTRY=localhost:5000
TAG=v0.01
for SERVICE in hasher rng worker; do
docker service create --network dockercoins --name $SERVICE \
--log-driver gelf --log-opt gelf-address=udp://127.0.0.1:12201 \
       $DOCKER_REGISTRY/$SERVICE:$TAG
done

啟動redis資料庫:

docker service create --network dockercoins \
--limit-memory 100M --name redis \
--mount source=redis-vol,type=volume,target=/data \
--constraint 'node.hostname==node03' \
redis

為了方便觀看日誌, 我們sacle up下應用, 多啟動一些容器:

docker service scale worker=10 rng=10

##4. visualier

visualizer是一個小程式,用於視覺化 swarm 叢集容器分佈情況.

在 swarm 的manager節點上執行, HOST 引數指定節點IP地址.

docker run --name visualizer -d \
    -p 8089:8089 \
    -e HOST=192.168.33.101 \
    -e PORT=8089 \
    -v /var/run/docker.sock:/var/run/docker.sock \
    manomarks/visualizer

最後

挖坑, 有了日誌收集平臺, 我們還需要效能監控平臺, 所以下一章介紹下如何使用cadvisor, influxdb, grafana搭建簡單的swarm效能監控平臺.

influxdb

docker service create --network logging \
-p 8083:8083 -p 8086:8086 \
--mount source=influxdb-vol,type=volume,target=/var/lib/influxdb \
--name=influxdb --constraint 'node.hostname==node03' \
influxdb:alpine
docker service create --network logging --name cadvisor --mode global \
--mount source=/var/run/,type=bind,target=/var/run,readonly=false \
--mount source=/,type=bind,target=/rootfs,readonly=true \
--mount source=/sys,type=bind,target=/sys,readonly=true \
--mount source=/var/lib/docker/,type=bind,target=/var/lib/docker,readonly=true \
google/cadvisor:latest -storage_driver=influxdb -storage_driver_host=influxdb:8086 \
-storage_driver_db=cadvisor
docker service create --network logging -p 3000:3000 -e INFLUXDB_HOST=influxdb -e INFLUXDB_PORT=8086 -e INFLUXDB_NAME=grafana -e INFLUXDB_USER=root -e INFLUXDB_PASS=root -e "GF_SECURITY_ADMIN_PASSWORD=admin" --constraint 'node.hostname==node05' --name grafana grafana/grafana

相關推薦

Docker 1.12 Swarm叢集實戰()

補充一些遺漏的問題. 本章主要內容: 使用 constraints 指定 service 約束.service 掛載使用本地volume.ELK日誌平臺使用GELF日誌驅動收集日誌. 1. 指定service約束 在前幾章中, 我們建立的 registry 服務,是由

Docker 1.12 Swarm Mode叢集實戰(第二)

第二章 建立Swarm叢集 繼續上一章 Docker 1.12 Swarm Mode叢集實戰(第一章) 的內容, 為了產生更多的docker幣,我們需要搭建一個swarm叢集來scale out我們的docker幣應用,解決單節點的效能瓶頸。 2.1 Swarm Mo

Gradle 1.12使用者指南翻譯——十二. Maven 外掛

本文由CSDN部落格貌似掉線翻譯,其他章節的翻譯請參見:http://blog.csdn.net/column/details/gradle-translation.html翻譯專案請關注Github上的地址:https://github.com/msdx/gradledoc

機器學習實戰Logistic回歸

表示 article err () tail mat cycle col transpose def gradAscent(dataMatIn, classLabels): dataMatrix = mat(dataMatIn) #co

Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- :渲染流水線

學習目標 瞭解幾個用以表達真實場景的標誌和2D影象的深度空間; 學習在Direct3D中如何表示3D物體; 學習如何模擬虛擬攝像機; 理解渲染流水線:如何用幾何描述的3D場景渲染出2D影象; 1 3D幻覺 如何在2D平面(顯示器)上產生

docker 1.12 版本 docker swarm 叢集

   docker 1.12 版本 的新特性 (1)docker swarm:叢集管理,子命令有init, join, leave, update (2)docker service:服務建立,子命令有create, inspect, update, remove, tasks (3)docker no

docker version 1.12+ swarm 集群

docker swarm初次接觸docker 是在2016年初,當時是在一家初創公司Docker從v1.12.0後開始集成swarm mode(swarmkit),關於swarm的所有操作可以直接使用docker swarm 命令來完成。Docker Swarm是docker原生的用於管理docker集群

《機器學習實戰:Logistic迴歸(1)基本概念和簡單例項

最近感覺時間越來越寶貴,越來越不夠用。不過還是抽空看了點書,然後整理到部落格來。 加快點節奏,廢話少說。 Keep calm & carry on. ----------------------------------------------------------

搭建Docker Swarm叢集實戰(一)(服務發現使用consul)

注意: docker在版本1.12之後,已經將swarm的部分整合在docker裡面了,所以也就不需要依賴第三方的東西了。 所以如果不是為了有趣瞭解一下的話,請直接轉到本系列的第三篇開始=》搭建Docker Swarm叢集實戰(三)(swarm

Gradle 1.12使用者指南翻譯——四十. 應用程式外掛

本文由CSDN部落格貌似掉線翻譯,其他章節的翻譯請參見:http://blog.csdn.net/column/details/gradle-translation.html翻譯專案請關注Github上的地址:https://github.com/msdx/gradledoc

搭建Docker Swarm叢集實戰(三)(swarm mode)

前言 docker在1.12版本之後,把swarm的功能內建到docker engine本身,因此之前使用consul等第三方服務發現和鍵值服務的方法就可以作古了。 這篇就是用docker自帶的swarm mode來進行swarm的叢集搭建。 這篇實操的主

《Java並發編程實戰 同步容器類 讀書筆記

blank sortedset 方法 width lists 讀書 run 生產者消費者模式 ear 一、同步容器類 1. 同步容器類的問題 線程容器類都是線程安全的。可是當在其上進行符合操作則須要而外加鎖保護其安全性。 常見符合操作包括: . 叠代 . 跳轉(

:面向對象1

沒有 值傳遞 默認 封裝性 軟件開發 大型項目 語句 開發思想 實現 面向對象和面向過程的區別 兩者都是軟件開發思想,先有面向過程,後有面向對象。在大型項目中,針對面向過程的不足推出了面向對象開發思想。區別1. 編程思路不同: 面向過程以實現功能的函數開發為主,而面向對象要

提供跟老男孩學Linux運維Shell編程實戰四、源代碼

linux shell 第四章是講Shell變量知識進階與實踐;第五章是講變量的數值計算實踐;附件中包括源碼,請下載。該兩章在學習時要註意相關事項:1.註意標點符號的使用:例如,單引號,反引號,雙引號等;2.註意該要留空格的留空格;3.註意特殊變量的作用;4.內置變量的使用;5.算術運算任的使用。本文

Linux實戰篇:RHEL7.3下Nginx虛擬主機配置實戰(基於別名)

虛擬主機 nginx個人筆記分享(在線閱讀):http://note.youdao.com/noteshare?id=05daf711c28922e50792c4b09cf63c58PDF版本下載http://down.51cto.com/data/2323313本文出自 “人才雞雞” 博客,請務必保留此出處

spring實戰四版pom.xml

第四版 context -c sco cas val mysql packaging core <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/X

XSSworm剖析 5.1 web2.0應用安全

客戶端 request 結果 不但 暴露 疑問 t對象 網站 開發者 1、改變世界的web2.0 理解起來其實很簡單。web1.0,註重信息從大網站流向個人; web2.0,註重信息從個人流向個人 2、web2.0的安全性 帶來的威脅: ①web1.0只是鼓勵用戶取閱讀

作業1

text uil school log .com back erl jackson ges <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>

2017.12.8 軟件工程----- 總體設計(復習)

中一 計劃 整體 推薦 滿足 集中 用戶 重要 文檔 軟件工程-----第五章 總體設計(復習) (1)概要 經過需求分析階段的工作,系統必須“做什麽”已經很清楚了,現在是決定“怎樣做”的時候了。總體設計的基本目的是系統應該如何實現。他最重要的一項工作是設計軟件結構。因此,

2017-2018-1 20179215 《從問題到程序》

efi mrr 堅持 stdlib.h clu 無符號 全局 文字信息 選擇 《從問題到程序》第五章讀書筆記 ?這章主要從五個方面介紹,分別為數值類型、函數和標準庫函數、函數定義和程序的函數分解、c程序的結構與變量及預處理。主要是對函數整體的理解以及常用的規範進行說明。