在前两篇实现美丽的数据持久化的流程为:搭建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