1. 程式人生 > >Docker分散式volume成功實踐經驗分享

Docker分散式volume成功實踐經驗分享

 日常部署專案中,不同的的應用運行於不同虛擬機器的不同docker 容器之中, 

不少是有狀態的容器,需要把資料卷 獨自掛出來。  比如下面postgresql 資料庫的程式碼:

#more start-docker.sh

#!/usr/bin/env bash

file_path=$(cd "$(dirname "$0")"; pwd)
cd ${file_path}
docker stop postgresql
docker rm postgresql
firewall-cmd --add-port=5432/tcp --permanent --zone=public
firewall-cmd --reload

DATA_PATH=${file_path}/postgres-data

if [ ! -d "$DATA_PATH" ]; then
    echo "Create dir ${DATA_PATH} "
    mkdir "$DATA_PATH"
fi

DATA_BACKUP_PATH=${file_path}/postgres-backup

if [ ! -d "$DATA_BACKUP_PATH" ]; then
    echo "Create dir ${DATA_BACKUP_PATH} "
    mkdir "$DATA_BACKUP_PATH"
fi
 

docker run --name postgresql \

           --restart always \

           -v ${DATA_PATH}:/var/lib/postgresql/data \

           -v ${DATA_BACKUP_PATH}:/postgres-backup \

           -p 5432:5432 \

           -e POSTGRES_USER=centos \

           -e POSTGRES_PASSWORD=your_password \

        -d postgres:9.6.2 \

        postgres -c max_connections=500

以上程式碼可以正常執行,一般情況下都正常。但是部署在mesos + marathon 或者kubernet 分散式docker 容器平臺時,就發現了一個問題: 容器故障掛掉是很正常的事情,虛擬機器故障也是大概率事件,如果確保資料和容器徹底獨立呢? 故障能及時恢復呢?

   之前成功嘗試過moosefs 分散式檔案系統+ 自己編譯的通用java docker 容器可以解決這個問題。但是大部分容器映象都是來自github,但是僅僅是為了 讓容器變成無狀態的,我們沒有必要每次都非得重新編譯一個屬於自己的映象,這代價也太大了。應該有更好的更簡單的方式。

後來谷歌再次搜尋了相關問題,看到vmware官方的資料,發現了,有更好的解決辦法.

環境描述: Vmware Vsphere  Esxi6.0 + Centos7.3 

適用於Docker的vSphere Storage
vSphere Storage for Docker使客戶能夠滿足vSphere環境中Docker容器的持久儲存要求。 此服務與Docker Volume Plugin框架整合。 Docker使用者現在可以使用Docker將vSphere Storage(vSAN,VMFS,NFS,VVol)用於有狀態容器。

vSphere Storage for Docker經Docker認證,可與Docker Enterprise Edition配合使用,並可在Docker商店中使用。

vSphere Storage for Docker使您能夠在VMware vSphere之上執行有狀態的容器化應用程式。

它旨在滿足企業IT和應用程式開發人員的需求,並提供以下好處:

提供經過驗證的持久共享儲存:您現在可以使用由vSAN,VMFS,NFS,VVol等支援的任何VMware支援的企業級儲存。
啟用多租戶,安全性和訪問控制:vSphere Admins可以從一個位置輕鬆地跨主機,資料儲存和VM共享儲存的訪問許可權
操作一致性和簡單性:零配置,零憑證管理。 它易於部署和管理
自助服務操作:使用docker API管理卷生命週期,同時保持管理員對消耗的控制
此服務與Docker Volume Plugin框架整合。 它不需要憑據管理或配置管理。

安裝
在ESXi上安裝
基於VUM的VIB安裝
通過esxcli / localcli安裝VIB
在Linux Docker主機上安裝
依賴
安裝說明
在Windows Docker主機上安裝
升級說明
降級到以前的版本
安裝包括兩部分 - 在ESXi上安裝vSphere安裝捆綁包(VIB)以及在計劃執行具有儲存需求的容器的主機上安裝Docker外掛。

在ESXi上安裝
VIB和Offline Depot是為在ESX上安裝服務的後端而構建的軟體包。可以使用esxcli或vmware工具(如VUM)安裝後端

