k8数据持久化之自动创建PV

  

在前两篇实现美丽的数据持久化的流程为:搭建nfs底层存储===反唇ü夥?===反唇≒VC===反唇ǘ辜浴W钪赵布蕴逯腥萜鞯氖迪质莸某志没?/p>   

上述流程中,看似没什么问题,但细想一下,PVC在向光伏申请存储空间的时候,是根据指定的PV名称,访问模式,容量大小来决定具体向哪个PV来申请空间的,如果PV的容量为20 G,定义的访问模式是WRO(只允许以读写的方式挂载到单个节点),而PVC申请的存储空间为10克,那么一旦这个PVC是向上面的PV申请的空间,也就是说,那个PV有10个G的空间被浪费了,因为其只允许被单个节点挂载,就算不考虑这个问题,我们每次手动去创建光伏也就比较麻烦的事情,这时,我们就需要一个自动化的工具来替我们创建PV。

  

这个东西就是阿里提供的一个开源镜像“nfs-client-provisioner”,这个东西是通过k8内置的NFS驱动挂载远端的NFS服务器到本地目录,然后自身作为存储(存储)。

  

当然,PVC是无法直接去向nfs-client-provisioner申请使用的存储空间的,这时,就需要通过SC (storageClass)这个资源对象去申请了,SC的根本作用就是根据PVC定义的值去自动创建PV。

  

下面是一个Nginx基于自动创建光伏实现数据持久化的示例。

  

1,搭建nfs服务

  

为了方便,我这里直接在主上做nfs。

  
 <代码> root@master ~ # yum - y nfs-utils安装
  (root@master ~) # systemctl启用rpcbind
  # mkdir - p/nfsdata root@master lv
  # vim/etc/exports root@master ~/nfsdata * (rw,同步,no_root_squash)
  root@master ~ # systemctl启动nfs服务器
  (root@master ~) # systemctl启用nfs服务器
  root@master ~ # showmount - e
  出口主列表:/nfsdata *  
  

2,创建rbac授权

  

这种自动创建光伏的方式涉及到了rbac授权。

  
 <代码> root@master ~ # vim rbac-rolebind。yaml #创建rbac授权用户,在以下文件必须指定名称空间,哪怕是违约
  
  apiVersion: v1
  :ServiceAccount
  元数据:
  名称:nfs-provisioner
  名称空间:默认
  ---
  apiVersion: rbac.authorization.k8s.io/v1
  :ClusterRole
  元数据:
  名称:nfs-provisioner-runner
  名称空间:默认
  规则:
  - apiGroups: ["]
  资源(“persistentvolumes”):
  动词:[“获得”,“列表”,“看”,“创造”,“删除”)
  - apiGroups: ["]
  资源(“persistentvolumeclaims”):
  动词:[“获得”,“列表”,“看”,“更新”)
  ——apiGroups (“storage.k8s.io”):
  资源(“storageclasses”):
  动词:[“获得”,“列表”,“看”)
  - apiGroups: ["]
  资源(“事件”):
  动词:[“看”,“创造”,“更新”,“补丁”)
  - apiGroups: ["]
  资源:(“服务”、“端点”)
  动词:[“获得”,“创造”,“列表”,“看”,“更新”)
  ——apiGroups(“扩展”):
  资源(“podsecuritypolicies”):
  resourceNames (“nfs-provisioner”):
  动词(“使用”):
  ---
  :ClusterRoleBinding
  apiVersion: rbac.authorization.k8s.io/v1
  元数据:
  名称:run-nfs-provisioner
  主题:
  类型:ServiceAccount
  名称:nfs-provisioner
  名称空间:默认
  roleRef:
  :ClusterRole
  名称:nfs-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
  (root@master ~) # - f rbac-rolebind kubectl适用。yaml #执行yaml文件 
  

3,创建nfs-client-provisioner容器

  
 <代码> root@master ~ # vim nfs-deployment。yaml #编写yaml文件/v1beta1 apiVersion:扩展
  :部署
  元数据:
  名称:nfs-client-provisioner
  名称空间:默认
  规范:
  副本:1 #副本数量为1
  策略:
  类型:重建
  模板:
  元数据:
  标签:
  应用:nfs-client-provisioner
  规范:
  serviceAccount: nfs-provisioner #指定账户
  容器:
  ——名称:nfs-client-provisioner
  图片:registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner #使用的是这个镜像
  volumeMounts:
  ——名称:nfs-client-root
  mountPath:/persistentvolumes #指定容器内的挂载目录
  env:
  ——名称:PROVISIONER_NAME #这是这个容器内置的变量
  价值:ljz-test #这是上面变量的值(名字)
  ——名称:NFS_SERVER #内置变量,用于指定nfs服务的IP
  价值:192.168.20.6
  ——名称:NFS_PATH #内置变量,指定的是nfs共享的目录
  价值:/nfsdata
  卷:#这下面是指定上面挂载到容器内的nfs的路径及IP
  ——名称:nfs-client-root
  nfs:
  服务器:192.168.20.6
  路径:/nfsdata
  (root@master ~) # - f nfs-deployment kubectl适用。yaml #执行yaml文件

k8数据持久化之自动创建PV