rook作为一个新颖的为Kubernetes定制而生的存储编排框架,将存储软件变成一种服务,通过搭建一套完善的存储集群来为业务集群提供存储支撑。
前置准备
在CentOS 7,主要有以下准备工作:
- 用
kubeadm
安装好kubernetes集群,并启用RBAC权限认证。 - 由于rook要用到FlexVolume插件,因此需保证所有节点的
/usr/libexec/kubernetes/kubelete-plugins/volume/exec/
目录为可读可写(在CentOS 7不需要进行处理,其他平台需要进行配置)。其他rook相关的前置条件可参考官方指引。 主要用到了以下镜像,需提前在所有节点导入。
1
2
3
4docker pull rook/ceph:v0.8.3
docker pull k8s.gcr.io/hyperkube:v1.7.12
docker pull ceph/ceph:v13
docker pull rook/nfs:master为每个节点挂载一块单独的磁盘,并务必完成分区操作(优先使用ext4格式)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# 假设磁盘为/dev/vdc
# 编辑磁盘信息
fdisk /dev/vdc
# 创建GPT分区表
g
# 新建磁盘分区
n
# 写入修改
w
# 格式化磁盘
mkfs.ext4 /dev/vdc1
# 将分区挂载到目录
mount /dev/vdc1 /data1
# 确保开机自动挂载,能看到/dev/vdc1 /data1 ext4 ...字样
cat /etc/fstab
安装步骤
1. 部署rook ceph operator
rook ceph operator可以选择使用kubectl和helm两种方式来安装。
kubectl安装
修改clusters/examples/kubernetes/ceph/operator.yaml
文件,指定Deployment.spec.templates.spec.containers.rook-ceph-operator
.image
为rook/ceph:v0.8.3
,且imagePullPolicy
为IfNotPresent
。1
2
3
4
5
6
7
8
9
10
11
12kind: Deployment
...
spec:
...
templates:
spec:
containers:
- name: rook-ceph-operator
#image: rook/ceph:master
image: rook/ceph:v0.8.3
imagePullPolicy: IfNotPresent
...
使用以下命令创建rook-operator的相关资源。1
kubectl create -f cluster/examples/kubernetes/ceph/operator.yaml
helm安装
修改clusters/charts/rook-ceph/values.yaml
文件,指定image
.tag
为v0.8.3
,且pullPolicy
为IfNotPresent
。1
2
3
4image
tag: v0.8.3
pullPolicy: IfNotPresent
...
使用以下命令创建rook-operator的相关资源。1
helm install --namespace rook-ceph-system cluster/charts/rook-ceph
验证
使用对应的命令验证输出。1
2
3kubectl get role -n rook-ceph-system
# 输出
rook-ceph-system
1 | kubectl get rolebinding -n rook-ceph-system |
1 | kubectl get deploy -n rook-ceph-system |
1 | kubectl get psp |
1 | kubectl get sa |
1 | kubectl get crd |
1 | kubectl get clusterrole |
1 | kubectl get clusterrolebinding |
1 | kubectl get po -n rook-ceph-system |
2. 部署rook ceph cluster
修改cluster/examples/kubernetes/ceph/cluster.yaml
,在CRDCluster
如下配置。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27apiVersion: ceph.rook.io/v1beta1
kind: Cluster
metadata:
name: rook-ceph
namespace: rook-ceph
spec:
cephVersion:
image: ceph/ceph:v13
allowUnsupported: false
# 存放
dataDirHostPath: /data1/rook
serviceAccount: rook-ceph-cluster
mon:
count: 3
allowMultiplePerNode: true
dashboard:
enabled: true
network:
hostNetwork: false
storage: # cluster level storage configuration and selection
useAllNodes: true
useAllDevices: false
deviceFilter:
location:
config:
databaseSizeMB: "1024"
journalSizeMB: "1024"
使用以下命令创建Cluster的相关资源。1
2
3
4
5
6
7
8kubectl create -f cluster/examples/kubernetes/ceph/cluster.yaml
# 输出
namespace "rook-ceph" created
serviceaccount "rook-ceph-cluster" created
role.rbac.authorization.k8s.io "rook-ceph-cluster" created
rolebinding.rbac.authorization.k8s.io "rook-ceph-cluster-mgmt" created
rolebinding.rbac.authorization.k8s.io "rook-ceph-cluster" created
cluster.ceph.rook.io "rook-ceph" created
验证
使用对应的命令验证输出。1
2
3kubectl get ns rook-ceph
# 输出
rook-ceph
1 | kubectl get sa rook-ceph-cluster -n rook-ceph |
1 | kubectl get role -n rook-ceph |
1 | kubectl get rolebinding -n rook-ceph |
1 | kubectl get cluster -n rook-ceph |
1 | kubectl get po -n rook-ceph |
3. 部署rook ceph StorageClass
rook提供三种SC:块存储、对象存储及共享文件系统,我们使用相对简单的块存储。
注意:其真实的存储还是虚拟机磁盘的实际存储。
修改cluster/examples/kubernetes/ceph/storageclass.yaml
,注释掉parameters
.fstype
,使用默认的ext4
。1
2
3
4
5...
apiVersion: storage.k8s.io/v1
kind: StorageClass
...
# fstype: xfs
使用以下命令创建SC。1
kubectl create -f cluster/examples/kubernetes/ceph/storageclass.yaml
至此,用户已经可以直接使用rook ceph SC来创建PV和PVC了,但某些场景下存在多个pod同时访问一个pvc的需求,因此使用rook ceph block时会导致后创建的pod无法访问pvc,所以我们需要使用另一种方式将ceph block存储包装起来,如使用rook nfs。
4. 创建rook nfs operator
首先创建rook nfs Operator,几乎不需要对官方模板进行任何修改。1
kubectl create -f cluster/example/kubernetes/nfs/operator.yaml
1 | kubectl get po -n rook-nfs-system |
1 | rook-nfs-operator |
5. 创建NFS PVC及NFS Server
创建一个使用rook ceph block StorageClass的PVC作为NFS Server的存储后端,并创建一个CRD NFSServer。
注意:PVC需指定SC为rook-ceph-block,NFSServer需指定exporter为PVC名称。1
vim cluster/example/kubernets/nfs/nfs-ceph.yaml
1 | kind: PersistentVolumeClaim |
1 | kubectl create -f cluster/example/kubernets/nfs/nfs-ceph.yaml |
6. 创建Client PV
通过以下指令获取rook nfs Service的Cluster IP。1
kubectl -n rook-nfs get service -l app=rook-nfs -o jsonpath='{.items[0].spec.clusterIP}'
修改PV声明,指定NFS Server地址为上述Cluster IP,从而像访问普通的NFS Server一样访问rook NFS Server。
同时需指定path为上述PVC的名称,以及声明一个StorageClass。1
vim cluster/example/kubernets/nfs/pv.yaml
1 | kind: PersistentVolume |
创建Client PV。1
kubectl create -f cluster/example/kubernets/nfs/pv.yaml
7. 创建Client PVC
创建Client PVC,只需指定StorageClass为上述Client PV的SC即可。1
vim cluster/example/kubernets/nfs/pvc.yaml
1 | kind: PersistentVolumeClaim |
1 | kubectl create -f cluster/example/kubernets/nfs/pvc.yaml |
8. 示例
使用mysql应用来对接存储,此处对接的是rook ceph block。
先准备好镜像,导入到每个节点上,然后创建mysql应用相关资源。1
2docker pull mysql:5.6
kubectl create -f cluster/examples/kubernetes/mysql.yaml
9. 部署辅助工具(待补充)
https://rook.io/docs/rook/v0.8/ceph-dashboard.html
https://rook.io/docs/rook/v0.8/toolbox.html
https://rook.io/docs/rook/v0.8/monitoring.html
10. 清理
1 | kubectl delete -f cluster/examples/kubernetes/ceph/cluster.yaml |
1 | kubectl delete -f cluster/examples/kubernetes/ceph/operator.yaml |
1 | kubectl delete -f cluster/examples/kubernetes/nfs/operator.yaml |
1 | kubectl delete -f cluster/examples/kubernetes/nfs/nfs-ceph.yaml |
1 | kubectl delete -f cluster/examples/kubernetes/nfs/pvc.yaml |
1 | kubectl delete -f cluster/examples/kubernetes/nfs/pv.yaml |
11. 常见故障
部分常见故障已经在上述步骤中予以规避。
官方指引