溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Rook 筆記

發(fā)布時(shí)間:2020-06-06 14:07:37 來源:網(wǎng)絡(luò) 閱讀:1721 作者:moakia 欄目:云計(jì)算

Rook 筆記

1.rook基本概念

基本概念解析:云原生存儲(chǔ)編排管理器。

基本概念詳解:rook通過一個(gè)操作器(operator)完成后續(xù)操作,只需要定義需要狀態(tài)就行了。Rook通過監(jiān)視器監(jiān)控狀態(tài)變化,并將配置文件分配到集群上生效。傳統(tǒng)意義上的集群管理員必須掌握和監(jiān)控系統(tǒng),而Rook存儲(chǔ)運(yùn)行則完全自動(dòng)化。rook存儲(chǔ)是通過第三方資源以kubernetes擴(kuò)展形式運(yùn)行。

Rook 筆記

Rook 筆記

2.rook基本組件:
rook  operator: 是一個(gè)簡(jiǎn)單的容器,具有引導(dǎo)和監(jiān)視存儲(chǔ)集群的功能,供提供最基本的RADOS存儲(chǔ)。管理CRD,對(duì)象存儲(chǔ),文件系統(tǒng)。

Rook agent: 這些代理是在每個(gè)Kubernetes節(jié)點(diǎn)上部署的pod。每個(gè)代理都配置一個(gè)Flexvolume插件,該插件與Kubernetes的卷控制器框架集成在一起。處理節(jié)點(diǎn)上所需的所有存儲(chǔ)操作,例如附加網(wǎng)絡(luò)存儲(chǔ)設(shè)備,安裝卷和格式化文件系統(tǒng)。
Discover: 定期節(jié)點(diǎn)發(fā)現(xiàn)新設(shè)備
3.rook實(shí)現(xiàn)原理描述:
rook 是基于FelixVolume存儲(chǔ)插件機(jī)制實(shí)現(xiàn)。

Rook 筆記

Rook 筆記

4.啟動(dòng)流程

Rook 筆記

5.rook 控制流
1.rook operator運(yùn)行,并在每臺(tái)機(jī)器上運(yùn)行一個(gè)rook agent的pod
2.創(chuàng)建一個(gè)pvc,并指定storageclass使用rook.io/block provisionor
3.operator   provisionr 的provision()函數(shù)被調(diào)用,用以在集群中創(chuàng)建block image。此時(shí),Provision階段已完成,pvc/pv被考慮綁定到一起;
4.當(dāng)使用pvc的pod被創(chuàng)建時(shí),kubelete將調(diào)用 rook Felexxvolume的mount函數(shù),用于使用預(yù)定存儲(chǔ);
5. 隨后,agent將會(huì)按照CRD的描述創(chuàng)建一個(gè)volume并attach到該物理機(jī)上;
6.agent將volume map到本地機(jī)器上,并更新CRD的狀態(tài)以及設(shè)備的路徑值(例如/dev/rbd0)
7.控制權(quán)接著轉(zhuǎn)交給driver,如果mapping能夠成功執(zhí)行,則driver將把指定的設(shè)備mount到指定的路徑上。若在配置文件中還指明了文件系統(tǒng)的類型,則driver還會(huì)對(duì)該卷進(jìn)行文件系統(tǒng)格式化操作。
8.driver將反饋kubelet Mount()操作已成功 
6.創(chuàng)建rook,實(shí)驗(yàn)環(huán)境可以使用:play-with-k8s
# 說在前面的重點(diǎn),刪除重建operator,cluster時(shí),要?jiǎng)h除/var/lib/rook.
cd cluster/examples/kubernetes/ceph
kubectl create -f operator.yaml
#主要是一些自定義資源對(duì)象的定義CRD有:Cluster、Filesystem、ObjectStore、Pool、Volume;還創(chuàng)建了rook的三種組件Operator、Agent、Discover。
kubectl create -f cluster.yaml
#cluster.yaml中主要?jiǎng)?chuàng)建了一個(gè)Cluster(ceph集群)自定義資源對(duì)象(CR)

#如果出現(xiàn)如下報(bào)錯(cuò),請(qǐng)參考如下
解決方案參考1:
配置operator.yaml,需要和kubelet的--volume-plugin-dir參數(shù)中的保持一致
vim operator.yaml
       - name: FLEXVOLUME_DIR_PATH
         value: "/usr/libexec/kubernetes/kubelet-plugins/volume/exec"

