本文主要記錄一下 Kubernetes 使用 Ceph 存儲的相關配置過程,Kubernetes 集羣環境採用的 kargo 部署方式,而且全部組件以容器化運行node
Kubernetes 集羣總共有 5 臺,部署方式爲 kargo 容器化部署,採用 kargo 部署時確保配置中開啓內核模塊加載( kubelet_load_modules: true
);Kubernetes 版本爲 1.6.4,Ceph 採用最新的穩定版 Jeweldocker
節點 | IP | 部署 |
---|---|---|
docker1 | 192.168.1.11 | master、monitor、osd |
docker2 | 192.168.1.12 | master、monitor、osd |
docker3 | 192.168.1.13 | node、monitor、osd |
docker4 | 192.168.1.14 | node、osd |
docker5 | 192.168.1.15 | node、osd |
具體安裝請參考 Ceph 筆記(一)、Ceph 筆記(二),如下直接上命令api
# 建立集羣配置目錄mkdir ceph-cluster && cd ceph-cluster# 建立 monitor-nodeceph-deploy new docker1 docker2 docker3# 追加 OSD 副本數量echo "osd pool default size = 5" >> ceph.conf# 安裝 cephceph-deploy install docker1 docker2 docker3 docker4 docker5# init monitor nodeceph-deploy mon create-initial# 初始化 odsceph-deploy osd prepare docker1:/dev/sda docker2:/dev/sda docker3:/dev/sda docker4:/dev/sda docker5:/dev/sda# 激活 osdceph-deploy osd activate docker1:/dev/sda1:/dev/sda2 docker2:/dev/sda1:/dev/sda2 docker3:/dev/sda1:/dev/sda2 docker4:/dev/sda1:/dev/sda2 docker5:/dev/sda1:/dev/sda2# 部署 ceph cli 工具和祕鑰文件ceph-deploy admin docker1 docker2 docker3 docker4 docker5# 確保祕鑰有讀取權限chmod +r /etc/ceph/ceph.client.admin.keyring# 檢測集羣狀態ceph health
# 建立存儲池rados mkpool data# 建立 p_w_picpathrbd create data --size 10240 -p data# 關閉不支持特性rbd feature disable data exclusive-lock, object-map, fast-diff, deep-flatten -p data# 映射(每一個節點都要映射)rbd map data --name client.admin -p data# 格式化塊設備(單節點便可)mkfs.xfs /dev/rbd0
傳統的使用分佈式存儲的方案通常爲 PV & PVC
方式,也就是說管理員預先建立好相關 PV 和 PVC,而後對應的 deployment 或者 replication 掛載 PVC 來使用app
建立 Secret分佈式
# 獲取管理 key 並進行 base64 編碼ceph auth get-key client.admin | base64# 建立一個 secret 配置(key 爲上條命令生成的)cat << EOF >> ceph-secret.yml apiVersion: v1 kind: Secret metadata: name: ceph-secret data: key: QVFDaWtERlpzODcwQWhBQTdxMWRGODBWOFZxMWNGNnZtNmJHVGc9PQo= EOFkubectl create -f ceph-secret.yml
建立 PVide
# monitor 須要多個,pool 和 p_w_picpath 填寫上面建立的cat << EOF >> test.pv.yml apiVersion: v1 kind: PersistentVolume metadata: name: test-pv spec: capacity: storage: 2Gi accessModes: - ReadWriteMany rbd: monitors: - 192.168.1.11:6789 - 192.168.1.12:6789 - 192.168.1.13:6789 pool: data p_w_picpath: data user: admin secretRef: name: ceph-secret fsType: xfs readOnly: false persistentVolumeReclaimPolicy: Recycle EOFkubectl create -f test.pv.yml
建立 PVC工具
cat << EOF >> test.pvc.yml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: test-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 2Gi EOFkubectl create -f test.pvc.yml
建立 Deployment並掛載編碼
cat << EOF >> test.deploy.yml apiVersion: apps/v1beta1 kind: Deployment metadata: name: demo spec: replicas: 3 template: metadata: labels: app: demo spec: containers: - name: demo p_w_picpath: mritd/demo ports: - containerPort: 80 volumeMounts: - mountPath: "/data" name: data volumes: - name: data persistentVolumeClaim: claimName: test-pvc EOFkubectl create -f test.deploy.yml
在 1.4 之後,kubernetes 提供了一種更加方便的動態建立 PV 的方式;也就是說使用 StoragaClass 時無需預先建立固定大小的 PV,等待使用者建立 PVC 來使用;而是直接建立 PVC 便可分配使用spa
建立系統級 Secretcode
注意: 因爲 StorageClass 要求 Ceph 的 Secret type 必須爲 kubernetes.io/rbd
,因此上一步建立的ceph-secret
須要先被刪除,而後使用以下命令從新建立;此時的 key 並無通過 base64
# 這個 secret type 必須爲 kubernetes.io/rbd,不然會形成 PVC 沒法使用kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" --from-literal=key='AQCikDFZs870AhAA7q1dF80V8Vq1cF6vm6bGTg==' --namespace=kube-system kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" --from-literal=key='AQCikDFZs870AhAA7q1dF80V8Vq1cF6vm6bGTg==' --namespace=default
建立 StorageClass
cat << EOF >> test.storageclass.yml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: test-storageclass provisioner: kubernetes.io/rbd parameters: monitors: 192.168.1.11:6789,192.168.1.12:6789,192.168.1.13:6789 # Ceph 客戶端用戶 ID(非 k8s 的) adminId: admin adminSecretName: ceph-secret adminSecretNamespace: kube-system pool: data userId: admin userSecretName: ceph-secret EOFkubectl create -f test.storageclass.yml
關於上面的 adminId 等字段具體含義請參考這裏 Ceph RBD
建立 PVC
cat << EOF >> test.sc.pvc.yml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: test-sc-pvc annotations: volume.beta.kubernetes.io/storage-class: test-storageclass spec: accessModes: - ReadWriteMany resources: requests: storage: 2Gi EOFkubectl create -f test.sc.pvc.yml
建立 Deployment
cat << EOF >> test.sc.deploy.yml apiVersion: apps/v1beta1 kind: Deployment metadata: name: demo-sc spec: replicas: 3 template: metadata: labels: app: demo-sc spec: containers: - name: demo-sc p_w_picpath: mritd/demo ports: - containerPort: 80 volumeMounts: - mountPath: "/data" name: data volumes: - name: data persistentVolumeClaim: claimName: test-sc-pvc EOFkubectl create -f test.sc.deploy.yml
到此完成,檢測是否成功最簡單的方式就是看相關 pod 是否正常運行
轉載請註明出處,本文采用 CC4.0 協議受權
本文轉自: https://mritd.me/2017/06/03/use-ceph-storage-on-kubernetes/