rook使用手册

rook作为一个新颖的为Kubernetes定制而生的存储编排框架,将存储软件变成一种服务,通过搭建一套完善的存储集群来为业务集群提供存储支撑。

前置准备

在CentOS 7,主要有以下准备工作:

  1. kubeadm安装好kubernetes集群,并启用RBAC权限认证。
  2. 由于rook要用到FlexVolume插件,因此需保证所有节点的/usr/libexec/kubernetes/kubelete-plugins/volume/exec/目录为可读可写(在CentOS 7不需要进行处理,其他平台需要进行配置)。其他rook相关的前置条件可参考官方指引
  3. 主要用到了以下镜像,需提前在所有节点导入。

    1
    2
    3
    4
    docker 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
  4. 为每个节点挂载一块单独的磁盘,并务必完成分区操作(优先使用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.imagerook/ceph:v0.8.3,且imagePullPolicyIfNotPresent

1
2
3
4
5
6
7
8
9
10
11
12
kind: 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.tagv0.8.3,且pullPolicyIfNotPresent

1
2
3
4
image
tag: v0.8.3
pullPolicy: IfNotPresent
...

使用以下命令创建rook-operator的相关资源。

1
helm install --namespace rook-ceph-system cluster/charts/rook-ceph

验证

使用对应的命令验证输出。

1
2
3
kubectl get role -n rook-ceph-system
# 输出
rook-ceph-system

1
2
3
kubectl get rolebinding -n rook-ceph-system
# 输出
rook-ceph-system
1
2
3
kubectl get deploy -n rook-ceph-system
# 输出
rook-ceph-operator
1
2
3
kubectl get psp
# 输出
00-rook-ceph-operator
1
2
3
kubectl get sa
# 输出
rook-ceph-system
1
2
3
4
5
6
7
kubectl get crd
# 输出
filesystems.ceph.rook.io
volumes.rook.io
objectstores.ceph.rook.io
clusters.ceph.rook.io
pools.ceph.rook.io
1
2
3
4
5
kubectl get clusterrole
# 输出
rook-ceph-cluster-mgmt
rook-ceph-global
rook-ceph-system-psp-user
1
2
3
4
kubectl get clusterrolebinding
# 输出
rook-ceph-global
rook-ceph-system-psp-users
1
2
3
4
5
kubectl get po -n rook-ceph-system
# 输出
rook-ceph-agent 1/1 Running * 节点数
rook-discover 1/1 Running * 节点数
rook-ceph-operator 1/1 Running * 1
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
27
apiVersion: 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
8
kubectl 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
3
kubectl get ns rook-ceph
# 输出
rook-ceph

1
2
3
kubectl get sa rook-ceph-cluster -n rook-ceph
# 输出
rook-ceph-cluster
1
2
3
kubectl get role -n rook-ceph
# 输出
rook-ceph
1
2
3
4
kubectl get rolebinding -n rook-ceph
# 输出
rook-ceph-cluster
rook-ceph-cluster-mgmt
1
2
3
kubectl get cluster -n rook-ceph
# 输出
rook-ceph
1
2
3
4
5
6
kubectl get po -n rook-ceph
# 输出
rook-ceph-mgr 1/1 Runing * 1
rook-ceph-mon 1/1 Running * 3
rook-ceph-osd-id-x 1/1 Running * 节点数
rook-ceph-osd-prepare 0/1 Completed * 节点数
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
kind: PersistentVolumeClaim
metadata:
name: nfs-ceph-claim
namespace: rook-nfs
spec:
storageClassName: rook-ceph-block
accessModes:
- ReadWriteMany
resources:
requests:
storage: 200Gi
...
kind: NFSServer
metadata:
name: rook-nfs
namespace: rook-nfs
spec:
exports:
- name: nfs-share
persistentVolumeClaim: nfs-ceph-claim
...
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
2
3
4
5
6
7
8
9
10
11
12
13
14
kind: PersistentVolume
metadata:
name: rook-nfs-pv
namespace: rook-nfs
...
spec:
storageClassName: rook-nfs-sc
capacity:
storage: 20Gi
accessModes:
- ReadWriteMany
nfs:
server: <cluster IP>
path: "/nfs-ceph-claim"

创建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
2
3
4
5
6
7
8
9
10
11
kind: PersistentVolumeClaim
metadata:
name: static-volume-1
namespace: default
spec:
storageClassName: rook-nfs-sc
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Gi
1
kubectl create -f cluster/example/kubernets/nfs/pvc.yaml
8. 示例

使用mysql应用来对接存储,此处对接的是rook ceph block。
先准备好镜像,导入到每个节点上,然后创建mysql应用相关资源。

1
2
docker 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. 常见故障

部分常见故障已经在上述步骤中予以规避。
官方指引

12. 参考资料

rook ceph
rook nfs