解決方案參考2
exit status 2. rbd: error opening pool 'replicapool': (2) No such file or directory -- 這個(gè)報(bào)錯(cuò),我有遇到類似的問題,解決方法:在 rook-operator.yml 里添加
env:
- name: FLEXVOLUME_DIR_PATH
value: "/var/lib/kubelet/volumeplugins"
確保與kubelet 的--volume-plugin-dir一樣。重新apply.重啟kubelet.把rook-agent 和 rook-operator的pod刪除,自動(dòng)重建后等10分鐘我的報(bào)錯(cuò)就消失了。

--volume-plugin-dir=/var/lib/kubelet/volumeplugins
7.清理rook
- 清理命名空間rook-system,其中包含rook Operator和rook agent
- 清理名稱空間rook,其中包含rook存儲(chǔ)集群(集群CRD)
- 各節(jié)點(diǎn)的/var/lib/rook目錄,ceph mons和osds的配置都緩存于此
kubectl delete -n rook pool replicapool
kubectl delete storageclass rook-block
kubectl delete -n kube-system secret rook-admin
kubectl delete -f kube-registry.yaml

# 刪除Cluster CRD
kubectl delete -n rook cluster rook

# 當(dāng)Cluster CRD被刪除后,刪除Rook Operator和Agent
kubectl delete thirdpartyresources cluster.rook.io pool.rook.io objectstore.rook.io filesystem.rook.io volumeattachment.rook.io # ignore errors if on K8s 1.7+
kubectl delete crd clusters.rook.io pools.rook.io objectstores.rook.io filesystems.rook.io volumeattachments.rook.io  # ignore errors if on K8s 1.5 and 1.6
kubectl delete -n rook-system daemonset rook-agent
kubectl delete -f rook-operator.yaml
kubectl delete clusterroles rook-agent
kubectl delete clusterrolebindings rook-agent

# 刪除名字空間
kubectl delete namespace rook
8.rook 常用命令解析:

cluster.yaml

apiVersion: rook.io/v1alpha1
kind: Cluster
metadata:
  name: rook
  namespace: rook
spec:
  # 存儲(chǔ)后端,支持Ceph,NFS等等
  backend: ceph
  # 配置文件在宿主機(jī)的存放目錄
  dataDirHostPath: /var/lib/rook
  # 如果設(shè)置為true則使用宿主機(jī)的網(wǎng)絡(luò),而非容器的SDN(軟件定義網(wǎng)絡(luò))
  hostNetwork: false
  # 啟動(dòng)mon的數(shù)量,必須奇數(shù),1-9之間
  monCount: 3
  # 控制Rook的各種服務(wù)如何被K8S調(diào)度
  placement:
    # 總體規(guī)則,具體服務(wù)(api, mgr, mon, osd)的規(guī)則覆蓋總體規(guī)則
    all:
      # Rook的Pod能夠被調(diào)用到什么節(jié)點(diǎn)上(根據(jù)pod標(biāo)簽來說)
      nodeAffinity:
        # 硬限制                配置變更后已經(jīng)運(yùn)行的Pod不被影響
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          # 節(jié)點(diǎn)必須具有role=storage-node
          - matchExpressions:
            - key: role
              operator: In
              values:
              - storage-node
      # Rook能夠調(diào)用到運(yùn)行了怎樣的其它Pod的拓?fù)溆蛏希ǜ鶕?jù)node容忍度來說)
      podAffinity:
      podAntiAffinity:
      # 可以容忍具有哪些taint的節(jié)點(diǎn)
      tolerations:
      - key: storage-node
        operator: Exists
    api:
      nodeAffinity:
      podAffinity:
      podAntiAffinity:
      tolerations:
    mgr:
      nodeAffinity:
      podAffinity:
      podAntiAffinity:
      tolerations:
    mon:
      nodeAffinity:
      tolerations:
    osd:
      nodeAffinity:
      podAffinity:
      podAntiAffinity:
      tolerations:
  # 配置各種服務(wù)的資源需求
  resources:
    api:
      limits:
        cpu: "500m"
        memory: "1024Mi"
      requests:
        cpu: "500m"
        memory: "1024Mi"
    mgr:
    mon:
    osd:
  # 集群級(jí)別的存儲(chǔ)配置,每個(gè)節(jié)點(diǎn)都可以覆蓋
  storage:
    # 是否所有節(jié)點(diǎn)都用于存儲(chǔ)。如果指定nodes配置,則必須設(shè)置為false
    useAllNodes: true
    # 是否在節(jié)點(diǎn)上發(fā)現(xiàn)的所有設(shè)備,都自動(dòng)的被OSD消費(fèi)
    useAllDevices: false
    # 正則式,指定哪些設(shè)備可以被OSD消費(fèi),示例:
    # sdb 僅僅使用設(shè)備/dev/sdb
    # ^sd. 使用所有/dev/sd*設(shè)備
    # ^sd[a-d] 使用sda sdb sdc sdd
    # 可以指定裸設(shè)備,Rook會(huì)自動(dòng)分區(qū)但不掛載
    deviceFilter: ^vd[b-c]
    # 每個(gè)節(jié)點(diǎn)上用于存儲(chǔ)OSD元數(shù)據(jù)的設(shè)備。使用低讀取延遲的設(shè)備,例如SSD/NVMe存儲(chǔ)元數(shù)據(jù)可以提升性能
    metadataDevice:
    # 集群的位置信息,例如Region或數(shù)據(jù)中心,被直接傳遞給Ceph CRUSH map
    location:
    # OSD的存儲(chǔ)格式的配置信息
    storeConfig:
      # 可選filestore或bluestore,默認(rèn)后者,它是Ceph的一個(gè)新的存儲(chǔ)引擎
      # bluestore直接管理裸設(shè)備,拋棄了ext4/xfs等本地文件系統(tǒng)。在用戶態(tài)下使用Linux AIO直接對(duì)裸設(shè)備IO
      storeType: bluestore
      # bluestore數(shù)據(jù)庫(kù)容量   正常尺寸的磁盤可以去掉此參數(shù),例如100GB+
      databaseSizeMB: 1024
      # filestore日志容量     正常尺寸的磁盤可以去掉此參數(shù),例如20GB+
      journalSizeMB: 1024  
    # 用于存儲(chǔ)的節(jié)點(diǎn)目錄。在一個(gè)物理設(shè)備上使用兩個(gè)目錄,會(huì)對(duì)性能有負(fù)面影響
    directories:
    - path: /rook/storage-dir

    # 可以針對(duì)每個(gè)節(jié)點(diǎn)進(jìn)行配置
    nodes:
    # 節(jié)點(diǎn)A的配置
    - name: "172.17.4.101"
      directories:
      - path: "/rook/storage-dir"
      resources:
        limits:
          cpu: "500m"
          memory: "1024Mi"
        requests:
          cpu: "500m"
          memory: "1024Mi"
    # 節(jié)點(diǎn)B的配置      
    - name: "172.17.4.201"
      - name: "sdb"
      - name: "sdc"
      storeConfig:
        storeType: bluestore
    - name: "172.17.4.301"
      deviceFilter: "^sd."

