命令记不住

登陆

k8s 使用 ceph 作为 pod 存储

04.k8s使用ceph作为pod存储

1.PV与PVC概述

PV持久卷

对外部存储资源创建和使用的抽象,使得存储作为集群中的资源管理,PV又分为静态供给和动态供给,由于静态供给需要提前创建一堆PV,维护成本较高,所以企业一般使用动态供给

PVC持久卷申请

让用户不需要关心具体的Volume实现细节,只需要定义PVC需要多少多少磁盘容量即可

过程:

Pod --> pvc --> pv --> ceph

2.ceph-csi供给程序

Ceph-csi是ceph官方维护的PV供给程序,专门用于在Kubernetes中使用RBD、CephFS为pod提供存储

项目地址:https://github.com/ceph/ceph-csi

cephgc

3.Pod使用RBD块存储

deploy YAML文件:

https://github.com/ceph/ceph-csi/tree/release-v3.3/deploy

关于部署,RBD YAML文件在deploy/rbd/jubernetes目录,YAML需要改动如下:

  • 全部统一命名空间到ceph-csi
  • 将镜像转存到docker hub
  • 增加secret.yaml和storage class.yaml文件
  • 将csi-rbdplugin-provisioner.yaml和cis-rbdplugin.yaml中关于kms配置注释

在使用过程中,还需要根据自己的集群环境修改:

  • Csi-config-map.yaml修改连接ceph集群信息
  • Secret.yaml修改密钥
  • Storage class.yaml修改集群ID和存储池

步骤:

 kubectl create ns ceph-csi
  sed -i 's#namespace: default#namespace: ceph-csi#g' *.yaml

Secret.yaml

# ceph auth list
client.admin
  key: AQBBs09iXvJNGhAAj3q69jgXyAnDKoP/KPv7wQ==

---
apiVersion: v1
kind: Secret
metadata:
  name: csi-rbd-secret
  namespace: ceph-csi
stringData:
  userID: admin
  userKey: AQBBs09iXvJNGhAAj3q69jgXyAnDKoP/KPv7wQ==

node节点安装客户端

pssh  -h host.list -i "yum install -y ceph-common"

修改 vi csi-config-map.yaml

# 查看ceph集群id
[root@ceph-node01 ~]# ceph -s
  cluster:
    id:     2619f4ef-ca59-4798-8031-87501f2bf266
    health: HEALTH_OK

# cat csi-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
  config.json: |-
    [
      {
        "clusterID": "2619f4ef-ca59-4798-8031-87501f2bf266",
        "monitors": [
          "192.168.6.141:6789",
          "192.168.6.171:6789",
          "192.168.6.212:6789"
        ]
      }
    ]
metadata:
  name: ceph-csi-config
  namespace: ceph-csi

storage class.yaml

# 暂时没
# 1.修改ceph集群id
# 2.修改ceph pool名称

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: csi-rbd-sc
  annotations:
    storageclass.kubernetes.io/is-default-class: "false"
provisioner: kubernetes.io/rbd
parameters:
  clusterID: 2619f4ef-ca59-4798-8031-87501f2bf266
  pool: rbd-pool
# 不完整,忽略

使用以下secret和storageclass

1.获取key

# grep key ceph.client.admin.keyring |awk '{printf "%s", $NF}' |base64
QVFCQnMwOWlYdkpOR2hBQWozcTY5amdYeUFuREtvUC9LUHY3d1E9PQ==

2.创建yaml文件

apiVersion: v1
kind: Secret
metadata:
  name: ceph-admin-secret
  namespace: ceph-csi
type: "kubernetes.io/rbd"
data:
  key: QVFCQnMwOWlYdkpOR2hBQWozcTY5amdYeUFuREtvUC9LUHY3d1E9PQ==

---
allowVolumeExpansion: true
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
  name: csi-rbd-sc
parameters:
  adminId: admin
  adminSecretName: ceph-admin-secret
  adminSecretNamespace: ceph-csi
  fsType: ext4
  imageFeatures: layering
  imageFormat: "2"
  monitors: 192.168.6.141:6789,192.168.6.171:6789,192.168.6.212:6789
  pool: rbd-pool
  userId: admin
  userSecretName: ceph-admin-secret
  userSecretNamespace: ceph-csi
provisioner: kubernetes.io/rbd
reclaimPolicy: Retain
volumeBindingMode: Immediate

将csi-rbdplugin-provisioner.yaml和cis-rbdplugin.yaml中关于kms配置注释

[root@bjo-ops-242 rbd_yaml]# grep kms csi-rbdplugin-provisioner.yaml
           # - name: ceph-csi-encryption-kms-config
           #   mountPath: /etc/ceph-csi-encryption-kms-config/
        #- name: ceph-csi-encryption-kms-config
        #    name: ceph-csi-encryption-kms-config
[root@bjo-ops-242 rbd_yaml]# grep kms csi-rbdplugin.yaml 
            #- name: ceph-csi-encryption-kms-config
            #  mountPath: /etc/ceph-csi-encryption-kms-config/
        #- name: ceph-csi-encryption-kms-config
        #    name: ceph-csi-encryption-kms-config

执行apply

# kubectl apply -f .

参考文档:https://llussy.github.io/2019/01/26/storageclass-ceph/

4.Pod使用CephFS块存储

忽略

5.k8s使用ceph场景

RBD:

优点:读写性能好,支持镜像快照和克隆

缺点:不支持多节点挂载

适用场景:对读写性能要求高,且无多节点同时读取数据需求的应用,例如数据库

CephFS:

优点:支持k8s所有访问模式,支持多节点同时读写数据

缺点:读写性能一般,延迟时间不稳定

适用场景:对读写性能要求不高,I/O延迟不敏感的应用,例如文件共享

推荐阅读