Ceph持久化存储为k8s应用提供存储方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ceph持久化存储为k8s应用提供存储方案相关的知识,希望对你有一定的参考价值。

PV、PVC概述
Pod动态供给
Pod使用CephFS作为持久化数据卷
Ceph端创建CephFS pool
部署Cephfs-provisioner
配置storageclass
测试使用
Ceph集群维护命令

PV、PVC概述

管理存储是管理计算的一个明显问题。PersistentVolume子系统为用户和管理员提供了一个API,用于抽象如何根据消费方式提供存储的详细信息。于是引入了两个新的API资源:PersistentVolume和PersistentVolumeClaim
PersistentVolume(PV)是集群中已由管理员配置的一段网络存储。 集群中的资源就像一个节点是一个集群资源。 PV是诸如卷之类的卷插件,但是具有独立于使用PV的任何单个pod的生命周期。 该API对象包含存储的实现细节,即NFS,iSCSI或云提供商特定的存储系统。
PersistentVolumeClaim(PVC)是用户存储的请求。 它类似于pod。Pod消耗节点资源,PVC消耗存储资源。 pod可以请求特定级别的资源(CPU和内存)。 权限要求可以请求特定的大小和访问模式。
虽然PersistentVolumeClaims允许用户使用抽象存储资源,但是常见的是,用户需要具有不同属性(如性能)的PersistentVolumes,用于不同的问题。 管理员需要能够提供多种不同于PersistentVolumes,而不仅仅是大小和访问模式,而不会使用户了解这些卷的实现细节。 对于这些需求,存在StorageClass资源。
StorageClass为集群提供了一种描述他们提供的存储的“类”的方法。 不同的类可能映射到服务质量级别,或备份策略,或者由群集管理员确定的任意策略。 Kubernetes本身对于什么类别代表是不言而喻的。 这个概念有时在其他存储系统中称为“配置文件”

Pod动态供给

动态供给主要是能够自动帮你创建pv,需要多大的空间就创建多大的pv。k8s帮助创建pv,创建pvc就直接api调用存储类来寻找pv。
如果是存储静态供给的话,会需要我们手动去创建pv,如果没有足够的资源,找不到合适的pv,那么pod就会处于pending等待的状态。而动态供给主要的一个实现就是StorageClass存储对象,其实它就是声明你使用哪个存储,然后帮你去连接,再帮你去自动创建pv。

Pod使用CephFS做为持久数据卷
CephFS方式支持k8s的pv的3种访问模式ReadWriteOnce,ReadOnlyMany ,ReadWriteMany
Ceph端创建CephFS pool
1、如下操作在ceph的mon或者admin节点
CephFS需要使用两个Pool来分别存储数据和元数据

ceph osd pool create fs_data 16
ceph osd pool create fs_metadata 16
[root@k8s-master ceph-storage]# ceph osd lspools
1 .rgw.root
2 default.rgw.control
3 default.rgw.meta
4 default.rgw.log
5 kube
6 fs_data
7 fs_metadata

2、创建一个CephFS

ceph fs new cephfs fs_metadata fs_data
new fs with metadata pool 7 and data pool 6

3、查看

ceph fs ls
name: cephfs, metadata pool: fs_metadata, data pools: [fs_data ]

部署 cephfs-provisioner
1、使用社区提供的cephfs-provisioner

yaml文件地址:git@gitee.com:zhaocheng172/cephfs-storage.git
拉取需要将公钥给我,不然拉不下来

[root@k8s-master cephfs-storage]# ls
cephfs-pvc-test.yaml  external-storage-cephfs-provisioner.yaml  nginx-pod.yaml  storageclass-cephfs.yaml

kubectl apply -f external-storage-cephfs-provisioner.yaml

2、查看状态 等待running之后 再进行后续的操作

[root@k8s-master cephfs-storage]# kubectl get pod -A
NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
kube-system   cephfs-provisioner-5d47d684f4-rff7r       1/1     Running   0          7s
kube-system   coredns-9d85f5447-mhp9m                   1/1     Running   0          7h3m
kube-system   coredns-9d85f5447-x6rxv                   1/1     Running   0          7h9m
kube-system   etcd-k8s-master                           1/1     Running   2          7h9m

配置 storageclass
1、查看key 在ceph的mon或者admin节点
ceph auth get-key client.admin

2、创建 admin secret

kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" --from-literal=key=AQCHHGte882jHxAA3xokdiyBYj9+UhhflszkPw==== --namespace=kube-system

?
3、查看 secret

