高级网站开发工程师,做网站的用什么主机好,漳州注册公司,seo指什么熟悉kubernetes volume的同学应该了解#xff0c;kubernetes 对volume的提供支持“静态PV”和“动态PV”两种方式。 静态PV#xff1a;集群管理员创建一些PV#xff0c;之后便可用于PVC消费。 动态PV#xff1a;相比静态PV而言#xff0c;动态PV无需管理员手动创建PVkubernetes 对volume的提供支持“静态PV”和“动态PV”两种方式。 静态PV集群管理员创建一些PV之后便可用于PVC消费。 动态PV相比静态PV而言动态PV无需管理员手动创建PVPV的操作是由一个叫StorageClass的控制器创建。对于Cephfs volume来说截止到kubernetes 1.16版本并没有直接提供Cephfs的StorageClass。 虽然官方并没有直接提供对Cephfs StorageClass的支持但是社区给出了类似的解决方案 external-storage/cephfs后面我们会使用到。
地址https://github.com/kubernetes-incubator/external-storage
1. 静态PV
编辑 Cephfs PV 对象文件 cephfs-pv.yaml
apiVersion: v1kind: PersistentVolumemetadata: name: cephfs-pvspec: capacity: storage: 1Gi accessModes: - ReadWriteMany cephfs: monitors: - 192.168.0.3:6789 user: kube secretRef: name: secret-for-cephfs readOnly: false persistentVolumeReclaimPolicy: Recycle
创建 PV:$ kubectl create -f cephfs-pv.yaml -n cephfs
$ kubectl get pv -n cephfs
创建PVC
$ vim cephfs-pv-claim.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata: name: cephfs-pv-claim namespace: cephfs spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi
在 deployment 中使用 PV:
apiVersion: apps/v1kind: Deploymentmetadata: name: cephfs-pvc namespace: cephfsspec: replicas: 2 template: metadata: labels: app: cephfs-pvc spec: containers: - name: nginx image: busybox:latest volumeMounts: - name: cephfs-pv mountPath: /data/cephfs readOnly: false volumes: - name: cephfs persistentVolumeClaim: claimName: cephfs-pv-claim
这样在同一个deployment中的2个pod容器内都可以读写同一个cephfs volume了。
2. 动态PV
对于规模不大的容器平台而言静态PV方式就可以满足需求但是当容器规模很大时你不知道用户什么时候创建PV因此动态PV方式就非常有用了。下面我们看下如何基于 external-storage/cephfs 来实现动态PV。 部署 cephfs-provisioner
cephfs-provisioner 是 kubernetes 官方社区提供的Cephfs的StorageClass支持。用于动态的调用后端存储Cephfs创建PV。
cephfs-provisoner 的实现机制如图所示 它主要是包含两部分 cephfs-provisoner.go
是cephfs-provisonercephfs的StorageClass的核心主要是 watch kubernetes中 PVC 资源的CURD事件然后以命令行方式调用 cephfs_provisor.py脚本创建PV。 cephfs_provisoner.py
python 脚本实现的与cephfs交互的命令行工具。cephfs-provisoner 对cephfs端volume的创建都是通过该脚本实现。里面封装了volume的增删改查等功能。
创建 StorageClass
$ kubectl create -f class.yaml$ kubectl get sc -n cephfsNAME PROVISIONER AGEcephfs ceph.com/cephfs 33d
基于RBAC授权方式启动cephfs-provisioner
$ kubectl create -f *$ kubectl get deploy -n cephfs
这样动态创建PV的环境就准备好了。 动态PV方式无需再手动创建PV只需创建PVCcephfs-provisoner会自动的为该PVC在后端cephfs存储上创建对应的PV。
kind: PersistentVolumeClaimapiVersion: v1metadata: name: pvc-1 annotations: volume.beta.kubernetes.io/storage-class: cephfsspec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi
此时我们创建PVC后会看到同时会自动创建并绑定上一个PV。 至此基于 cephfs 的动态PV方式就介绍完了。 cephfs-provisoner的坑 在使用 cephfs-provisoner 与公司 cephfs 对接的时候遇到了一些坑在这里一并说一下。 路径问题 在 cephfs_provisioner/ cephfs_provisioner.py 的实现中默认在cephfs中创建的根目录名是”kubernetes“所有后续创建的卷都在cephfs端的 /kubernetes/ 一级目录下 代码实现中以VOlUME_GROUPkubernetes定义。因此如果你不想在 cephfs 中以该名字命名需要修改VOLUME_GROUP值。 另外它的二级目录也是固定的为/kubernetes/volumes二级目录是python-cephfs模块中由DEFAULT_VOL_PREFIX变量定义POOL_PREFIX fsvolume_
DEFAULT_VOL_PREFIX /volumes
DEFAULT_NS_PREFIX fsvolumens_
因此要定制化在cephfs端的一级和二级目录需要修改这两个地方。 权限问题
这里遇到两个权限问题 挂载权限问题
默认python-cephfs模块在连接cephfs挂载时是mount的根目录”/“。 而根目录只有admin用户才有权限进行挂载所以这个地方除了admin用户外没办法使用其它用户。但是我们在使用cephfs时为了安全管理员是不会给我们admin用户使用的所以这个地方肯定是接受不了的。为此我们定制修改了libcephfs2和python-cephfs的源码增加了connect_with_path方法允许指定挂载的目录这样我们只要在挂载时不使用根目录即可。 2. 读写权限问题
在 cephfs_provisoner.py 的实现中默认添加了对 cephfs namespace的支持因此在对volume授权时会添加对namespace 相关的权限设置。因为我们使用的ceph版本luminous没有对namespace进行支持所以在使用时产生了创建的volume挂载到pod内后没有读写权限input/output error的问题。此时你在cephfs端查看卷的读写权限时你可以看到目录读写权限都是问号。于是我们修改了这部分逻辑去掉了 namespace 相关的部分。