jq特效網(wǎng)站模板全網(wǎng)最好的推廣平臺
#作者:西門吹雪
文章目錄
- micro-Services-Tutorial
- Ceph分布式文件共享方案
- 部署Ceph集群
- 使用Ceph
- Ceph在kubernetes集群中的使用
micro-Services-Tutorial
微服務(wù)最早由Martin Fowler與James Lewis于2014年共同提出,微服務(wù)架構(gòu)風(fēng)格是一種使用一套小服務(wù)來開發(fā)單個應(yīng)用的方式途徑,每個服務(wù)運(yùn)行在自己的進(jìn)程中,并使用輕量級機(jī)制通信,通常是HTTP API,這些服務(wù)基于業(yè)務(wù)能力構(gòu)建,并能夠通過自動化部署機(jī)制來獨(dú)立部署,這些服務(wù)使用不同的編程語言實(shí)現(xiàn),以及不同數(shù)據(jù)存儲技術(shù),并保持最低限度的集中式管理。然而微服務(wù)又需要限流器(Rate Limiter),數(shù)據(jù)傳輸(Trasport 序列化和反序列化),日志(Logging),指標(biāo)(Metrics)
,斷路器(Circuit breaker),請求追蹤(Request tracing ),服務(wù)發(fā)現(xiàn)(Service Discovery),因此就想寫一篇關(guān)于微服務(wù)和微服務(wù)組件的總結(jié)來記錄下自己使用優(yōu)化的過程.
Ceph分布式文件共享方案
在使用Kubeneters的時候在各個容器中都需要使用同一套文件,但是如果使用NAS盤的方式話,無論是在更新或者是讀取時候都要幾分鐘時間去部署,而且有時候還會出現(xiàn)文件占用失敗的問題,調(diào)研了一段時間之后發(fā)現(xiàn)Kuberneters結(jié)合比較好的文件系統(tǒng)用Ceph分布式文件共享方案去解決這樣的問題.
- 環(huán)境準(zhǔn)備
在安裝分布式之前需要先進(jìn)行環(huán)境準(zhǔn)備,需要3臺服務(wù)器來做集群,ceph默認(rèn)會進(jìn)行保存三份文件來保障數(shù)據(jù)安全,服務(wù)器系統(tǒng)是centos7.3:
主機(jī)名 | IP | 部署服務(wù) |
---|---|---|
host1 | 120.92.172.35 | 主機(jī)1 |
host2 | 120.92.169.191 | 主機(jī)2 |
host3 | 120.92.165.229 | 主機(jī)3 |
首先安裝docker環(huán)境,這個可以根據(jù)電腦系統(tǒng)的不同,選擇不同的安裝方式。
- Mac安裝
- Ubantu安裝
- Windows安裝
- centos安裝
我這里是用腳本直接在centos上直接安裝的:
yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo;yum-config-manager --enable docker-ce-edge;yum-config-manager --disable docker-ce-edge;yum install docker-ce;systemctl start docker.service;
systemctl enable docker.service;
安裝成功之后可以查看下:
> docker --verison
Docker version 18.06.0-ce, build 0ffa825
注意:這里需要配置好國內(nèi)docker源,這樣可以提高速度
> mkdir -p /etc/docker
> tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF> systemctl daemon-reload
> systemctl restart docker
> systemctl enable docker
部署Ceph集群
在主機(jī)1上部署運(yùn)行mon,用以讓客戶端連接 Ceph 監(jiān)視器:
node1> docker run -d \--name=mon \--net=host \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph/ \-e MON_IP=120.92.172.35 \-e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \ceph/daemon mon
查看docker和ceph運(yùn)行狀態(tài):
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b0c9d7680461 ceph/daemon "/entrypoint.sh mon" About a minute ago Up About a > docker exec mon ceph -s
cluster:id: da8f7f5b-b767-4420-a510-287f4ced25dehealth: HEALTH_OKservices:mon: 1 daemons, quorum ceph-1mgr: no daemons activeosd: 0 osds: 0 up, 0 indata:pools: 0 pools, 0 pgsobjects: 0 objects, 0 Busage: 0 B used, 0 B / 0 B availpgs:
由于我們沒有映射端口,但是Ceph容器會把后續(xù)需要使用到的端口映射出來:
node1> yum install tcping
node1> tcping 120.92.172.35 6789
120.92.172.35 port 6789 open
通常Ceph有兩種方式實(shí)現(xiàn)在各個節(jié)點(diǎn)之間共享配置,第一種是以文件的方式實(shí)現(xiàn)共享,需要把第一個啟動起來的節(jié)點(diǎn)的文件CP到其他節(jié)點(diǎn),另外一種是使用配置服務(wù)(比如etcd或者consul). 這里我使用的第一種共享配置,將主機(jī)1上的配置文件復(fù)制到主機(jī)2和主機(jī)3,復(fù)制的路徑包含/etc/ceph和/var/lib/ceph/bootstrap-*下的所有內(nèi)容。
node2 > mkdir -p /var/lib/ceph
node1> scp -r /etc/ceph root@120.92.169.191:/etc
node1> scp -r /var/lib/ceph/bootstrap* root@120.92.169.191:/var/lib/cephnode3 > mkdir -p /var/lib/ceph
node1 > scp -r /etc/ceph root@192.168.3.103:/etc
node1 > scp -r /var/lib/ceph/bootstrap* root@120.92.165.229:/var/lib/ceph
啟動主機(jī)2和主機(jī)3上的mon,在主機(jī)2上執(zhí)行以下命令啟動 mon,修改 MON_IP:
> docker run -d \--net=host \--name=mon \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph/ \-e MON_IP=120.92.169.191 \-e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \ceph/daemon mon
在主機(jī)3上執(zhí)行以下命令啟動 mon,修改 MON_IP:
> docker run -d \--net=host \--name=mon \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph/ \-e MON_IP=120.92.165.229 \-e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \ceph/daemon mon
在節(jié)點(diǎn)上在查看ceph集群狀態(tài)可以看到有三個mos上線了:
> docker exec mon ceph -scluster:id: da8f7f5b-b767-4420-a510-287f4ced25dehealth: HEALTH_OKservices:mon: 3 daemons, quorum ceph-1,ceph-2,ceph-3mgr: no daemons activeosd: 0 osds: 0 up, 0 indata:pools: 0 pools, 0 pgsobjects: 0 objects, 0 Busage: 0 B used, 0 B / 0 B availpgs:
然后需要運(yùn)行osd服務(wù)把磁盤給ceph作為文件共享系統(tǒng)的基礎(chǔ)存儲,因此我們需要為三臺服務(wù)器掛載對應(yīng)的磁盤(這里選擇掛載100GB的SSD云磁盤).
> fdisk -l
Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0008d73aDevice Boot Start End Blocks Id System
/dev/vda1 * 2048 83884031 41940992 53 LinuxDisk /dev/vdb: 107.5 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
這時候在三臺服務(wù)器上分別運(yùn)行(如果需要掛載多塊可以運(yùn)行多個osd):
> docker run -d \--net=host \--name=osd \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph/ \-v /dev/:/dev/ \--privileged=true \-e OSD_FORCE_ZAP=1 \-e OSD_DEVICE=/dev/vdb \ceph/daemon osd_ceph_disk
此時我們查看發(fā)現(xiàn)osd3個節(jié)點(diǎn)就可以看到已經(jīng)上線了:
> docker exec mon ceph -scluster:id: da8f7f5b-b767-4420-a510-287f4ced25dehealth: HEALTH_WARNno active mgrservices:mon: 3 daemons, quorum ceph-1,ceph-2,ceph-3mgr: no daemons activeosd: 3 osds: 3 up, 3 indata:pools: 0 pools, 0 pgsobjects: 0 objects, 0 Busage: 0 B used, 0 B / 0 B availpgs:
但是這個時候我們還看不到存儲空間,這是因?yàn)閙gr沒有啟動,我們把mds和rgw也一起跑起來在node1節(jié)點(diǎn)上:
> docker run -d \--net=host \--name=mgr \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph/ \ceph/daemon mgr> docker run -d \--net=host \--name=mds \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph/ \-e CEPHFS_CREATE=1 \ceph/daemon mds
> docker run -d \--name=rgw \-p 80:80 \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph/ \ceph/daemon rgw
這個時候就可以看到初始化完成了:
> docker exec mon ceph -scluster:id: da8f7f5b-b767-4420-a510-287f4ced25dehealth: HEALTH_OKservices:mon: 3 daemons, quorum ceph-1,ceph-2,ceph-3mgr: ceph-1(active)mds: cephfs-1/1/1 up {0=ceph-1=up:active}osd: 3 osds: 3 up, 3 inrgw: 1 daemon activedata:pools: 6 pools, 48 pgsobjects: 209 objects, 3.4 KiBusage: 6.0 GiB used, 292 GiB / 298 GiB availpgs: 48 active+clean
使用Ceph
我們可以使用ceph掛載磁盤進(jìn)行使用,但是ceph有很強(qiáng)的用戶校驗(yàn)機(jī)制所以這里需要先拿到訪問key ,而且在使用過程中可以指定多個節(jié)點(diǎn)形成負(fù)載均衡,然后用內(nèi)核驅(qū)動掛載 Ceph 文件系統(tǒng) — Ceph Documentation.
> mkdir /mnt/cephfile
> cat /etc/ceph/ceph.client.admin.keyring
[client.admin]key = AQBXv0VbKtikExAAwHHp+F2HJSnYIIqaozjt3g==auid = 0caps mds = "allow"caps mgr = "allow *"caps mon = "allow *"caps osd = "allow *"mount -t ceph 120.92.172.35,120.92.169.191,120.92.165.229:/ /mnt/cephfile -o name=admin,secret=AQBhlz1bZBHcLxAAt6eIyBxnAxFoyA7PDTqAkQ==
umount /mnt/cephfile> lsof /mnt/cephfile
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 10356 root cwd DIR 0,0 2 1099511627781 /mnt/cephfile/data/dev/code
這是最簡單的使用,還有關(guān)于rdb對象存儲以及Ceph還有快照等功能,可以在搭建好整個集群之后進(jìn)行測試文件速度(這里主要測試的是5000多個小文件拷貝速度)如下:
# NAS盤
> time cp -rf php/ general/test
real 2m 7.05s
user 0m 0.13s
sys 0m 1.80s# CEPH
> time cp -rf php/ generalceph/test
real 0m 6.88s
user 0m 0.05s
sys 0m 0.39s# 本地磁盤
> time cp -rf php/ php2
real 0m 1.16s
user 0m 0.02s
sys 0m 0.21s
通過對比可以看到CEPH的速度對于NAS盤提升有很多,面對本地磁盤差距也不是很大.
Ceph在kubernetes集群中的使用
在kubernetes集群中可以使用ceph作為高速共享盤,這樣可以提高我們的自動化部署更新代碼的速度,同時節(jié)省更新的時間.
由于kubernetes支持cephFS文件掛載,所以我們只需要用yaml編排文件處理就好,由于使用ceph需要密碼所以我們先創(chuàng)建一個secret類型的yaml:
apiVersion: v1
kind: Secret
metadata:name: ceph-secretnamespace: dev
data:key: QVFCMTZWMVZvRjVtRXhBQTVrQ1FzN2JCajhWVUxSdzI2Qzg0SEE9PQ==
然后創(chuàng)建我們需要的volume掛載卷就可以在Pod中正常使用了.
apiVersion: v1
kind: PersistentVolume
metadata:name: cephfs-pv
spec:capacity:storage: 200GiaccessModes:- ReadWriteManycephfs:monitors:- 120.92.172.35:6789- 120.92.169.191:6789- 120.92.165.229:6789user: adminsecretRef:name: ceph-secretreadOnly: falsestorageClassName: cephpersistentVolumeReclaimPolicy: Recycle
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: cephfs-pv-claim
spec:accessModes:- ReadWriteManyresources:requests:storage: 100GistorageClassName: ceph