基於VUM的VIB安裝
VDVS的ESXi元件以離線庫的形式提供,可以將最新版本下載為ZIP存檔。

將VIB捆綁包下載為zip格式後,使用以下步驟使用VUM執行安裝。

轉到更新管理器選項卡中的管理檢視。
使用import zip選項匯入zip包。
建立基線幷包含zip包。
掃描您的主機與基線。
修復主機。
有關更多資訊,請參見VUM使用者指南。

環境準備: 3 臺虛擬機器

序號

虛擬機器名稱

ip

說明:虛擬機器需要安裝vsphere 外掛

1 t1 10.20.1.31 docker plugin install --grant-all-permissions --alias vsphere vmware / vsphere-storage-for-docker:latest
2 t2 10.20.1.32 docker plugin install --grant-all-permissions --alias vsphere vmware / vsphere-storage-for-docker:latest
3 t3 10.20.1.33 docker plugin install --grant-all-permissions --alias vsphere vmware / vsphere-storage-for-docker:latest

一. 通過esxcli / localcli安裝VIB
VDVS的ESXi元件以VIB的形式提供。 VIB代表vSphere安裝捆綁包。在概念層面,VIB類似於tarball或ZIP存檔,因為它是打包到單個存檔中以便於分發的檔案集合。

登入ESXi主機並在ESXi上下載最新版本的VDVS驅動程式VIB。假設您已在/ tmp位置下載了VIB,則可以執行以下命令將其安裝在ESXi上。您將需要ESXi 6.0或更高版本

#esxcli software vib install -v /tmp/vmware-esx-vmdkops-0.12.ccfc38f.vib

最新下載地址:

安裝結果
   訊息:操作成功完成。
   需要重新啟動:false
   已安裝VIB:VMWare_bootbank_esx-vmdkops-service_0.12.ccfc38f-0.0.1
   VIB已刪除:
   VIB跳過:
注意:要在ESX主機上使用admin命令集,請在安裝vib後重新啟動hostd。 /etc/init.d/hostd restart

在Linux Docker主機上安裝
VDVS外掛可以像任何docker外掛安裝一樣安裝在Linux Docker主機上。您將需要VM上的docker版本17.06.1或更高版本。在大型節點池中,您可以通過配置管理工具(如Ansible / Salt)或使用遠端shell會話將外掛安裝推送到多個VM。外掛的安裝非常簡單,我們將逐步完成安裝/解除安裝,啟用和驗證外掛安裝的步驟。

依賴
該外掛使用VMCI(虛擬機器通訊介面)和vSockets聯絡ESX上的服務。相關的Linux核心驅動程式通過VMware Tools及其開放版本(即open-vm-tools,packages)安裝。必須在guest虛擬機器作業系統中安裝其中一個軟體包。建議安裝這些軟體包中最新版本的軟體。

安裝說明
該外掛在公共docker登錄檔中以docker映象的形式提供,但如果您使用的是私有登錄檔,則必須指向該影象的相應URL。

注意:我們已經停止了基於DEB / RPM的Docker外掛安裝。
要安裝外掛

二. 在虛擬機器裡安裝vsphere 外掛 (請確保你的虛擬機器域名能解析,能上網際網路)
〜#docker plugin install --grant-all-permissions --alias vsphere vmware / vsphere-storage-for-docker:latest
最新:從vmware / vsphere-storage-docker中拉出來
f07d34084e57:下載完成
摘要:sha256:e1028b8570f37f374e8987d1a5b418e3c591e2cad155cc3b750e5e5ac643fb31
狀態:已下載vmware / vsphere-storage-for-docker的最新映像:latest
已安裝的外掛vmware / vsphere-storage-for-docker:最新版本
驗證它是否已安裝並列出
〜#docker plugin ls
ID名稱描述已啟用
831fd45343af vsphere:最新的VMWare vSphere Docker Volume外掛為true
如果需要,您可以啟用或禁用外掛
〜#docker plugin禁用vsphere
的vSphere
〜#docker plugin ls
ID名稱描述已啟用
831fd45343af vsphere:最新的VMWare vSphere Docker Volume外掛為false

