所有分类
  • 所有分类
  • 未分类

K8S-持久卷(PersistentVolume)的用法

简介

本文介绍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

0

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录