pool.yaml

apiVersion: rook.io/v1alpha1
kind: Pool
metadata:
  name: ecpool
  namespace: rook
spec:
  # 存儲(chǔ)池中的每份數(shù)據(jù)是否是復(fù)制的
  replicated:
    # 副本的份數(shù)
    size: 3
  # Ceph的Erasure-coded存儲(chǔ)池消耗更少的存儲(chǔ)空間,必須禁用replicated
  erasureCoded:
    # 每個(gè)對(duì)象的數(shù)據(jù)塊數(shù)量
    dataChunks: 2
    # 每個(gè)對(duì)象的代碼塊數(shù)量
    codingChunks: 1
  crushRoot: default

?

objectStore

apiVersion: rook.io/v1alpha1
kind: ObjectStore
metadata:
  name: my-store
  namespace: rook
spec:
  # 元數(shù)據(jù)池,僅支持replication
  metadataPool:
    replicated:
      size: 3
  # 數(shù)據(jù)池,支持replication或erasure codin
  dataPool:
    erasureCoded:
      dataChunks: 2
      codingChunks: 1
  # RGW守護(hù)程序設(shè)置
  gateway:
    # 支持S3
    type: s3
    # 指向K8S的secret,包含數(shù)字證書信息
    sslCertificateRef:
    # RGW Pod和服務(wù)監(jiān)聽的端口
    port: 80
    securePort:
    # 為此對(duì)象存儲(chǔ)提供負(fù)載均衡的RGW Pod數(shù)量
    instances: 1
    # 是否在所有節(jié)點(diǎn)上啟動(dòng)RGW。如果為false則必須設(shè)置instances
    allNodes: false
    placement:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: role
              operator: In
              values:
              - rgw-node
      tolerations:
      - key: rgw-node
        operator: Exists
      podAffinity:
      podAntiAffinity:
    resources:
      limits:
        cpu: "500m"
        memory: "1024Mi"
      requests:
        cpu: "500m"
        memory: "1024Mi"

filesystem

apiVersion: rook.io/v1alpha1
kind: Filesystem
metadata:
  name: myfs
  namespace: rook
