在Kubernetes中搭建ceph的StorageClass
搭建Ceph集群
注意
此文中的ceph只支持mimic以下的版本,推荐使用luminous版本
设备需求
操作系统 | 数量 | CPU | 内存 | 磁盘 |
---|---|---|---|---|
CentOS7 | 2或者3 | 2 | 2G | 200G |
配置ssh互信
- 配置3台设备的HostName以及hosts文件
hostname hosts cephNode1 /etc/hosts文件配置3台设备的IP和hostname cephNode2 /etc/hosts文件配置3台设备的IP和hostname cephNode3 /etc/hosts文件配置3台设备的IP和hostname - 做ssh互信
ssh-copy-id ${hostname}
安装Ceph
- 配置ceph的repo (配置阿里云的即可)
[ceph] name=ceph baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/x86_64/ gpgcheck=0 [ceph-noarch] name=cephnoarch baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch/ gpgcheck=0
- 安装ceph
- cephNode1安装ceph-deploy和ceph
yum -y install epel-release yum clean all yum makecache yum -y install ceph ceph-deploy
- cephNode2(和cephNode3)安装ceph
yum -y install epel-release yum clean all yum makecache yum -y install ceph
- cephNode1安装ceph-deploy和ceph
- 安装过程中遇到的问题
- 缺少安装包问题,如下图
问题解决方案:yum -y install epel-release
- hostname问题
这个问题推荐先配置好hostname在做ceph的安装
- 缺少安装包问题,如下图
创建Ceph的Pool
- 调整防火墙策略,如果您是在测试环境,可以考虑关闭firewalld
systemctl stop firewalld
- ceph初始化
- 在cephNode1上执行以下操作
- 初始化
mkdir ~/cluster cd ~/cluster ceph-deploy new cephNode1
- 配置ceph.conf
osd pool default size = 2 osd crush chooseleaf type = 0 osd max object name len = 256 osd journal size = 128
- 执行以下命令完成ceph初始化
ceph-deploy mon create-initial ceph-deploy mgr create cephNode1 ceph-deploy admin cephNode1 cephNode2 cephNode3 ```
- ceph准备disk,如果防火墙没有放开,此步骤会失败
ceph-deploy osd create --data ${你的200G磁盘地址} cephNode1 ceph-deploy osd create --data ${你的200G磁盘地址} cephNode2 ceph-deploy osd create --data ${你的200G磁盘地址} cephNode3
- 创建ceph pool
- 初始化pool rbd,不初始化这个不能使用rbd ls等命令
cd ~/cluster ceph osd pool create rbd 100 100 rbd pool init rbd rbd ls
- 创建pool kube
cd ~/cluster ceph osd pool create kube 50 50 ceph osd pool ls ceph osd pool application enable kube rbd ceph osd crush tunables hammer ceph auth get-or-create client.k8s mon 'allow r' osd 'allow rwx pool=k8s' -o ceph.client.k8s.keyring
- 创建pool kube
- 初始化pool rbd,不初始化这个不能使用rbd ls等命令
- 测试ceph
# 创建pool rbd create foo --size 4096 --pool rbd --image-format=1 # 列举pool rbd ls # 删除pool rbd rm foo
- 准备如下文件
ceph.client.admin.keyring ceph.client.kube.keyring ceph.conf
配置StorageClass
- 在kubernetes中安装与ceph集群相同版本的ceph-common
yum -y install ceph-common
- 将上一步中准备的文件拷贝到kubernetes集群中的每一个节点的/etc/ceph/目录下(这一步有的时候不一定起作用,下面还有一次拷贝)
- 部署ceph的rbac
- 获取相关的k8s文件
git clone https://github.com/kubernetes-incubator/external-storage.git
- 修改相关文件
cd external-storage/ceph/rbd/deploy NAMESPACE=default # change this if you want to deploy it in another namespace sed -r -i "s/namespace: [^ ]+/namespace: $NAMESPACE/g" ./rbac/clusterrolebinding.yaml ./rbac/rolebinding.yaml kubectl -n $NAMESPACE apply -f ./rbac
- 建议在kube-system命名空间中装一次
- 因为存在一个权限问题,所以,需要修改rbac/clusterrole.yaml文件中添加如下内容,隶属于roles模块
- apiGroups: [""] resources: ["secrets"] verbs: ["get", "create", "delete"]
- 这里需要将ceph的那几个配置文件拷贝到对应的rbd-provisioner容器中,如果不拷贝,可能会出现找不到keyring或者ceph.conf的情况
- 部署StorageClass
cd external-storage/ceph/rbd/examples/
- 部署secrets
查看secrets.yaml文件,按照文件中的提示获取auth base64码,并配置
- 部署StorageClass,修改class.yaml文件,以下为样例
``` kind: StorageClass apiVersion:storage.k8s.io/v1 metadata: name: rbd provisioner: ceph.com/rbd parameters: monitors: 10.80.0.144:6789(修改这里) pool: k8s(修改这里) adminId: admin adminSecretNamespace: kube-system adminSecretName: ceph-admin-secret userId: kube userSecretNamespace: kube-system(这里视情况修改,看你的secret建在哪个namespace了) userSecretName: ceph-secret imageFormat: "2" imageFeatures: layering ```
- 部署PVC
kubectl apply -f claim.yaml
- 部署Pod
``` kubectl apply -f ${目录下的pod的yaml文件} ```
- 如果PVC Bound成功,pod也成功mount到volume则此次实验成功
- 部署secrets
- 获取相关的k8s文件