您好,登錄后才能下訂單哦!
在上一篇博文,我們通過kubernetes的devlopment和service完成了sonarqube的部署??雌饋硪呀?jīng)可用,但是仍然有一個(gè)很大的問題。我們知道,像mysql這種數(shù)據(jù)庫是需要保存數(shù)據(jù)而且不能讓數(shù)據(jù)丟失的。而容器恰恰是一旦退出,所有數(shù)據(jù)都會(huì)丟失。我們的mysql-sonar容器一旦重啟,那么我們后續(xù)對(duì)sonarqube做的任何設(shè)置都會(huì)丟失。所以我們必須找到一種方法能讓mysql-sonar容器中的mysql數(shù)據(jù)保存下來。kubernetes提供多種持久化數(shù)據(jù)的方案,包括使用hostPath,nfs,flocker,glusterfs,rbd等等。我們就使用ceph提供的rbd塊存儲(chǔ)來實(shí)現(xiàn)kubernetes的持久化存儲(chǔ)。
要使用ceph作為存儲(chǔ),首先得安裝ceph,我這里簡單羅列下通過ceph-deploy安裝ceph的過程,先說下運(yùn)行環(huán)境:
server-117: admin-node mon-node client-node server-236: osd-node mon-node server-227: osd-node mon-node
在所有機(jī)器上配置yum源:
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repowget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repovim /etc/yum.repos.d/ceph.repo [ceph] name=ceph baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/gpgcheck=0[ceph-noarch] name=cephnoarch baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/gpgcheck=0
然后在所有機(jī)器上配置ntp時(shí)間同步,具體操作不做說明。
配置admin-node到其他各節(jié)點(diǎn)的ssh免密訪問。我這里圖省事,直接使用root來完成后續(xù)操作,但在官方的標(biāo)準(zhǔn)安裝中,要求使用普通帳號(hào)來完成,且這個(gè)帳號(hào)不能命名為ceph,因?yàn)閏eph是默認(rèn)啟動(dòng)ceph守護(hù)進(jìn)程的帳戶。給出一個(gè)示例:
useradd cephadminecho "cephadmin" | passwd --stdin cephadmin 要求所有的cephadmin有免密sudo的權(quán)限:echo "cephd ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephdsudo chmod 0440 /etc/sudoers.d/cephd vim /etc/sudoers Defaults:cephadmin !requiretty 然后使用這個(gè)帳戶完成相互之間的ssh免密訪問 最后在admin-node上編輯~/.ssh/config,內(nèi)容示例如下: Host server-117 Hostname server-117 User cephadmin Host server-236 Hostname server-236 User cephadmin Host server-227 Hostname server-227 User cephadmin
部署ceph,下面所有的操作都在admin-node上完成:
安裝ceph-deployyum install -y ceph-deploymkdir ceph-cluster #創(chuàng)建部署目錄,會(huì)在該目錄生成一些必要的配置文件 cd ceph-cluster 如果之前安裝過ceph,官方推薦使用如下命令獲得一個(gè)干凈的環(huán)境: ceph-deploy purgedata server-236 server-227ceph-deploy forgetkeys ceph-deploy purge server-236 server-227創(chuàng)建一個(gè)ceph cluster: ceph-deploy new server-117 server-236 server-227 #其中server-117為mon-node,可以指定多個(gè)mon-node 上面命令執(zhí)行完成以后,會(huì)在當(dāng)前目錄合成一些輔助文件,其中ceph.conf默認(rèn)內(nèi)容如下: [global] fsid = 23078e5b-3f38-4276-b2ef-7514a7fc09ff mon_initial_members = server-117mon_host = 10.5.10.117auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx 我額外添加如下幾行內(nèi)容: public_network=10.5.10.0/24 #定義互相通信的公有網(wǎng)絡(luò) mon_clock_drift_allowed = 2 #定義多個(gè)mon節(jié)點(diǎn)之間時(shí)間的誤差為2s osd_pool_default_size = 2 #定義最少可以允許有兩個(gè)osd,默認(rèn)是3個(gè),如果節(jié)點(diǎn)數(shù)量足夠,可不用修改 #以下三行配置都是為解決數(shù)據(jù)節(jié)點(diǎn)的存儲(chǔ)盤為ext4文件系統(tǒng)時(shí),解決“ERROR: osd init failed: (36) File name too long”錯(cuò)誤的。ceph官方推薦存儲(chǔ)盤使用xfs文件系統(tǒng),但在有些特定的場合下,我們只能使用ext4文件系統(tǒng)。 osd_max_object_name_len = 256osd_max_object_namespace_len = 64filestore_xattr_use_omap = true
執(zhí)行安裝ceph:
ceph-depoly server- server- server- -y ceph ceph-radosgw
初始化mon-node:
ceph-deploy mon create-
這一過程執(zhí)行完成以后,會(huì)在當(dāng)前目錄出現(xiàn)若干*.keyring文件,這是ceph組件間進(jìn)行安全訪問時(shí)所需要的
這時(shí)可以在各節(jié)點(diǎn)通過ps -ef | grep ceph來查看ceph-mon相關(guān)進(jìn)程的運(yùn)行狀況:
ceph 31180 1 0 16:11 ? 00:00:04 /usr/bin/ceph-mon -f --cluster ceph --id server-117 --setuser ceph --setgroup ceph
初始化osd-node:
啟動(dòng)Osd-node可以分為兩步:prepare和activate。osd-node是真正存儲(chǔ)數(shù)據(jù)的節(jié)點(diǎn),我們需要為ceph-osd提供獨(dú)立存儲(chǔ)空間,一般是一個(gè)獨(dú)立的disk,但也可以使用目錄取代。
在兩個(gè)osd-node節(jié)點(diǎn)上分別創(chuàng)建用于存儲(chǔ)的目錄:
ssh server-236mkdir /data/osd0 exitssh server-227mkdir /data/osd1 exit
執(zhí)行如下操作:
#prepare操作會(huì)在上面創(chuàng)建的兩個(gè)目錄里創(chuàng)建一些后續(xù)activate激活以及osd運(yùn)行時(shí)所需要的文件 ceph-deploy osd prepare server-236:/data/osd0 server-227:/data/osd1 #激活osd-node并啟動(dòng) ceph-deploy osd prepare server-236:/data/osd0 server-227:/data/osd1
執(zhí)行完以后,通常會(huì)拋出類似如下錯(cuò)誤:
[WARNIN] 2016-11-04 14:25:40.325075 7fd1aa73f800 -1 ** ERROR: error creating empty object store in /var/local/osd0: (13) Permission denied [ERROR ] RuntimeError: command returned non-zero exit status: 1[ceph_deploy][ERROR ] RuntimeError: Failed to execute command: /usr/sbin/ceph-disk -v activate --mark-init upstart --mount /data/osd0
這是因?yàn)閏eph默認(rèn)的守護(hù)進(jìn)程的用戶是ceph,無論是使用普通的ceph-admin創(chuàng)建的目錄還是使用root創(chuàng)建的目錄,ceph都沒有訪問權(quán)限。
所以需要在osd-node上再做一個(gè)授權(quán):
ceph.ceph -R /data/osd0 server-227: chown ceph.ceph -R /data/osd1
往各節(jié)點(diǎn)同步配置文件:
ceph-deploy admin server-117 server-236 server-227
注意,如果配置文件有修改,需要重新執(zhí)行同步操作,并重新執(zhí)行activate操作
通過如下指令查看集群狀態(tài):
ceph -s ceph osd tree
當(dāng)ceph集群安裝完成以后,我們就要?jiǎng)?chuàng)建相應(yīng)的rbd塊用于kubernetes存儲(chǔ)。創(chuàng)建塊設(shè)備之前,需要先創(chuàng)建存儲(chǔ)池,ceph提供了一個(gè)叫做rbd的默認(rèn)存儲(chǔ)池。我們再創(chuàng)建一個(gè)kube的存儲(chǔ)專門用來存儲(chǔ)kubernetes使用的塊設(shè)備,后續(xù)的操作都在client-node上執(zhí)行:
ceph osd pool create kube 100 100 #后面兩個(gè)100分別為pg-num和pgp-num
在kube存儲(chǔ)池創(chuàng)建一個(gè)映像文件,就叫mysql-sonar,該映像文件的大小為5GB:
rbd create kube/mysql-sonar --size 5120 --p_w_picpath-format 2 --p_w_picpath-feature layering
注意,上面的命令,在我的環(huán)境下,如果不使用--p_w_picpath-feature layering,會(huì)拋出如下異常:
rbd: sysfs write failed RBD p_w_picpath feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable". In some cases useful info is found in syslog - try "dmesg | tail" or so. rbd: map failed: (6) No such device or address
這是因?yàn)槲夷壳癱entos 7.2的內(nèi)核還不支持ceph的一些新特性。
將上面創(chuàng)建的映象文件映射為塊設(shè)備:
rbd map kube/mysql-sonar --name client.admin
至此,ceph上的操作就完成了。
接下來我們看下如何在kubernetes上使用上面ceph創(chuàng)建的塊設(shè)備。
我們可以在kubernetes的源碼文件的examples/volumes/rbd目錄下找到相關(guān)示例文件如下:
[root@server-116 ~]# ll /data/software/kubernetes/examples/volumes/rbd/
total 12
-rw-r-----. 1 root root 962 Mar 8 08:26 rbd.json
-rw-r-----. 1 root root 985 Mar 8 08:26 rbd-with-secret.json
-rw-r-----. 1 root root 2628 Mar 8 08:26 README.md
drwxr-x---. 2 root root 29 Mar 8 08:26 secret
[root@server-116 ~]# ll /data/software/kubernetes/examples/volumes/rbd/secret/
total 4
-rw-r-----. 1 root root 156 Mar 8 08:26 ceph-secret.yaml
其中rbd.json就是一個(gè)將rbd設(shè)備掛載為一個(gè)kubernetes volumes的示例文件。rbd-with-secret.json是使用secret的方式掛載ceph rbd的示例文件。ceph-secret.yaml是一個(gè)secret的示例文件。
我們可以先查看下ceph-secret.yaml文件:
apiVersion: v1 kind: Secret metadata: name: ceph-secret type: "kubernetes.io/rbd" data: key: QVFCMTZWMVZvRjVtRXhBQTVrQ1FzN2JCajhWVUxSdzI2Qzg0SEE9PQ==
我們只需要修改最后一行的key值。這個(gè)值通過base64進(jìn)行過加密處理。處理前的值可以通過如下命令在ceph上獲得:
ceph auth get-- ~]# /etc/ceph/= AQDRvL9YvY7vIxAA7RkO5S8OWH6Aidnu22OiFw=== = =
我們拿到這個(gè)key,然后做base64處理:
[root@server-117 ~]# echo "AQDRvL9YvY7vIxAA7RkO5S8OWH6Aidnu22OiFw==" | base64 QVFEUnZMOVl2WTd2SXhBQTdSa081UzhPV0g2QWlkbnUyMk9pRnc9PQo=
所以我們修改后的ceph-secret.yaml內(nèi)容如下:
apiVersion: v1 kind: Secret metadata: name: ceph-secret type: "kubernetes.io/rbd" data: key: QVFEUnZMOVl2WTd2SXhBQTdSa081UzhPV0g2QWlkbnUyMk9pRnc9PQo=
創(chuàng)建一個(gè)secret:
kubectl create -f ceph-secret
由于直接使用volumes方式掛載的數(shù)據(jù)文件生命周期與pod一樣,隨著pod的釋放而釋放。所以在這里不推薦直接使用volumes的方式掛載,而使用pv的方式掛載。
我們先創(chuàng)建一個(gè)pv文件:
apiVersion: v1 kind: PersistentVolume metadata: name: mysql-sonar-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce rbd: monitors: - 10.5.10.117:6789 - 10.5.10.236:6789 - 10.5.10.227:6789 pool: kube p_w_picpath: mysql-sonar user: admin secretRef: name: ceph-secret fsType: ext4 readOnly: false persistentVolumeReclaimPolicy: Recycle
創(chuàng)建一個(gè)5GB大小的pv:
kubectl create -f mysql-sonar-pv.yml
再創(chuàng)建一個(gè)pvc文件:
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: mysql-sonar-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi
創(chuàng)建一個(gè)pvc:
kubectl create -f mysql-sonar-pvc.yml
最后我們修改上篇博文中創(chuàng)建的mysql-sonar-dm.yml文件,內(nèi)容如下:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: mysql-sonar spec: replicas: 1 # selector: # app: mysql-sonar template: metadata: labels: app: mysql-sonar spec: containers: - name: mysql-sonar p_w_picpath: myhub.fdccloud.com/library/mysql-yd:5.6 ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: "mysoft" - name: MYSQL_DATABASE value: sonardb - name: MYSQL_USER value: sonar - name: MYSQL_PASSWORD value: sonar volumeMounts: - name: mysql-sonar mountPath: /var/lib/mysql volumes: - name: mysql-sonar persistentVolumeClaim: claimName: mysql-sonar-pvc
創(chuàng)建mysql pod:
kubectl create -f mysql-sonar-dm.yml
這樣我們就創(chuàng)建了一個(gè)數(shù)據(jù)持久化的pod。我們可以通過往數(shù)據(jù)庫上寫入一些數(shù)據(jù),然后再刪除掉pod,再重新創(chuàng)建一個(gè)pod的方式來測試數(shù)據(jù)是否丟失。
需要說明的是,如果在創(chuàng)建容器的時(shí)候,rbd設(shè)備沒有事先創(chuàng)建,或者我們在測試的時(shí)候,刪除當(dāng)前pod,但又還沒完全刪除的時(shí)候啟動(dòng)了一個(gè)新pod,這個(gè)pod就會(huì)一直處于ContainerCreating狀態(tài),這個(gè)時(shí)候kubelet日志會(huì)有相關(guān)報(bào)錯(cuò)。具體可以參考:http://tonybai.com/2016/11/07/integrate-kubernetes-with-ceph-rbd/
還需要說明的一點(diǎn),必須在所有node節(jié)點(diǎn)上安裝ceph-common包,否則,在啟動(dòng)容器時(shí)會(huì)出現(xiàn)類似如下報(bào)錯(cuò):
ntVolume.SetUp failed for volume "kubernetes.io/rbd/da0deff5-0bef-11e7-bf41-00155d0a2521-mysql-sonar-pv" (spec.Name: "mysql-sonar-pv") pod "da0deff5-0bef-11e7-bf41-00155d0a2521" (UID: "da0deff5-0bef-11e7-bf41-00155d0a2521") with: rbd: map failed executable file not found in $PATH
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。