当前位置:   article > 正文

在K8S中使用PVC持久卷_k8s pvc

k8s pvc

一、系统环境

CentOS Linux release 7.9.2009 (Core)
kubectl-1.20.4-0.x86_64
kubelet-1.20.4-0.x86_64
kubeadm-1.20.4-0.x86_64
kubernetes-cni-0.8.7-0.x86_64

二、k8s架构

master192.168.10.127
node01192.168.10.124
node02192.168.10.125
node03192.168.10.126
nfs192.168.10.143

在这里我使用一台独立的服务器做网络存储存储,具体逻辑:

NFS==>PV==>PVC

三、基本概念

Volumn

由于容器本身是非持久化的,因此需要解决在容器中运行应用程序遇到的一些问题。首先,当容器崩溃时,kubelet将重新启动容器,但是写入容器的文件将会丢失,容器将会以镜像的初始状态重新开始;第二,在通过一个Pod中一起运行的容器,通常需要共享容器之间一些文件。Kubernetes通过卷解决上述的两个问题。

在Docker有卷的概念卷,但Docker中存储卷只是磁盘的或另一个容器中的目录,并没有对其生命周期进行管理。Kubernetes的存储卷有自己的生命周期,它的生命周期与使用的它Pod生命周期一致。因此,相比于在Pod中运行的容器来说,存储卷的存在时间会比的其中的任何容器都长,并且在容器重新启动时会保留数据。当然,当Pod停止存在时,存储卷也将不再存在。在Kubernetes支持多种类型的卷,而Pod可以同时使用各种类型和任意数量的存储卷。在Pod中通过指定下面的字段来使用存储卷:

  • spec.volumes:通过此字段提供指定的存储卷
  • spec.containers.volumeMounts:通过此字段将存储卷挂接到容器中

Persistent Volumn(PV)

PV是系统管理员设置的存储,它是群集的一部分,是一种资源,所以它有独立于Pod的生命周期。
PVC是用户存储的请求。它与Pod相似,Pod消耗节点的CPU和内存资源,PVC则消耗PV资源,可以生命特定的容量大小和访问模式。

PV和PVC遵循如下的生命周期管理

配置

PV有两种配置方式:静态或动态

  • 静态
    管理员创建静态一些PV,它们带有可供集群用户使用的实际存储的细节,它们存在于Kubernetes API中,可用于消费;
  • 动态
    当管理员创建的静态 PV 都不匹配用户的 PersistentVolumeClaim 时,集群可能会尝试动态地为 PVC 创建卷。此配置基于 StorageClasses:PVC 必须请求存储类,并且管理员必须创建并配置该类才能进行动态创建。声明该类为 "" 可以有效地禁用其动态配置。

要启用基于存储级别的动态存储配置,集群管理员需要启用 API server 上的 DefaultStorageClass 准入控制器。例如,通过确保 DefaultStorageClass 位于 API server 组件的 --admission-control 标志,使用逗号分隔的有序值列表中,可以完成此操作。有关 API server 命令行标志的更多信息,请检查 kube-apiserver 文档。

绑定

一旦用户创建或已经创建了具有特定存储量的 PersistentVolumeClaim 以及某些访问模式。Kubernetes控制器会监视到新的 PVC,并寻找匹配的 PV,并将它们绑定在一起。如果为新的 PVC 动态调配 PV,则控制器会始终将该 PV 绑定到 PVC。总之,用户总会得到他们所请求的存储,但是容量可能超出请求的数量。一旦 PV 和 PVC 绑定后,PersistentVolumeClaim 绑定是排他性的,不管它们是如何绑定的。 PVC 跟 PV 绑定是一对一的映射。

如果没有匹配的PV,PVC将无限期地保持未绑定状态。随着匹配PV的可用,PVC将被绑定。例如,配置了许多 50Gi PV的集群将不会匹配请求 100Gi 的PVC。将100Gi PV 添加到群集时,则可以绑定到该 PVC。

使用

Pod 使用PVC作为卷。集群检查PVC以查找绑定的卷并为集群挂载该卷。对于支持多种访问模式的卷,用户指定在使用声明作为容器中的卷时所需的模式(读写、只读)。

用户生命了PVC,并且该PVC是绑定的,则只要用户需要,绑定的 PV 就属于该用户。用户通过在 Pod 的 volume 配置中包含persistentVolumeClaim来调度 Pod 并访问用户声明的 PV。

四、安装NFS服务

1、安装软件,所有机器都需要安装以下软件

#yum -y install nfs-utils rpcbind

2、配置服务

创建共享目录

  1. #mkdir -p /share/
  2. #chmod 777 /share/
  3. #echo "/share 192.168.10.0/24(rw,sync,no_root_squash)" >>/etc/exports

