Kubernetes 使用 Ceph 存储

本文主要记录一下 Kubernetes 使用 Ceph 存储的相关配置过程,Kubernetes 集群环境采用的 kargo 部署方式,而且全部组件以容器化运行node

1、基础环境准备

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

2、部署 Ceph 集群

具体安装请参考 Ceph 笔记(一)Ceph 笔记(二),如下直接上命令api

2.一、部署集群

# 建立集群配置目录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

2.二、建立块设备

# 建立存储池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

3、kubernetes 使用 Ceph

3.一、PV & PVC 方式

传统的使用分布式存储的方案通常为 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

3.二、StoragaClass 方式

在 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/

相关文章
相关标签/搜索