简介
本文介绍K8S的持久卷(PersistentVolume)的用法。
目标:用持久卷的方式将主机的磁盘与容器磁盘映射,安装nginx并运行。
官网
https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
概念
Pod 里的容器是由镜像产生的,进程要读写磁盘只能用一个临时的存储空间,一旦 Pod 销毁,临时存储会立即释放,数据也就丢失了。为保证 Pod 销毁后重建数据依然存在,Kubernetes 使用 Volume 存储文件(一般是容器与主机路径进行映射)。
Volume和使用它的Pod都是一种静态绑定关系,无法像创建其他资源(例如Pod,Node,Deployment等等)一样创建一个Volume。因此K8S提出了PersistentVolume(PV),可以用Kubernetes API创建PersistentVolume对象。PV与Volume最大的不同是PV拥有着独立于Pod的生命周期。
PersistentVolumeClaim(PVC)代表了用户对PV资源的请求。用户需要使用PV资源时,只需要创建一个PVC对象(包括指定使用何种存储资源,使用多少GB,以何种模式使用PV等信息),K8S会自动分配我们所需的PV。
如果把PersistentVolume类比成集群中的Node,那么PersistentVolumeClaim就相当于集群中的Pod,Kubernetes为Pod分配可用的Node,为PersistentVolumeClaim分配可用的PersistentVolume。
备注
在本练习中,你将创建一个 hostPath 类型的 PersistentVolume,这种类型的PV用于开发和测试。 hostPath 类型的 PV 使用节点上的文件或目录来模拟网络附加存储。
在生产环境的集群中,不会使用 hostPath。 集群管理员会提供网络存储资源,比如 Google Compute Engine 持久盘卷、NFS 共享卷或 Amazon Elastic Block Store 卷等等。 集群管理员还可以使用 StorageClass 来设置动态制备存储。
准备工作
本文所需的文件如下(mnt是个空文件夹):
下载地址:
创建目录并进入。
mkdir -p /work/devops/k8s/pv/mnt cd /work/devops/k8s/pv/
1.创建 PersistentVolume
创建pv-volume.yaml文件,内容如下:
apiVersion: v1 kind: PersistentVolume metadata: name: task-pv-volume labels: type: local pv-name: task-pv-volume spec: storageClassName: manual capacity: storage: 3Gi accessModes: - ReadWriteOnce hostPath: path: "/work/devops/k8s/pv/mnt"
创建 PersistentVolume
kubectl apply -f pv-volume.yaml
结果
persistentvolume/task-pv-volume created
查看 PersistentVolume 的信息
kubectl get pv task-pv-volume
结果
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE task-pv-volume 3Gi RWO Retain Available manual 6s
输出结果显示该 PersistentVolume 的状态(STATUS)为 Available。 这意味着它还没有被绑定给 PersistentVolumeClaim。
2.创建 PersistentVolumeClaim
创建pv-claim.yaml文件,内容如下:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: task-pv-claim spec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: storage: 1Gi # 可以用label指定pv。不指定则自动绑定 #selector: # matchLabels: # pv-name: task-pv-volume
创建 PersistentVolumeClaim
kubectl apply -f pv-claim.yaml
结果
persistentvolumeclaim/task-pv-claim created
再次查看 PersistentVolume 信息:
kubectl get pv task-pv-volume
结果
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE tast-pv-volume 3Gi RWO Retain Bound default/tast-pv-claim manual 33s
现在输出的 STATUS 为 Bound。
查看 PersistentVolumeClaim:
kubectl get pvc tast-pv-claim
结果
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE task-pv-claim Bound task-pv-volume 3Gi RWO manual 13s
3.创建 Pod
创建pv-pod.yaml文件,内容如下:
apiVersion: v1 kind: Pod metadata: name: task-pv-pod spec: volumes: - name: task-pv-storage persistentVolumeClaim: claimName: task-pv-claim containers: - name: task-pv-container image: nginx:latest ports: - containerPort: 80 name: "nginx-80" volumeMounts: - mountPath: "/usr/share/nginx/html" name: task-pv-storage
创建 Pod:
kubectl apply -f pv-pod.yaml
结果
pod/tast-pv-pod created
查看Pod
kubectl get pods -A
结果(已创建)
4.访问测试
进入到容器内部:
kubectl exec -it tast-pv-pod -- bash
用curl访问nginx:
curl http://localhost/
结果:(访问成功)
<html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.21.5</center> </body> </html>
5.清理
cd /work/devops/k8s/pv kubectl delete -f pv-pod.yaml kubectl delete -f pv-claim.yaml kubectl delete -f pv-volume.yaml
请先
!