k8s-ceph-存储-使用

k8s默认使用的本地存储,集群容灾性差,ceph作为开源的分布式存储系统,与openstack环境搭配使用,已经很多云计算公司运用于生产环境,可靠性得到验证。这里介绍一下在k8s环境下ceph如何使用.

环境

1
2
3
4
Ceph版本:10.2.2(Jewel)
K8s版本:1.10.2
Docker版本:1.13.1
系统版本:CentOS7.4.1708

Ceph机器创建K8s存储池

由于创建存储池会导致数据的迁移,所以如果Ceph集群已经用于生产环境,需要考虑数据迁移对于业务的影响,尽量避免业务高峰期执行
在Ceph管理节点执行:

1
ceph osd pool create k8s 128 ## 后面的这个128是创建pg的数量,具体数可以参考计算公式:https://ceph.com/pgcalc/

配置Ceph源

在所有K8s Node 上配置ceph的源,需要待安装客户端与ceph的版本一致

Ceph客户端安装

在所有k8s Node上安装:

1
yum install ceph-common ##与Ceph环境的版本一致

配置

把ceph的配置文件拷贝到每个K8s node上
在Ceph管理节点执行:

1
2
scp ceph.conf root@k8s-node:/etc/ceph
scp ceph.client.admin.keyring root@k8s-node:/etc/ceph #这里直接用的ceph里的admin

生成加密key

对ceph.client.admin.keyring 的内容进行base64编码
在k8s管理节点执行:

1
2
3
# grep key /etc/ceph/ceph.client.admin.keyring |awk '{printf "%s", $NF}'|base64
QWFDWDA2aFo5TG5TQnhBQVl1b0lUL2V3YlRSaEtwVEhPWkxvUlE9PQ==
后面会用到该key

下载镜像

由于k8s的control-manager没有集成ceph-common,所以需要下载额外的镜像:

1
docker pull registry.cn-beijing.aliyuncs.com/blackpiglet/rbd-provisioner

具体可参考:Issue
由于国内通过官方下载慢,有人把rbd-provisioner上传到阿里镜像仓库了

创建ServiceAccount

这里使用的namespace为default,需要有一个serviceaccount,并授权:

1
2
kubectl create serviceaccount persistent-volume-binder #后面会用到该serviceaccount
kubectl create clusterrolebinding ceph-cluster-rule --clusterrole=cluster-admin --serviceaccount=default:persistent-volume-binder

生成ceph-secret

1
2
3
4
5
6
7
8
9
10
11
12
# cat ceph-secret.yml
apiVersion: v1
kind: Secret
metadata:
name: ceph-secret
namespace: default
type: "kubernetes.io/rbd"
data:
key: QVFDWDA2aFo5TG5TQnhBQVl1b0lUL2V3YlRSaEtwVEhPWkxvUlE9PQ= #上面生成的key
# kubectl apply -f ceph-secret.yml

生成rbd-provisioner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# cat ceph-provisioner.yml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: rbd-provisioner
spec:
replicas: 1
template:
metadata:
labels:
app: rbd-provisioner
spec:
containers:
- name: rbd-provisioner
image: "registry.cn-beijing.aliyuncs.com/blackpiglet/rbd-provisioner"
serviceAccountName: persistent-volume-binder #前面创建的serviceaccount
# kubectl apply -f ceph-provisioner.yml

生成ceph-class

用于连接ceph集群,以及卷属性的设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# cat ceph-class.yml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rbd #class名称,后面会用
provisioner: ceph.com/rbd #这里替换成了扩展的provisioner
parameters:
monitors: 172.28.7.98,172.28.7.99,172.28.7.100
adminId: admin #访问用户
adminSecretName: ceph-secret # 秘钥
adminSecretNamespace: default #名称空间
pool: k8s #ceph中的存储池
userId: admin #访问ceph的用户
userSecretName: ceph-secret #访问ceph的秘钥,会自动的解密base64
imageFormat: "2"
imageFeatures: "layering"
# kubectl apply -f ceph-class.yml

生成ceph-pvc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# cat ceph-pvc.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: ceph-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: rbd #前面创建的class名称
resources:
requests:
storage: 10G #卷大小
# kubectl apply -f ceph-pvc.yml ##执行该步骤才会在ceph中真实创建卷
# kubectl get pvc
# kubectl get pv