使用本地存储
EmptyDir
概述
emptyDir 类型的 Volume 在 Pod 分配到 Node 上时被创建,Kubernetes 会在 Node 上自动分配一个目录,因此无需指定宿主机 Node 上对应的目录文件,这个目录的初始内容为空。
当 Pod 从 Node 上移除时,emptyDir 中的数据会被永久删除。
使用 kubectl create -f testemptyDir.yaml
创建一个 Pod,该 Pod 使用 EmptyDir,testemptyDir.yaml 如下所示:
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。
使用 kubectl create -f testhostPath.yaml
创建一个 Pod,该 Pod 使用 HostPath,testhostPath.yaml 如下所示:
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。
目前 Kubernetes 对于 Local PV 的一些支持情况:
- Kubernetes v1.7: 正式引入 Local PV;
- Kubernetes v1.10: Local PV 进入 Beta;
- Kubernetes v1.14: Local PV 进入 GA
创建storage class
kubectl create -f local-volume.yaml
,local-volume.yaml 内容如下:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-volume
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
其中WaitForFirstConsumer表示PV不要立即绑定PVC,而是直到有Pod需要用PVC的时候才绑定。
静态创建 PV
通过 kubectl create -f local-volume-pv.yaml
,静态创建一个 5GiB 的 PV;该 PV 使用 node 的 /data/volume 目录(需要手动创建目录)
local-volume-pv.yaml 内容如下:
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
通过kubectl get nodes 获得node_name替换上面的HOSTNAME字段。
$ kubectl get pv example-local-pv
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
example-local-pv 5Gi RWO Retain Bound default/myclaim local-volume 5s
使用 local volume PV
创建一个关联 local-volume的PVC,并创建一个pod使用该pvc,kubectl create -f local-volume-pvc.yaml
。
local-volume-pvc.yaml内容如下:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: local-volume
---
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。