spec:
  # 元數(shù)據(jù)池
  metadataPool:
    replicated:
      size: 3
  # 數(shù)據(jù)池
  dataPools:
    - erasureCoded:
       dataChunks: 2
       codingChunks: 1
  # MDS守護(hù)程序的設(shè)置
  metadataServer:
    # MDS活動(dòng)實(shí)例數(shù)量
    activeCount: 1
    # 如果設(shè)置為true,則額外的MDS實(shí)例處于主動(dòng)Standby狀態(tài),維持文件系統(tǒng)元數(shù)據(jù)的熱緩存
    # 如果設(shè)置為false,則額外MDS實(shí)例處于被動(dòng)Standby狀態(tài)
    activeStandby: true
    placement:
    resources:
9.PV和PVC知識(shí)點(diǎn)補(bǔ)充
  • PV訪問方式:

    ReadWriteOnce – 被單個(gè)節(jié)點(diǎn)mount為讀寫rw模式 RWO
    ReadOnlyMany – 被多個(gè)節(jié)點(diǎn)mount為只讀ro模式   ROX
    ReadWriteMany – 被多個(gè)節(jié)點(diǎn)mount為讀寫rw模式  RWX
  • pv回收機(jī)制:

    Retain – 手動(dòng)重新使用
    Recycle – 基本的刪除操作 (“rm -rf /thevolume/*”)
    Delete – 關(guān)聯(lián)的后端存儲(chǔ)卷一起刪除,后端存儲(chǔ)例如AWS EBS, GCE PD或OpenStack Cinder
  • volume的狀態(tài):

    Available –閑置狀態(tài),沒有被綁定到PVC
    Bound – 綁定到PVC
    Released – PVC被刪掉,資源沒有被在利用
    Failed – 自動(dòng)回收失敗
    CLI會(huì)顯示綁定到PV的PVC名。
    
10.rook中節(jié)點(diǎn)作用補(bǔ)充
rook啟動(dòng)后各pod作用

mon:監(jiān)控組件,負(fù)責(zé)監(jiān)控ceph集群的狀況。

mgr:manager組件,主要監(jiān)控一些非paxos相關(guān)組件(比如pg相關(guān)統(tǒng)計(jì)信息),無狀態(tài)組件。

    收集可供prometheus指標(biāo)

    啟動(dòng)ceph dashboard

osd:osd組件,集群核心組件

mds: 元數(shù)據(jù)服務(wù)器。一或多個(gè)mds 協(xié)作管理文件系統(tǒng)的命名空間、協(xié)調(diào)到共享osd集群的訪問。當(dāng)在集群中聲明要一個(gè)共享文件系統(tǒng)時(shí),rook會(huì):為cephfs創(chuàng)建matadata和數(shù)據(jù)池;創(chuàng)建文件系統(tǒng);指定數(shù)量active-standby的mds實(shí)例。創(chuàng)建的文件系統(tǒng)會(huì)被集群中pod使用

rgw:為應(yīng)用提供RESTful類型對(duì)象存儲(chǔ)接口

    1.為對(duì)象創(chuàng)建metada和數(shù)據(jù)池

    2.啟動(dòng)rgw daemon

    3.創(chuàng)建service為rgw damon提供一個(gè)負(fù)載均衡地址。
11.rook管理集群繼續(xù)操作
  1. 通過圖形界面管理,部署dashboard

    cd /rook/cluster/examples/kubernetes/ceph
    kubectl apply -f dashboard-external-http.yaml
    kubectl get svc -n rook-ceph
    #查看端口號(hào)
    #通過瀏覽器訪問
    
  2. 創(chuàng)建塊存儲(chǔ)storageclass

    1.查看ceph數(shù)據(jù)盤文件類型
    df -Th
    2.根據(jù)ceph數(shù)據(jù)盤的文件系統(tǒng)類型修改fstype參數(shù)
    vims torageclass.yaml
    fstype: xfs
    3.創(chuàng)建storageclass
    kubectl create  -f storageclass.yaml
  3. 創(chuàng)建塊使用實(shí)例

    cd /rook/cluster/examples/kubernetes
    kubectl apply -f mysql.yaml
    kubectl apply -f wordpress.yaml
    
  4. 創(chuàng)建共享文件系統(tǒng)

    cd /rook/cluster/examples/kubernetes/ceph
    kubectl create -f filesystem.yaml
    kubectl get Filesystem -n rook-ceph

    共同探討,一起思考。希望可以輔助大家理解!

參考資源:

基于rook的kubernetes方案

rook控制流

rook詳解

rook-github

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI