本文主要记录一下 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/