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 disk
、NFS
、Amazon 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 gibibytes
、ReadWriteOnce
模式,也就意味着在被挂载的单一节点上可读可写。配置中定义的StorageClass name
为manual
,绑定PersistentVolumeClaim
请求到PersistentVolume
。
# kubectl apply -f /root/k8s-example/volume/pv-volume.yaml
查看PersistentVolume
资源详情
# kubectl get pv task-pv-volume -o wide
结果显示PersistentVolume
的STATUS
为Available
。说明该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
已绑定PersistentVolume
即task-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