中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Kubernetes 1.5通過Ceph實現有狀態容器

發布時間:2020-06-01 02:49:54 來源:網絡 閱讀:580 作者:msj0905 欄目:MySQL數據庫

在上一篇博文,我們通過kubernetes的devlopment和service完成了sonarqube的部署。看起來已經可用,但是仍然有一個很大的問題。我們知道,像mysql這種數據庫是需要保存數據而且不能讓數據丟失的。而容器恰恰是一旦退出,所有數據都會丟失。我們的mysql-sonar容器一旦重啟,那么我們后續對sonarqube做的任何設置都會丟失。所以我們必須找到一種方法能讓mysql-sonar容器中的mysql數據保存下來。kubernetes提供多種持久化數據的方案,包括使用hostPath,nfs,flocker,glusterfs,rbd等等。我們就使用ceph提供的rbd塊存儲來實現kubernetes的持久化存儲。

要使用ceph作為存儲,首先得安裝ceph,我這里簡單羅列下通過ceph-deploy安裝ceph的過程,先說下運行環境:

server-117: admin-node   mon-node  client-node
server-236: osd-node  mon-node
server-227: osd-node  mon-node

在所有機器上配置yum源:

Kubernetes 1.5通過Ceph實現有狀態容器

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

Kubernetes 1.5通過Ceph實現有狀態容器

然后在所有機器上配置ntp時間同步,具體操作不做說明。

配置admin-node到其他各節點的ssh免密訪問。我這里圖省事,直接使用root來完成后續操作,但在官方的標準安裝中,要求使用普通帳號來完成,且這個帳號不能命名為ceph,因為ceph是默認啟動ceph守護進程的帳戶。給出一個示例:

Kubernetes 1.5通過Ceph實現有狀態容器

useradd cephadminecho "cephadmin" | passwd --stdin cephadmin

要求所有的cephadmin有免密sudo的權限:echo "cephd ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephdsudo chmod 0440 /etc/sudoers.d/cephd

vim /etc/sudoers

Defaults:cephadmin    !requiretty

然后使用這個帳戶完成相互之間的ssh免密訪問

最后在admin-node上編輯~/.ssh/config,內容示例如下:

Host server-117
   Hostname server-117
   User cephadmin
Host server-236
   Hostname server-236
   User cephadmin
Host server-227
   Hostname server-227
   User cephadmin

Kubernetes 1.5通過Ceph實現有狀態容器

部署ceph,下面所有的操作都在admin-node上完成:

Kubernetes 1.5通過Ceph實現有狀態容器

安裝ceph-deployyum install -y ceph-deploymkdir ceph-cluster    #創建部署目錄,會在該目錄生成一些必要的配置文件

cd ceph-cluster

如果之前安裝過ceph,官方推薦使用如下命令獲得一個干凈的環境:
ceph-deploy purgedata server-236 server-227ceph-deploy forgetkeys
ceph-deploy purge server-236 server-227創建一個ceph cluster:

ceph-deploy new server-117 server-236 server-227    #其中server-117為mon-node,可以指定多個mon-node