192.168.10.0/24共享目录的客户端ip地址 

(rw,sync) ,其中rw代表拥有读写的权限,sync代表数据同步写入NFS服务器端的硬盘中。也可以用async,async是大数据时使用,是先写到缓存区,再写到磁盘里。

no_root_squash:登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限!这个项目『极不安全』,不建议使用!


root_squash:在登入 NFS 主机使用分享之目录的使用者如果是 root 时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody 那个系统账号的身份。

#查看共享目录

  1. #exportfs -rv
  2. exporting 192.168.10.0/24:/share

3、启动服务

  1. systemctl enable rpcbind
  2. systemctl enable nfs
  3. systemctl enable nfs-lock
  4. systemctl enable nfs-idmap
  5. systemctl start rpcbind
  6. systemctl start nfs
  7. systemctl start nfs-lock
  8. systemctl start nfs-idmap

4、测试nfs目录挂载

登录192.168.10.124,挂载nfs文件系统,成功后就能进入/mnt

  1. #mount -t nfs 192.168.10.143:/share /mnt
  2. #mount -a
  3. #df -hT
  4. 192.168.10.143:/share 47G 2.1G 43G 5% /mnt

五、创建PV和pvc

需要在所有k8s节点安装 nfs 客户端程序,必须在所有节点都安装 nfs 客户端,否则可能会导致 PV 挂载不上的问题。
安装命令如下:

yum -y install  nfs-utils rpcbind

1、创建pv

登录到k8s的master服务器上

pv-nfs.yaml

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: pv-nfs
  5. labels:
  6. type: nfs
  7. spec:
  8. capacity:
  9. storage: 5Gi
  10. accessModes:
  11. - ReadWriteMany
  12. persistentVolumeReclaimPolicy: Recycle
  13. storageClassName: nfs
  14. nfs:
  15. path: "/share"
  16. server: 192.168.10.143 #k8s-nfs matser
  17. readOnly: false

 ##创建pv

  1. #kubectl create -f pv-nfs.yaml
  2. persistentvolume/pv-nfs created

 #查看创建好的pv状态,而此时的状态是Available状态,等pvc建好后,变会变成Bond状态

  1. # kubectl get pv
  2. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  3. pv-nfs 5Gi RWX Recycle Available nfs 92s

2、创建pvc

登录master服务器

pvc-nfs02.yaml

  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4. name: pvc-nfs
  5. spec:
  6. accessModes:
  7. - ReadWriteMany
  8. resources:
  9. requests:
  10. storage: 5Gi
  11. storageClassName: nfs

#创建pvc,创建好pvc后再看pv状态就变成Bound

  1. # kubectl create -f pvc-nfs02.yaml
  2. # kubectl get pvc
  3. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  4. pvc-nfs Bound pv-nfs 5Gi RWX nfs 7s
  5. # kubectl get pv
  6. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  7. pv-nfs 5Gi RWX Recycle Bound default/pvc-nfs nfs 4m11s

六、使用PVC

使用之前的nginx配置文件,进行修改

nginx-pvc-dep.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-pvc-php74
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: nginx-pvc-php74
  9. replicas: 1 # tells deployment to run 2 pods matching the template
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx-pvc-php74
  14. spec:
  15. containers:
  16. - name: nginx-pvc
  17. image: registry-op.test.cn/nginx2:1.14.1
  18. ports:
  19. - containerPort: 80
  20. resources:
  21. requests:
  22. cpu: 100m
  23. memory: 30Mi
  24. limits:
  25. cpu: 100m
  26. memory: 30Mi
  27. volumeMounts:
  28. - mountPath: /etc/nginx/nginx.conf
  29. name: nginx-php74
  30. subPath: nginx.conf
  31. - mountPath: "/var/www/html" ##挂载容器中的目录到pvc nfs中的目录
  32. name: storage ##增加storage
  33. volumes:
  34. - name: nginx-php74
  35. configMap:
  36. name: nginx-php-configmap
  37. items:
  38. - key: nginx_php_conf
  39. path: nginx.conf
  40. - name: storage ##与前面对应
  41. persistentVolumeClaim: ##pvc声明
  42. claimName: pvc-nfs ##创建好的pvc lab name
  43. imagePullSecrets:
  44. - name: registry-op.test.cn

这里使用 nginx 镜像,将容器的 /var/www/html 目录通过 volume 挂载到名为 pvc-nfs 的 PVC 上面

创建好后,可以在存储服务器上的“/share”目录下放一个文件,然后用浏览器访问试一下能否访问到,如果可以说明pvc就正常了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/171361
推荐阅读
相关标签
  

闽ICP备14008679号