kubectl get secret ceph-secret -n kube-system -o yaml
apiVersion: v1
data:
  key: QVFDSEhHdGU4ODJqSHhBQTN4b2tkaXlCWWo5K1VoaGZsc3prUHc9PT09
kind: Secret
metadata:
  creationTimestamp: "2020-03-13T12:25:28Z"
  name: ceph-secret
  namespace: kube-system
  resourceVersion: "69255"
  selfLink: /api/v1/namespaces/kube-system/secrets/ceph-secret
  uid: 104a8a6d-92f8-4e54-b548-e82e43aa2d0f
type: kubernetes.io/rbd

4、配置 StorageClass

cat >storageclass-cephfs.yaml<<EOF
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: dynamic-cephfs
provisioner: ceph.com/cephfs
parameters:
  monitors: 10.151.30.125:6789,10.151.30.126:6789,10.151.30.127:6789
  adminId: admin
  adminSecretName: ceph-secret
  adminSecretNamespace: "kube-system"
  claimRoot: /volumes/kubernetes
EOF

5、创建
kubectl apply -f storageclass-cephfs.yaml

6、查看

kubectl get sc
dynamic-cephfs        ceph.com/cephfs   Delete          Immediate           false                  5s

测试使用
1、创建pvc测试

cat >cephfs-pvc-test.yaml<<EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: cephfs-claim
spec:
  accessModes:     
    - ReadWriteMany
  storageClassName: dynamic-cephfs
  resources:
    requests:
      storage: 2Gi
EOF

kubectl apply -f cephfs-pvc-test.yaml

2、查看

kubectl get pvc
[root@k8s-master cephfs-storage]# kubectl get pvc
NAME           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
cephfs-claim   Bound    pvc-544b5db3-e034-4bc7-b601-815030c8bdd4   2Gi        RWX            dynamic-cephfs   4m53s

kubectl get pv
pvc-544b5db3-e034-4bc7-b601-815030c8bdd4   2Gi        RWX            Delete           Bound    default/cephfs-claim                       dynamic-cephfs                 5m8s

3、创建 nginx pod 挂载测试

cat >nginx-pod.yaml<<EOF
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod2
  labels:
    name: nginx-pod2
spec:
  containers:
  - name: nginx-pod2
    image: nginx
    ports:
    - name: web
      containerPort: 80
    volumeMounts:
    - name: cephfs
      mountPath: /usr/share/nginx/html
  volumes:
  - name: cephfs
    persistentVolumeClaim:
      claimName: cephfs-claim
EOF
kubectl apply -f nginx-pod.yaml

4、查看

kubectl get pods -o wide
[root@k8s-master cephfs-storage]# kubectl exec -it nginx-pod2 /bin/bash
root@nginx-pod2:/# df -h
Filesystem                                                                                                                                           Size  Used Avail Use% Mounted on
overlay                                                                                                                                              8.7G  5.3G  3.5G  61% /
tmpfs                                                                                                                                                 64M     0   64M   0% /dev
tmpfs                                                                                                                                                1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sda3                                                                                                                                            8.7G  5.3G  3.5G  61% /etc/hosts
shm                                                                                                                                                   64M     0   64M   0% /dev/shm
192.168.30.21:6789,192.168.30.22:6789,192.168.30.23:6789:/volumes/kubernetes/kubernetes/kubernetes-dynamic-pvc-b0ac12c9-6526-11ea-918a-bef58f12dbe9  2.8G     0  2.8G   0% /usr/share/nginx/html

5、修改文件内容
kubectl exec -ti nginx-pod2 -- /bin/sh -c ‘echo This is from CephFS!!! &gt; /usr/share/nginx/html/index.html‘

6、访问pod测试
curl http://$podip

7、清理

kubectl delete -f nginx-pod.yaml
kubectl delete -f cephfs-pvc-test.yaml

一、集群监控管理

集群整体运行状态

[root@cephnode01 ~]# ceph -s
cluster:
  id:     8230a918-a0de-4784-9ab8-cd2a2b8671d0
  health: HEALTH_WARN
          application not enabled on 1 pool(s)

services:
  mon: 3 daemons, quorum cephnode01,cephnode02,cephnode03 (age 27h)
  mgr: cephnode01(active, since 53m), standbys: cephnode03, cephnode02
  osd: 4 osds: 4 up (since 27h), 4 in (since 19h)
  rgw: 1 daemon active (cephnode01)

data:
  pools:   6 pools, 96 pgs
  objects: 235 objects, 3.6 KiB
  usage:   4.0 GiB used, 56 GiB / 60 GiB avail
  pgs:     96 active+clean