上面命令執行完成以后,會在當前目錄合成一些輔助文件,其中ceph.conf默認內容如下:
[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

我額外添加如下幾行內容:

public_network=10.5.10.0/24    #定義互相通信的公有網絡
mon_clock_drift_allowed = 2    #定義多個mon節點之間時間的誤差為2s
osd_pool_default_size = 2    #定義最少可以允許有兩個osd,默認是3個,如果節點數量足夠,可不用修改

#以下三行配置都是為解決數據節點的存儲盤為ext4文件系統時,解決“ERROR: osd init failed: (36) File name too long”錯誤的。ceph官方推薦存儲盤使用xfs文件系統,但在有些特定的場合下,我們只能使用ext4文件系統。

osd_max_object_name_len = 256osd_max_object_namespace_len = 64filestore_xattr_use_omap = true

Kubernetes 1.5通過Ceph實現有狀態容器

執行安裝ceph:

ceph-depoly  server- server- server-  -y ceph ceph-radosgw

初始化mon-node:

ceph-deploy mon create-

這一過程執行完成以后,會在當前目錄出現若干*.keyring文件,這是ceph組件間進行安全訪問時所需要的

 

這時可以在各節點通過ps -ef | grep ceph來查看ceph-mon相關進程的運行狀況:

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:

啟動Osd-node可以分為兩步:prepare和activate。osd-node是真正存儲數據的節點,我們需要為ceph-osd提供獨立存儲空間,一般是一個獨立的disk,但也可以使用目錄取代。

 

在兩個osd-node節點上分別創建用于存儲的目錄:

Kubernetes 1.5通過Ceph實現有狀態容器

ssh server-236mkdir /data/osd0
exitssh server-227mkdir /data/osd1
exit

Kubernetes 1.5通過Ceph實現有狀態容器

執行如下操作:

#prepare操作會在上面創建的兩個目錄里創建一些后續activate激活以及osd運行時所需要的文件
ceph-deploy osd prepare server-236:/data/osd0 server-227:/data/osd1

#激活osd-node并啟動
ceph-deploy osd prepare server-236:/data/osd0 server-227:/data/osd1

執行完以后,通常會拋出類似如下錯誤:

[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

這是因為ceph默認的守護進程的用戶是ceph,無論是使用普通的ceph-admin創建的目錄還是使用root創建的目錄,ceph都沒有訪問權限。

所以需要在osd-node上再做一個授權:

 ceph.ceph -R /data/osd0

server-227:
chown ceph.ceph -R /data/osd1

往各節點同步配置文件:

ceph-deploy admin server-117 server-236 server-227

注意,如果配置文件有修改,需要重新執行同步操作,并重新執行activate操作

 

通過如下指令查看集群狀態:

ceph -s
ceph osd tree

 

當ceph集群安裝完成以后,我們就要創建相應的rbd塊用于kubernetes存儲。創建塊設備之前,需要先創建存儲池,ceph提供了一個叫做rbd的默認存儲池。我們再創建一個kube的存儲專門用來存儲kubernetes使用的塊設備,后續的操作都在client-node上執行:

ceph osd pool create kube 100 100    #后面兩個100分別為pg-num和pgp-num

在kube存儲池創建一個映像文件,就叫mysql-sonar,該映像文件的大小為5GB:

rbd create kube/mysql-sonar --size 5120 --p_w_picpath-format 2 --p_w_picpath-feature layering

注意,上面的命令,在我的環境下,如果不使用--p_w_picpath-feature layering,會拋出如下異常:

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

這是因為我目前centos 7.2的內核還不支持ceph的一些新特性。

 

將上面創建的映象文件映射為塊設備:

rbd map kube/mysql-sonar --name client.admin

至此,ceph上的操作就完成了。

 

接下來我們看下如何在kubernetes上使用上面ceph創建的塊設備。

我們可以在kubernetes的源碼文件的examples/volumes/rbd目錄下找到相關示例文件如下:

Kubernetes 1.5通過Ceph實現有狀態容器

[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

Kubernetes 1.5通過Ceph實現有狀態容器

其中rbd.json就是一個將rbd設備掛載為一個kubernetes volumes的示例文件。rbd-with-secret.json是使用secret的方式掛載ceph rbd的示例文件。ceph-secret.yaml是一個secret的示例文件。

我們可以先查看下ceph-secret.yaml文件:

Kubernetes 1.5通過Ceph實現有狀態容器

apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret
type: "kubernetes.io/rbd"  data:
  key: QVFCMTZWMVZvRjVtRXhBQTVrQ1FzN2JCajhWVUxSdzI2Qzg0SEE9PQ==

Kubernetes 1.5通過Ceph實現有狀態容器

我們只需要修改最后一行的key值。這個值通過base64進行過加密處理。處理前的值可以通過如下命令在ceph上獲得:

Kubernetes 1.5通過Ceph實現有狀態容器

ceph auth get-- ~]#  /etc/ceph/= AQDRvL9YvY7vIxAA7RkO5S8OWH6Aidnu22OiFw=== = =

Kubernetes 1.5通過Ceph實現有狀態容器

我們拿到這個key,然后做base64處理:

[root@server-117 ~]# echo "AQDRvL9YvY7vIxAA7RkO5S8OWH6Aidnu22OiFw==" | base64
QVFEUnZMOVl2WTd2SXhBQTdSa081UzhPV0g2QWlkbnUyMk9pRnc9PQo=

所以我們修改后的ceph-secret.yaml內容如下:

Kubernetes 1.5通過Ceph實現有狀態容器

apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret
type: "kubernetes.io/rbd"  data:
  key: QVFEUnZMOVl2WTd2SXhBQTdSa081UzhPV0g2QWlkbnUyMk9pRnc9PQo=

Kubernetes 1.5通過Ceph實現有狀態容器

創建一個secret:

kubectl create -f ceph-secret

由于直接使用volumes方式掛載的數據文件生命周期與pod一樣,隨著pod的釋放而釋放。所以在這里不推薦直接使用volumes的方式掛載,而使用pv的方式掛載。

我們先創建一個pv文件:

Kubernetes 1.5通過Ceph實現有狀態容器

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

Kubernetes 1.5通過Ceph實現有狀態容器

創建一個5GB大小的pv:

kubectl create -f mysql-sonar-pv.yml

再創建一個pvc文件:

Kubernetes 1.5通過Ceph實現有狀態容器

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql-sonar-pvc
spec:
  accessModes:    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

Kubernetes 1.5通過Ceph實現有狀態容器

創建一個pvc:

kubectl create -f mysql-sonar-pvc.yml

最后我們修改上篇博文中創建的mysql-sonar-dm.yml文件,內容如下:

Kubernetes 1.5通過Ceph實現有狀態容器

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

Kubernetes 1.5通過Ceph實現有狀態容器

創建mysql pod:

kubectl create -f mysql-sonar-dm.yml

這樣我們就創建了一個數據持久化的pod。我們可以通過往數據庫上寫入一些數據,然后再刪除掉pod,再重新創建一個pod的方式來測試數據是否丟失。

需要說明的是,如果在創建容器的時候,rbd設備沒有事先創建,或者我們在測試的時候,刪除當前pod,但又還沒完全刪除的時候啟動了一個新pod,這個pod就會一直處于ContainerCreating狀態,這個時候kubelet日志會有相關報錯。具體可以參考:http://tonybai.com/2016/11/07/integrate-kubernetes-with-ceph-rbd/

還需要說明的一點,必須在所有node節點上安裝ceph-common包,否則,在啟動容器時會出現類似如下報錯:

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

 

 



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

杨浦区| 白山市| 永州市| 平安县| 兴化市| 莱州市| 启东市| 潞城市| 齐齐哈尔市| 泉州市| 西宁市| 赤水市| 当阳市| 满城县| 黑水县| 新昌县| 德格县| 东城区| 宁德市| 子长县| 额尔古纳市| 丘北县| 英超| 临海市| 蒙阴县| 南溪县| 山阳县| 景宁| 大埔区| 景泰县| 金湖县| 丹东市| 吕梁市| 伊宁市| 得荣县| 盐边县| 霍林郭勒市| 五常市| 水城县| 天祝| 长阳|