注意:
-
本文仅供参考。在Kubernetes中建议使用Rook项目,更为方便、兼容性更好。
- 在Kubernetes中使用Ceph已经有专门的项目 rook(https://rook.io)。
- Rook-Kubernetes云原生存储系统,https://my.oschina.net/u/2306127/blog/1819630
- Rook定位为Cloud Native的存 储系统,支持CSI接口,使用Ceph作为基础实现。
- 了解Ceph概念和使用方法,参见Ceph的官方文档,http://docs.ceph.org.cn/。
本文翻译自Ceph官方文档,括号内的内容为注释。
安装
ceph-helm 项目可让你在Kubernetes 环境以托管方式部署Ceph . 本文档假定Kubernetes 环境已经可用。
当前的限制
- Public网络和Cluster网络必须是同一个网络
- 如果 storage class 用户标识不是admin, 则必须在Ceph集群中手动创建用户并在Kubernetes中创建其secret
- ceph-mgr只能运行1个replica
安装并使用Helm
可以按照此说明instructions安装Helm。
Helm通过从本地读取Kubernetes配置文件来查找Kubernetes集群; 确保文件已下载和且helm客户端可以访问。
Kubernetes群集必须配置并运行Tiller服务器,并且须将本地Helm客户端网络可达。查看init的Helm文档获取帮助。要在本地运行Tiller并将Helm连接到它,请运行如下命令(此命令会在Kubernetes集群部署一个tiller实例):
ceph-helm项目默认使用本地的Helm repo来存储charts。要启动本地Helm repo服务器,请运行:
添加Ceph-Helm charts到本地repo
$ git clone https://github.com/ceph/ceph-helm
$ cd ceph-helm/ceph
$ make
配置Ceph集群
创建一个包含Ceph配置的ceph-overrides.yaml文件。这个文件可能存在于任何地方,本文档默认此文件在用户的home目录中。
注意 如果未设置日志(journal)设备,它将与device设备同位置。另ceph-helm/ceph/ceph/values.yaml文件包含所有可配置的选项。
创建Ceph 集群的namespace
默认情况下,ceph-helm组件在Kubernetes的ceph namespace中运行。如果要自定义,请自定义namespace的名称,默认namespace请运行:
配置RBAC权限
Kubernetes> = v1.6使RBAC成为默认的admission controller。ceph-helm要为每个组件提供RBAC角色和权限:
rbac.yaml文件假定Ceph集群将部署在ceph命名空间中。
给Kubelet节点打标签
需要设置以下标签才能部署Ceph集群:
ceph-osd-device-标签是基于我们的ceph-overrides.yaml中定义的osd_devices名称值创建的。从我们下面的例子中,我们将得到以下两个标签:ceph-osd-device-dev-sdb和ceph-osd-device-dev-sdc。
每个 Ceph Monitor节点:
每个 OSD node节点:
Ceph 部署
运行helm install命令来部署Ceph:
helm install的输出显示了将要部署的不同类型的资源。
将使用ceph-rbd-provisioner Pod创建ceph.com/rbd类型的名为ceph-rbd的StorageClass。这允许创建PVC时自动提供RBD。第一次挂载时,RBD设备将被格式化(format)。所有RBD设备都将使用ext4文件系统。ceph.com/rbd不支持fsType选项。默认情况下,RBD将使用镜像格式2和镜像分层特性。可以在values文件中覆盖以下storageclass的默认值:
使用下面的命令检查所有Pod是否正常运行。这可能需要几分钟时间:
注意 因为我们没有用ceph-rgw = enabled或ceph-mds = enabled 给节点打标签(ceph对象存储特性需要ceph-rgw,cephfs特性需要ceph-mds),因此MDS和RGW Pod都处于pending状态,一旦其他Pod都在运行状态,请用如下命令从某个MON节点检查Ceph的集群状态:
配置一个POD以便从Ceph申请使用一个持久卷
为〜/ ceph-overwrite.yaml中定义的k8s用户创建一个密钥环,并将其转换为base64:
编辑ceph namespace中存在的用户secret:
将base64值复制到key位置的值并保存::
我们创建一个在default namespace中使用RBD的Pod。将用户secret从ceph namespace复制到default namespace:
创建并初始化RBD池:
重要 重要的 Kubernetes使用RBD内核模块将RBD映射到主机。Luminous需要CRUSH_TUNABLES 5(Jewel)。这些可调参数的最小内核版本是4.5。如果您的内核不支持这些可调参数,请运行ceph osd crush tunables hammer。
重要 由于RBD映射到主机系统上。主机需要能够解析由kube-dns服务管理的ceph-mon.ceph.svc.cluster.local名称。要获得kube-dns服务的IP地址,运行kubectl -n kube-system get svc/kube-dns。
创建一个PVC:
检查集群上是否已创建RBD:
创建一个使用此PVC的Pod:
检查Pod:
日志
可以通过kubectl logs [-f]命令访问OSD和Monitor日志。Monitors有多个日志记录流,每个流都可以从ceph-mon Pod中的容器访问。
在ceph-mon Pod中有3个容器运行:ceph-mon,相当于物理机上的ceph-mon.hostname.log,cluster-audit-log-tailer相当于物理机上的ceph.audit.log,cluster-log-tailer相当于物理机上的ceph.log或ceph -w。每个容器都可以通过–container或-c选项访问。例如,要访问cluster-tail-log,可以运行:
本文转自开源中国-Kubernetes中用Helm安装Ceph存储服务