k8s+ceph实现动态pvc

将现有ceph集群用作k8s动态创建持久性存储

动态pvc

配置步骤
  • 所有节点安装ceph-common
1
2
3
yum install -y ceph-common
# 一般使用ceph-deploy install会安装此软件包
# 需要使用kubelet使用rbd命令map附加rbd创建的image
  • 创建osd pool
1
2
3
4
5
6
7
8
9
10
11
12
ceph osd create pool ${poolname} ${pg_num} ${pgp_num}
pg_num是指定创建的pg的个数,会有一组编号,然后pgp_num就是控制pg到osd的映射分布。一般最好将pgp_num设置成一样。

这里强制选择pg_num和pgp_num,因为ceph集群不能自动计算pg数量。下面有一些官方建议的pg使用数量:
小于5个osd设置pg_num为128
5到10个osd设置pg_num为512
10到50个osd设置pg_num为1024

如果超过50个osd你需要自己明白权衡点,并且能自行计算pg_num的数量
(OSDs * 100)
Total PGs = -------------
pool size
1
2
3
4
5
6
7
8
9
10
# 创建
ceph osd pool create kube 128 128
# 查看
ceph osd pool ls 或者 ceph osd lspools
# 删除
ceph osd pool delete kube 128 128
# 重命名
ceph osd pool rename kube new-name
# 查看使用情况,空间
ceph df
  • 使用扩展存储卷插件
1
2
3
4
5
6
7
8
9
# 由于kube-controller-manager使用容器运行,此容器不包含rbd,因此kube-controller-manager在创建pv时无法调用erbd。
# 要么添加ceph-common到hyperkube image中;要么使用扩展存储卷插件。

git clone https://github.com/kubernetes-incubator/external-storage.git
cd external-storage/ceph/rbd/deploy/
# 提供rbac和no-rbac两种方式,因为我们一般搭建k8s集群都开启了rbac认证,所以裁员rbac方式来创建该deployment
# 此处ClusterRoleBinding 默认绑定 namespace: default,如果要修改为其他 namespace,对应的 storageClass 中的adminSecretNamespace 也需要对应修改

kubectl apply -f rbac/
  • 创建密钥,用于k8s认证
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建osd pool,前面已创建此处可忽略
ceph osd pool create kube 128 128
# 创建k8s访问ceph的用户在ceph的mon或者admin节点
ceph auth get-or-create client.kube mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=kube' -o ceph.client.kube.keyring

# 查看admin和kube的key
# 直接使用kubect create创建就不用base64编码。如果是写在yaml文件里则需要“| base64”编码后的字符串
ceph auth get-key client.admin
ceph auth get-key client.kube
# 创建admin secret
kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" \
--from-literal=key='AQCfPjlfTFHBChAAMU/oht*****igQTg==' \
--namespace=kube-system
# 创建user secret,用于创建pvc访问ceph的secret
kubectl create secret generic ceph-user-secret --type="kubernetes.io/rbd" \
--from-literal=key='AQBZK3VbTN/QOBAAIYi******lunOg==' \
--namespace=ceph
1
2
3
4
5
6
7
8
9
# 或者使用yaml文件创建secret
[root@master liyk]# cat ceph-secret-admin.yaml
apiVersion: v1
kind: Secret
metadata:
name: ceph-secret-admin
type: "kubernetes.io/rbd"
data:
key: QVFDZlBqbGZURkhCQ2hBQU1VL29odHpJ********c9PQ==
1
2
 # 创建k8s访问ceph用户在ceph的mon或者admin节点
ceph auth get-or-create client.kube mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=kube' -o ceph.client.kube.keyring
  • 配置storageclass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@master liyk]# cat rbd-storageClass.yaml 
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: rbd
#provisioner: kubernetes.io/rbd
provisioner: ceph.com/rbd
allowVolumeExpansion: true # 开启pvc扩容
parameters:
monitors: 192.168.100.11:6789
adminId: admin
adminSecretName: ceph-secret-admin
adminSecretNamespace: default
pool: rbd
userId: admin
userSecretName: ceph-secret-admin
fsType: ext4
imageFormat: "2"
imageFeatures: layering
  • 创建pvc
1
2
3
4
5
6
7
8
9
10
11
12
[root@master liyk]# cat rbd-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ceph-rbd-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: rbd
resources:
requests:
storage: 1Gi
  • 查看pvc和自动创建的pv
1
2
3
4
5
6
[root@master liyk]# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pvc-ca6c5df5-d91d-40e5-b481-c4416c4dfc8b 1Gi RWO Delete Bound default/ceph-rbd-pvc rbd 9m43s

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/ceph-rbd-pvc Bound pvc-ca6c5df5-d91d-40e5-b481-c4416c4dfc8b 1Gi RWO rbd 9m44s
-------------本文结束感谢您的阅读-------------
原创技术分享,感谢您的支持。