kubernetes之配置Pod的PersistentVolume存储

简介

此文讲解如何使用PersistentVolumeClaim配置Pod存储,步骤如下:

  • 作为群集管理员,创建一个由物理存储支持的PersistentVolume。没有将卷与任何Pod相关联。
  • 以开发人员/集群用户的身份创建一个PersistentVolumeClaim,它自动绑定到合适的PersistentVolume
  • 创建一个使用上述PersistentVolumeClaim进行存储的Pod。

备注:此文档参考官方文档,并加以自己的理解。如有误导性的内容,请批评指正。

开始前的准备工作

选择集群中的一个node节点,进入shell,创建/mnt/data目录

# mkdir /mnt/data

进入/mnt/data目录,创建一个index.html的文件

# sudo sh -c "echo 'Hello from Kubernetes storage' > /mnt/data/index.html"

查看文件是否是否创建成功

cat /mnt/data/index.html

输出内容如下

Hello from Kubernetes storage

创建PersistentVolume

创建一个hostPath类型的创建PersistentVolume。Kubernetes支持在集群一个node节点上使用hostPath开发和测试。hostPath类型的PersistentVolume使用node节点上的文件或目录来模拟网络附加存储。

在生产环境中,不要使用hostPath。集群管理员可以用Google Compute Engine persistent diskNFSAmazon Elastic Block Store volume提供的网络存储来代替。集群管理员可以可使用StorageClasses设置dynamic provisioning

创建hostPath类型的PersistentVolume对象,文件问:pv-volume.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

配置文件定义的volumes是集群node节点上的/mnt/data。配置中指定了存储大小为10 gibibytesReadWriteOnce模式,也就意味着在被挂载的单一节点上可读可写。配置中定义的StorageClass namemanual,绑定PersistentVolumeClaim请求到PersistentVolume

# kubectl apply -f /root/k8s-example/volume/pv-volume.yaml

查看PersistentVolume资源详情

# kubectl get pv task-pv-volume -o wide

结果显示PersistentVolumeSTATUSAvailable。说明该PersistentVolume还没有绑定PersistentVolumeClaim

NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE   VOLUMEMODE
task-pv-volume   10Gi       RWO            Retain           Available           manual                  9s    Filesystem

创建PersistentVolumeClaim

接下来创建PersistentVolumeClaim。Pod使用PersistentVolumeClaim请求物理存储。

创建一个PersistentVolumeClaim,该请求的卷至少为3 gibibytes,可以为至少一个节点提供读写访问权限。文件名:pv-claim.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
# kubectl apply -f /root/k8s-example/volume/pv-claim.yaml

查看PersistentVolume的资源详情,

# kubectl get pv task-pv-volume
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS   REASON   AGE
task-pv-volume   10Gi       RWO            Retain           Bound    default/task-pv-claim   manual                  28m

查看PersistentVolumeClaim资源状态

# kubectl get pvc task-pv-claim

输出结果显示PersistentVolumeClaim已绑定PersistentVolumetask-pv-volume

NAME            STATUS   VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE
task-pv-claim   Bound    task-pv-volume   10Gi       RWO            manual

创建Pod

创建Pod,使用PersistentVolumeClaim作为volume。文件名: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
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage
# kubectl apply -f /root/k8s-example/volume/pv-pod.yaml
# kubectl get pod task-pv-pod
NAME          READY   STATUS    RESTARTS   AGE
task-pv-pod   1/1     Running   0          14s

进入task-pv-pod的shell中

kubectl exec -it task-pv-pod -- /bin/bash

在shell中,验证nginx是否正在从hostPath卷提供index.html文件

apt update
apt install curl
curl http://localhost/

输出结果如下:

Hello from Kubernetes storage

如果看到该消息,则说明您已成功将Pod配置为使用来自PersistentVolumeClaim的存储。

清理资源

kubectl delete pod task-pv-pod
kubectl delete pvc task-pv-claim
kubectl delete pv task-pv-volume

在创建/mnt/data目录的node节点上,删除目录

sudo rm /mnt/data/index.html
sudo rmdir /mnt/data
posted @ 2020-01-21 10:32  McSiberiaWolf  阅读(932)  评论(0编辑  收藏  举报