一、介紹
- Rook官網:https://rook.io
- Rook是雲原生計算基金會(CNCF)的孵化級項目.
- Rook是Kubernetes的開源雲本地存儲協調器,為各種存儲解決方案提供平台,框架和支持,以便與雲原生環境本地集成。
- 至於CEPH,官網在這:https://ceph.com/
二、環境
docker1.13.1
k8s:1.13.4
kubeadm安裝
集群成員:
master單機
三、安裝
3.1 環境准備
所有節點開啟ip_forward cat <<EOF > /etc/sysctl.d/ceph.conf net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system
3.2部署Rook Operator
#無另外說明,全部操作都在master操作 cd $HOME git clone https://github.com/rook/rook.git cd rook cd cluster/examples/kubernetes/ceph kubectl apply -f operator.yaml
#執行apply之后稍等一會。 #operator會在集群內的每個主機創建兩個pod:rook-discover,rook-ceph-agent
3.3給節點打標簽
運行ceph-mon的節點打上:ceph-mon=enabled kubectl label nodes {kube-node1,kube-node2,kube-node3} ceph-mon=enabled 運行ceph-osd的節點,也就是存儲節點,打上:ceph-osd=enabled kubectl label nodes {kube-node1,kube-node2,kube-node3} ceph-osd=enabled 運行ceph-mgr的節點,打上:ceph-mgr=enabled #mgr只能支持一個節點運行,這是ceph跑k8s里的局限 kubectl label nodes kube-node1 ceph-mgr=enabled
3.3配置cluster.yaml文件
-
官方配置文件詳解:https://rook.io/docs/rook/v0.8/ceph-cluster-crd.html
-
文件中有幾個地方要注意:
- dataDirHostPath: 這個路徑是會在宿主機上生成的,保存的是ceph的相關的配置文件,再重新生成集群的時候要確保這個目錄為空,否則mon會無法啟動
- useAllDevices: 使用所有的設備,建議為false,否則會把宿主機所有可用的磁盤都干掉
- useAllNodes:使用所有的node節點,建議為false,肯定不會用k8s集群內的所有node來搭建ceph的
- databaseSizeMB和journalSizeMB:當磁盤大於100G的時候,就注釋這倆項就行了
- 參考https://blog.51cto.com/bigboss/2320016
3.4部署cluster
kubectl apply -f cluster.yaml
四、配置ceph dashboard
- 創建個nodeport類型的service以便集群外部訪問
kubectl apply -f dashboard-external-https.yaml
執行后,會隨機使用nodeport端口
-
# 查看一下nodeport在哪個端口 kubectl -n rook-ceph get service - 查看登錄密碼
#查看dashboard密碼,用戶為admin kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo
- 打開瀏覽器輸入任意一個Node的IP+nodeport端口
五、配置ceph為storageclass
5.1 修改storageclass.yaml
apiVersion: ceph.rook.io/v1beta1 kind: Pool metadata: #這個name就是創建成ceph pool之后的pool名字 name: replicapool namespace: rook-ceph spec: replicated: size: 1 # size 池中數據的副本數,1就是不保存任何副本 failureDomain: osd # failureDomain:數據塊的故障域, # 值為host時,每個數據塊將放置在不同的主機上 # 值為osd時,每個數據塊將放置在不同的osd上 --- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ceph # StorageClass的名字,pvc調用時填的名字 provisioner: ceph.rook.io/block parameters: pool: replicapool fstype: xfs # 設置回收策略默認為:Retain reclaimPolicy: Retain #添加動態擴容 allowVolumeExpansion: true
kubectl apply -f storageclass.yaml
創建個nginx pod嘗試掛載
cat << EOF > nginx.yaml --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nginx-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: ceph --- apiVersion: v1 kind: Service metadata: name: nginx spec: selector: app: nginx ports: - port: 80 name: nginx-port targetPort: 80 protocol: TCP --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - mountPath: /html name: http-file volumes: - name: http-file persistentVolumeClaim: claimName: nginx-pvc EOF kubectl apply -f nginx.yaml
六、已經創建的pvc,如何擴容
6.1首先storageclass開啟
allowVolumeExpansion: true
6.2修改pvc的容量,(ps:不能比之前小)
6.3重啟pod
如何在線文件系統擴展?,無需重啟呢:
Kubernetes v1.11 還引入了一個 Alpha 功能,叫做在線文件系統擴展。這個功能可以對一個正在被 Pod 使用的卷進行文件系統的擴展。這個功能還處於 Alpha 階段,
因此需要通過 Feature gate 啟用 ExpandInUsePersistentVolumes。
目前支持的有 GCE-PD、AWS-EBS、Cinder 以及 Ceph RBD。當激活這個功能后,引用被擴展的卷的 Pod 無需重啟。文件系統會隨着卷擴展的步驟進行擴展。
文件系統的擴展只有在 Pod 引用被擴展的卷的時候才會發生,所以如果沒有 Pod 引用這個卷,那么就不會進行文件系統擴展。