〜#docker plugin啟用vsphere
 的vSphere
〜#docker plugin ls
ID名稱描述已啟用
831fd45343af vsphere:最新的VMWare vSphere Docker Volume外掛為true
最後從給定的Docker主機中刪除外掛:
〜#docker plugin rm vsphere
的vSphere
〜#docker plugin ls
ID名稱描述已啟用
在Windows Docker主機上安裝
可以使用PowerShell安裝程式在Windows Server 2016 / Windows 10 VM上安裝vSphere Storage for Docker。您將需要VM上的Windows版本17.06或更高版本(啟用Windows容器模式)的Docker EE / Docker。

首先,使用“以管理員身份執行”選項啟動PowerShell例項。

下載外掛安裝程式
PS C:\

三. 建立遠端永續性資料卷:vsphereVolume10gb

docker volume create --driver=vsphere --name=vsphereVolume10gb -o size=10gb

docker volume inspect vsphereVolume10gb

 docker inspect [email protected]_m4_sas_datastore
[
    {
        "Driver": "vsphere:latest",
        "Labels": null,
        "Mountpoint": "/mnt/vmdk/[email protected]_m4_sas_datastore/",
        "Name": "[email protected]_m4_sas_datastore",
        "Options": {},
        "Scope": "global",
        "Status": {
            "access": "read-write",
            "attach-as": "independent_persistent",
            "capacity": {
                "allocated": "289MB",
                "size": "10GB"
            },
            "clone-from": "None",
            "created": "Wed Sep 12 02:03:22 2018",
            "created by VM": "t1",
            "datastore": "cw_m4_sas_datastore",
            "diskformat": "thin",
            "fstype": "ext4",
            "status": "detached"
        }
    }
]

 在esxi 主機上: 可以檢視

[[email protected]:~] /usr/lib/vmware/vmdkops/bin/vmdkops_admin.py volume ls

Volume             Datastore           VMGroup   Capacity  Used   Filesystem  Policy  Disk Format  Attached-to  Access      Attach-as          Created By  Created Date       

-----------------  ------------------  --------  --------  -----  ----------  ------  -----------  -----------  ----------  -----------------  ----------  -----------------  

vsphereVolume10gb  cw_m4_sas_datast..  _DEFAULT  10GB      216MB  ext4        N/A     thin         detached     read-write  independent_per..  t1          Wed Sep 12 02:0..  

[[email protected] server]# more start-postgres-docker.sh
#!/usr/bin/env bash

file_path=$(cd "$(dirname "$0")"; pwd)
cd ${file_path}
docker stop postgresql
docker rm postgresql
firewall-cmd --add-port=5432/tcp --permanent --zone=public
firewall-cmd --reload

DATA_PATH=${file_path}/postgres-data

if [ ! -d "$DATA_PATH" ]; then
echo "Create dir ${DATA_PATH} "
mkdir "$DATA_PATH"
fi

DATA_BACKUP_PATH=${file_path}/postgres-backup

if [ ! -d "$DATA_BACKUP_PATH" ]; then
echo "Create dir ${DATA_BACKUP_PATH} "
mkdir "$DATA_BACKUP_PATH"
fi

docker run --name postgresql \
--restart always \
-v [email protected]cw_m4_sas_datastore:/var/lib/postgresql/data \
-v [email protected]cw_m4_sas_datastore:/postgres-backup \
-p 5432:5432 \
-e PGDATA=/var/lib/postgresql/data/db-files/ \
-e POSTGRES_USER=centos \
-e POSTGRES_PASSWORD=your_password \
-d docker.ascs.tech/public/postgres:9.6.2 \
postgres -c max_connections=500

[[email protected] server]

驗證過程:

在t2上啟動 /var/server/start-postgres-docker.sh

開啟DBschema 獲取其他可以連線資料庫的工具  或手動 在命令打入,隨便建立一個表格:

插入少量資料。

提交成功後,查詢一下,確認插入成功後,退出。

然後容器.

在t2上執行

docker stop postgresql;docker rm postgresql

在t3上執行:

 /var/server/start-postgres-docker.sh

可以看到,資料確實還在.

到此為止, docker 容器使用vsphere volume 成功!