Ceph

一、概述

Ceph 在 k8s 中用做共享存储还是非常方便的,Ceph 是比较老牌的分布式存储系统,非常成熟,功能也强大,支持三种模式(块存储、文件系统存储、对象存储),所以接下来就详细讲解如何在 k8s 使用 ceph。

前提是需要一个 k8s 环境。

二、Ceph Rook 介绍

Rook是一个开源的云原生存储编排工具__提供平台、框架和对各种存储解决方案的支持,以和云原生环境进行本地集成。

  • Rook 将存储软件转变成自我管理、自我扩展和自我修复的存储服务,通过自动化部署、启动、配置、供应、扩展、升级、迁移、灾难恢复、监控和资源管理来实现。Rook 底层使用云原生容器管理、调度和编排平台提供的能力来提供这些功能。
  • Rook 利用扩展功能将其深度地集成到云原生环境中,并为调度、生命周期管理、资源管理、安全性、监控等提供了无缝的体验。有关 Rook 当前支持的存储解决方案的状态相关的更多详细信息,可以参考 Rook 仓库 的项目介绍。Rook 目前支持 Ceph、NFS、Minio Object Store 和 CockroachDB。

K8S 中部署 Ceph 与功能测试实战 - 图1

官网:https://rook.io/
项目地址:https://github.com/rook

三、通过 Rook 在 k8s 中部署 Ceph

官方文档: https://rook.io/docs/rook/v1.10/Getting-Started/quickstart/

【温馨提示】k8s 节点各挂载一块(或者多块)20GB 的未使用的磁盘。

1)下载部署包

  1. git clone --single-branch --branch v1.10.8 https://github.com/rook/rook.git
部署所用到的镜像如下:
K8S 中部署 Ceph 与功能测试实战 - 图2 由于镜像源在国外,国内无法下载,这里需要修改一些镜像或者提前下载 tag,操作如下:
  1. cd rook/deploy/examples/
  2. #(registry.aliyuncs.com/google_containers/<image>:<tag>),后四个镜像我FQ下
  3. docker pull registry.aliyuncs.com/google_containers/csi-node-driver-registrar:v2.5.1
  4. docker tag registry.aliyuncs.com/google_containers/csi-node-driver-registrar:v2.5.1 registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.5.1
  5. docker pull registry.aliyuncs.com/google_containers/csi-snapshotter:v6.1.0
  6. docker tag registry.aliyuncs.com/google_containers/csi-snapshotter:v6.1.0 registry.k8s.io/sig-storage/csi-snapshotter:v6.1.0
  7. docker pull registry.aliyuncs.com/google_containers/csi-attacher:v4.0.0
  8. docker tag registry.aliyuncs.com/google_containers/csi-attacher:v4.0.0 registry.k8s.io/sig-storage/csi-attacher:v4.0.0
  9. docker pull registry.aliyuncs.com/google_containers/csi-resizer:v1.6.0
  10. docker tag registry.aliyuncs.com/google_containers/csi-resizer:v1.6.0 registry.k8s.io/sig-storage/csi-resizer:v1.6.0
  11. docker pull registry.aliyuncs.com/google_containers/csi-resizer:v1.6.0
  12. docker tag registry.aliyuncs.com/google_containers/csi-resizer:v1.6.0 registry.k8s.io/sig-storage/csi-resizer:v1.6.0
  13. docker pull registry.aliyuncs.com/google_containers/csi-provisioner:v3.3.0
  14. docker tag registry.aliyuncs.com/google_containers/csi-provisioner:v3.3.0 registry.k8s.io/sig-storage/csi-provisioner:v3.3.0

2)部署 Rook Operator

  1. cd rook/deploy/examples
  2. kubectl create -f crds.yaml -f common.yaml -f operator.yaml
  3. # 检查
  4. kubectl -n rook-ceph get pod
也可以通过 helm 部署
  1. helm repo add rook-release https://charts.rook.io/release
  2. helm install --create-namespace --namespace rook-ceph rook-ceph rook-release/rook-ceph -f values.yaml