id:集群ID
health:集群运行状态,这里有一个警告,说明是有问题,意思是pg数大于pgp数,通常此数值相等。

mon:Monitors运行状态。
osd:OSDs运行状态。
mgr:Managers运行状态。
mds:Metadatas运行状态。
pools:存储池与PGs的数量。
objects:存储对象的数量。
usage:存储的理论用量。
pgs:PGs的运行状态
~]$ ceph -w
~]$ ceph health detail

PG状态
查看pg状态查看通常使用下面两个命令即可,dump可以查看更详细信息,如。

~]$ ceph pg dump
~]$ ceph pg stat

Pool状态

~]$ ceph osd pool stats
~]$ ceph osd pool stats

OSD状态

~]$ ceph osd stat
~]$ ceph osd dump
~]$ ceph osd tree
~]$ ceph osd df

Monitor状态和查看仲裁状态

~]$ ceph mon stat
~]$ ceph mon dump
~]$ ceph quorum_status

集群空间用量

~]$ ceph df
~]$ ceph df detail

二、集群配置管理(临时和全局,服务平滑重启)
有时候需要更改服务的配置,但不想重启服务,或者是临时修改。这时候就可以使用tell和daemon子命令来完成此需求。
1、查看运行配置
命令格式:
#ceph daemon {daemon-type}.{id} config show

?
命令举例

#ceph daemon osd.0 config show

2、tell子命令格式
使用 tell 的方式适合对整个集群进行设置,使用 * 号进行匹配,就可以对整个集群的角色进行设置。而出现节点异常无法设置时候,只会在命令行当中进行报错,不太便于查找。
命令格式:

#ceph tell {daemon-type}.{daemon id or *} injectargs --{name}={value} [--{name}={value}]
命令举例:
#ceph tell osd.0 injectargs --debug-osd 20 --debug-ms 1

?
daemon-type:为要操作的对象类型如osd、mon、mds等。
daemon id:该对象的名称,osd通常为0、1等,mon为ceph -s显示的名称,这里可以输入*表示全部。
injectargs:表示参数注入,后面必须跟一个参数,也可以跟多个
3、daemon子命令
使用 daemon 进行设置的方式就是一个个的去设置,这样可以比较好的反馈,此方法是需要在设置的角色所在的主机上进行设置。
命令格式:
#ceph daemon {daemon-type}.{id} config set {name}={value}
命令举例:
#ceph daemon mon.ceph-monitor-1 config set mon_allow_pool_delete false

三、集群操作
命令包含start、restart、status
1、启动所有守护进程
#systemctl start ceph.target
2、按类型启动守护进程

#systemctl start ceph-mgr.target
#systemctl start ceph-osd@id
#systemctl start ceph-mon.target
#systemctl start ceph-mds.target
#systemctl start ceph-radosgw.target

?
四、添加和删除OSD
1、添加OSD
1、格式化磁盘
ceph-volume lvm zap /dev/sd&lt;id&gt;
2、进入到ceph-deploy执行目录/my-cluster,添加OSD
#ceph-deploy osd create --data /dev/sd&lt;id&gt; $hostname

2、删除OSD
1、调整osd的crush weight为 0
ceph osd crush reweight osd.&lt;ID&gt; 0.0
2、将osd进程stop
systemctl stop ceph-osd@&lt;ID&gt;
3、将osd设置out
ceph osd out &lt;ID&gt;
4、立即执行删除OSD中数据
ceph osd purge osd.&lt;ID&gt; --yes-i-really-mean-it
5、卸载磁盘
umount /var/lib/ceph/osd/ceph-?

五、扩容PG

ceph osd pool set {pool-name} pg_num 128
ceph osd pool set {pool-name} pgp_num 128

注:
1、扩容大小取跟它接近的2的N次方
2、在更改pool的PG数量时,需同时更改PGP的数量。PGP是为了管理placement而存在的专门的PG,它和PG的数量应该保持一致。如果你增加pool的pg_num,就需要同时增加pgp_num,保持它们大小一致,这样集群才能正常rebalancing。
六、Pool操作
列出存储池
ceph osd lspools

创建存储池

命令格式:
#ceph osd pool create {pool-name} {pg-num} [{pgp-num}]
命令举例:
#ceph osd pool create rbd 32 32

设置存储池配额

命令格式:
#ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]
命令举例:
#ceph osd pool set-quota rbd max_objects 10000

删除存储池
ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]

重命名存储池

ceph osd pool rename {current-pool-name} {new-pool-name}

