配置 Pod 以使用 PersistentVolume 作为存储
本文将向你介绍如何配置 Pod 使用 PersistentVolumeClaim 作为存储。 以下是该过程的总结:
- 你作为集群管理员创建由物理存储支持的 PersistentVolume。你不会将该卷与任何 Pod 关联。
- 你现在以开发人员或者集群用户的角色创建一个 PersistentVolumeClaim, 它将自动绑定到合适的 PersistentVolume。
- 你创建一个使用以上 PersistentVolumeClaim 作为存储的 Pod。
k8s在线环境
提供了一个master节点和一个Node节点
在你的节点上创建一个 index.html 文件
打开集群中的某个节点的 Shell。 如何打开 Shell 取决于集群的设置。(保证Pod在Node节点中,这里给出的是单节点)
在该节点的 Shell 中,创建一个 /mnt/data
目录:
mkdir /mnt/data
在 /mnt/data
目录中创建一个 index.html 文件:
sh -c "echo 'Hello from Kubernetes storage' > /mnt/data/index .html"
cat /mnt/data/index.html
Hello from Kubernetes storage
创建 PersistentVolume
在本练习中,你将创建一个 hostPath 类型的 PersistentVolume。 Kubernetes 支持用于在单节点集群上开发和测试的 hostPath 类型的 PersistentVolume。 hostPath 类型的 PersistentVolume 使用节点上的文件或目录来模拟网络附加存储。
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
此配置文件指定卷位于集群节点上的
/mnt/data
路径。 其配置还指定了卷的容量大小为 10 GB,访问模式为ReadWriteOnce
, 这意味着该卷可以被单个节点以读写方式安装。 此配置文件还在 PersistentVolume 中定义了 StorageClass 的名称为manual
。 它将用于将 PersistentVolumeClaim 的请求绑定到此 PersistentVolume。
#查看pv信息
kubectl get pv task-pv-volume
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
task-pv-volume 10Gi RWO Retain Available manual 18s
输出结果显示该 PersistentVolume 的
状态(STATUS)
为Available
。 这意味着它还没有被绑定给 PersistentVolumeClaim。
创建 PersistentVolumeClaim
下一步是创建一个 PersistentVolumeClaim。 Pod 使用 PersistentVolumeClaim 来请求物理存储。 在本练习中,你将创建一个 PersistentVolumeClaim,它请求至少 3 GB 容量的卷, 该卷一次最多可以为一个节点提供读写访问。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: task-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
创建 PersistentVolumeClaim 之后,Kubernetes 控制平面将查找满足申领要求的 PersistentVolume。 如果控制平面找到具有相同 StorageClass 的适当的 PersistentVolume, 则将 PersistentVolumeClaim 绑定到该 PersistentVolume 上。
#查看pv
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 13m
状态更改为Bound,说明已经绑定
创建 Pod
下一步是创建一个使用你的 PersistentVolumeClaim 作为存储卷的 Pod。
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
注意 Pod 的配置文件指定了 PersistentVolumeClaim,但没有指定 PersistentVolume。 对 Pod 而言,PersistentVolumeClaim 就是一个存储卷。
#查看pod
kubectl get pod task-pv-pod
NAME READY STATUS RESTARTS AGE
task-pv-pod 1/1 Running 0 3m19s
打开shell访问Pod中容器
kubectl exec -it task-pv-pod -- /bin/bash
# 一定要在上一步 "kubectl exec" 所返回的 Shell 中执行下面三个命令
apt update
apt install curl
curl http://localhost/
root@task-pv-pod:/# curl http://localhost/
Hello from Kubernetes storage
#尝试在节点上修改内容,查看容器内容是否也被修改
#Node节点修改文件内容
node01 $ echo change something > /mnt/data/index.html
#进入Pod容器内部
controlplane $ kubectl exec -it task-pv-pod -- /bin/bash
root@task-pv-pod:/# curl http://localhost/ #完全同步
change something
清理
删除 Pod、PersistentVolumeClaim 和 PersistentVolume 对象:
kubectl delete pod task-pv-pod
kubectl delete pvc task-pv-claim
kubectl delete pv task-pv-volume
在节点的 Shell 上,删除你所创建的目录和文件:
sudo rm /mnt/data/index.html
sudo rmdir /mnt/data