使用本地存储
更新时间:2023-09-12
emptyDir
emptyDir 类型的 Volume 在 Pod 分配到 Node 上时被创建,Kubernetes 会在 Node 上自动分配一个目录,因此无需指定宿主机 Node 上对应的目录文件,这个目录的初始内容为空。
说明
当 Pod 从 Node 上移除时,emptyDir 中的数据会被永久删除。
示例
创建 Pod,该 Pod 指定数据卷为 emptyDir:
apiVersion: v1
kind: Pod
metadata:
name: test-ed
spec:
containers:
- image: nginx
name: test-container
volumeMounts:
- mountPath: /test
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
查看创建的 Pod 详情:
$ kubectl describe pod test-ed
进入 Pod 内部查看挂载效果:
$ kubectl exec -it test-ed -c test-container /bin/sh
hostPath
HostPath 类型则是映射 Node 文件系统中的文件或者目录到 Pod 里。在使用 HostPath 类型的存储卷时,也可以设置 type 字段,支持的类型有文件、目录、File、Socket、CharDevice 和 BlockDevice。
示例
创建 Pod,该 Pod 数据卷指定 HostPath:
apiVersion: v1
kind: Pod
metadata:
name: test-hp
spec:
containers:
- image: nginx
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
#directory location on host
path: /data
Local Volume
Local Volume 允许将 Node 本地的磁盘、分区或者目录作为持久化存储使用。Local Volume 适合应用于数据缓存,应用可以就近访问数据,快速处理,同时还适用于分布式存储系统,如分布式数据库 Cassandra ,分布式文件系统 ceph/gluster。
示例
创建storage class
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-volume
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
说明
其中WaitForFirstConsumer表示PV不要立即绑定PVC,而是直到有Pod需要用PVC的时候才绑定。
静态创建 PV
静态创建一个 5GiB 的 PV;该 PV 使用 node 的 /data/volume 目录(需要手动创建目录):
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-local-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-volume
local:
path: /data/volume
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- HOSTNAME # 替换对应的节点名称
使用 local volume PV
创建 PVC 绑定 local volume 的 PVC,并创建 Pod 使用该 PVC:
- 创建 PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: local-volume
- 创建 Pod
kind: Pod
apiVersion: v1
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: mypvc
- 查看创建的 PV、PVC、Pod。
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
example-local-pv 5Gi RWO Retain Bound default/mypvc local-volume 5s
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mypvc Bound example-local-pv 5Gi RWO local-volume 4m20s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 4m28s
- 向本地的/data/volume写入内容,使用curl查看是否写入成功
$ echo "hello world" > /data/volume/index.html
$ curl 172.19.4.63 #这里替换自己的pod的ip
hello world
注意
删除时注意首先删除创建的pod,随后删除pvc,pv。