查看存储池统计信息
rados df

给存储池做快照
ceph osd pool mksnap {pool-name} {snap-name}

删除存储池的快照
ceph osd pool rmsnap {pool-name} {snap-name}

获取存储池选项值
ceph osd pool get {pool-name} {key}

调整存储池选项值

ceph osd pool set {pool-name} {key} {value}
size:设置存储池中的对象副本数,详情参见设置对象副本数。仅适用于副本存储池。
min_size:设置 I/O 需要的最小副本数,详情参见设置对象副本数。仅适用于副本存储池。
pg_num:计算数据分布时的有效 PG 数。只能大于当前 PG 数。
pgp_num:计算数据分布时使用的有效 PGP 数量。小于等于存储池的 PG 数。
hashpspool:给指定存储池设置/取消 HASHPSPOOL 标志。
target_max_bytes:达到 max_bytes 阀值时会触发 Ceph 冲洗或驱逐对象。
target_max_objects:达到 max_objects 阀值时会触发 Ceph 冲洗或驱逐对象。
scrub_min_interval:在负载低时,洗刷存储池的最小间隔秒数。如果是 0 ,就按照配置文件里的 osd_scrub_min_interval 。
scrub_max_interval:不管集群负载如何,都要洗刷存储池的最大间隔秒数。如果是 0 ,就按照配置文件里的 osd_scrub_max_interval 。
deep_scrub_interval:“深度”洗刷存储池的间隔秒数。如果是 0 ,就按照配置文件里的 osd_deep_scrub_interval 。

获取对象副本数
ceph osd dump | grep ‘replicated size‘

七、用户管理
Ceph 把数据以对象的形式存于各存储池中。Ceph 用户必须具有访问存储池的权限才能够读写数据。另外,Ceph 用户必须具有执行权限才能够使用 Ceph 的管理命令。
1、查看用户信息
查看所有用户信息
#ceph auth list
获取所有用户的key与权限相关信息
#ceph auth get client.admin
如果只需要某个用户的key信息,可以使用pring-key子命令
#ceph auth print-key client.admin

2、添加用户

#ceph auth add client.john mon ‘allow r‘ osd ‘allow rw pool=liverpool‘
#ceph auth get-or-create client.paul mon ‘allow r‘ osd ‘allow rw pool=liverpool‘
#ceph auth get-or-create client.george mon ‘allow r‘ osd ‘allow rw pool=liverpool‘ -o george.keyring
#ceph auth get-or-create-key client.ringo mon ‘allow r‘ osd ‘allow rw pool=liverpool‘ -o ringo.key

3、修改用户权限

#ceph auth caps client.john mon ‘allow r‘ osd ‘allow rw pool=liverpool‘
#ceph auth caps client.paul mon ‘allow rw‘ osd ‘allow rwx pool=liverpool‘
#ceph auth caps client.brian-manager mon ‘allow *‘ osd ‘allow *‘
#ceph auth caps client.ringo mon ‘ ‘ osd ‘ ‘

4、删除用户
#ceph auth del {TYPE}.{ID}
其中, {TYPE} 是 client,osd,mon 或 mds 的其中一种。{ID} 是用户的名字或守护进程的 ID 。

?
八、增加和删除Monitor
一个集群可以只有一个 monitor,推荐生产环境至少部署 3 个。 Ceph 使用 Paxos 算法的一个变种对各种 map 、以及其它对集群来说至关重要的信息达成共识。建议(但不是强制)部署奇数个 monitor 。Ceph 需要 mon 中的大多数在运行并能够互相通信,比如单个 mon,或 2 个中的 2 个,3 个中的 2 个,4 个中的 3 个等。初始部署时,建议部署 3 个 monitor。后续如果要增加,请一次增加 2 个。
1、新增一个monitor
#ceph-deploy mon create $hostname
注意:执行ceph-deploy之前要进入之前安装时候配置的目录。/my-cluster

2、删除Monitor
#ceph-deploy mon destroy $hostname

注意: 确保你删除某个 Mon 后,其余 Mon 仍能达成一致。如果不可能,删除它之前可能需要先增加一个。

以上是关于Ceph持久化存储为k8s应用提供存储方案的主要内容,如果未能解决你的问题,请参考以下文章

Ceph持久化存储为k8s应用提供存储方案

Ceph持久化存储为k8s应用提供存储方案

k8s 对接 ceph 实现持久化存储

k8s 对接 ceph 实现持久化存储

k8s 对接 ceph 实现持久化存储

K8S专栏Kubernetes数据持久化管理