3)创建 Rook Ceph 集群

现在 Rook Operator 处于 Running 状态,接下来就可以创建 Ceph 集群了。为了使集群在重启后不受影响,请确保设置的 dataDirHostPath 属性值为有效得主机路径。
  1. cd rook/deploy/examples
  2. kubectl apply -f cluster.yaml

4)部署 Rook Ceph 工具

  1. cd rook/deploy/examples
  2. kubectl create -f toolbox.yaml

5)部署 Ceph Dashboard

  1. cd rook/deploy/examples
  2. kubectl apply -f dashboard-external-https.yaml
  3. # 获取 dashboard admin密码
  4. kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 -d
通过 Ceph Dashboard 查看 Ceph 集群状态
  1. # 查看对外端口
  2. kubectl get svc -n rook-ceph

K8S 中部署 Ceph 与功能测试实战 - 图3

https://:nodePort/

K8S 中部署 Ceph 与功能测试实战 - 图4

6)检查

  1. kubectl get pods,svc -n rook-ceph

K8S 中部署 Ceph 与功能测试实战 - 图5

7)通过 ceph-tool 工具 pod 查看 ceph 集群状态

  1. kubectl exec -it `kubectl get pods -n rook-ceph|grep rook-ceph-tools|awk '{print $1}'` -n rook-ceph -- bash
  2. ceph -s

K8S 中部署 Ceph 与功能测试实战 - 图6

四、 测试验证

1) 块存储(RBD)测试

1、创建 StorageClass

  1. cd rook/deploy/examples
  2. # 创建一个名为replicapool的rbd pool
  3. kubectl apply -f csi/rbd/storageclass.yaml

K8S 中部署 Ceph 与功能测试实战 - 图7

2、部署 WordPress

  1. kubectl apply -f mysql.yaml
  2. kubectl apply -f wordpress.yaml

2)文件系统 (CephFS) 测试

1、创建 StorageClass

  1. kubectl apply -f csi/cephfs/storageclass.yaml

2、部署应用

  1. kubectl apply -f filesystem.yaml

3)对象存储 (RGW) 测试

1、创建对象存储

  1. kubectl create -f object.yaml
  2. # 验证rgw pod正常运行
  3. kubectl -n rook-ceph get pod -l app=rook-ceph-rgw

2、创建对象存储 user

  1. kubectl create -f object-user.yaml

3、获取 accesskey secretkey

  1. # 获取AccessKey
  2. kubectl -n rook-ceph get secret rook-ceph-object-user-my-store-my-user -o yaml | grep AccessKey | awk '{print $2}' | base64 --decode
  3. # 获取 SecretKey
  4. kubectl -n rook-ceph get secret rook-ceph-object-user-my-store-my-user -o yaml | grep SecretKey | awk '{print $2}' | base64 --decode

4、部署 rgw nodeport

  1. kubectl apply -f rgw-external.yaml
  2. kubectl -n rook-ceph get service rook-ceph-rgw-my-store rook-ceph-rgw-my-store-external

5、通过 api 接口使用 Ceph 对象存储

  1. #首先,需要安装 python-boto 包,用于测试连接 S3。:
  2. yum install python-boto -y
  3. # 然后,编写 python 测试脚本。
  4. # cat s3.py
  1. #!/usr/bin/python
  2. import boto
  3. import boto.s3.connection
  4. access_key = 'C7492VVSL8O11NZBK3GT'
  5. secret_key = 'lo8IIwMfmow4fjkSOMbjebmgjzTRBQSO7w83SvBd'
  6. conn = boto.connect_s3(
  7. aws_access_key_id = access_key,
  8. aws_secret_access_key = secret_key,
  9. host = '192.168.182.110', port=30369,
  10. is_secure=False,
  11. calling_format = boto.s3.connection.OrdinaryCallingFormat(),
  12. )
  13. bucket = conn.create_bucket('my-first-s3-bucket')
  14. for bucket in conn.get_all_buckets():
  15. print "{name}\t{created}".format(
  16. name = bucket.name,
  17. created = bucket.creation_date,
  18. )