Kubernetes 存储卷
为了保证数据的持久性,必须保证数据在外部存储在docker容器中,为了实现数据的持久性存储,在宿主机和容器内做映射,可以保证在容器的生命周期结束,数据依旧可以实现持久性存储。但是在k8s中,由于pod分布在各个不同的节点之上,并不能实现不同节点之间持久性数据的共享,并且,在节点故障时,可能会导致数据的永久性丢失。为此,k8s就引入了外部存储卷的功能.
emptyDir存储卷
emptyDir 在创建pod到指定的node节点上时,他会跟随pod创建,并跟随pod的生命周期,它会初始化为一个空目录,可以挂在一个pod下多个容器下不同目录中,当pod被删除数据也会被删除.
- 创建一个pod并挂在一个emptyDir
编写配置清单
---
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
annotations:
while/created-by: "while"
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
- name: busybox
image: busybox
volumeMounts:
- name: html
mountPath: /data/
command: ['/bin/sh','-c','while true;do echo $(date) >> /data/index.html;sleep 2;done']
volumes:
- name: html
emptyDir: {}
创建
[root@master volume]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-backend-pod-798dc9b584-4ljfd 1/1 Running 2 9d 10.244.1.17 node01 <none> <none>
myapp-backend-pod-798dc9b584-j62cq 1/1 Running 2 9d 10.244.2.17 node02 <none> <none>
myapp-backend-pod-798dc9b584-tpfhj 1/1 Running 2 9d 10.244.2.18 node02 <none> <none>
pod-demo 2/2 Running 0 118m 10.244.1.18 node01 <none> <none>
hostPath存储卷
hostPath宿主机路径,就是把pod所在的宿主机之上的脱离pod中的容器名称空间的之外的宿主机的文件系统的某一目录和pod建立关联关系,在pod删除时,存储数据不会丢失。
创建
编写配置清单
cat vimpod-hostpath-vol.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-hostpath-vol
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
volumes:
- name: html
hostPath:
path: /data/home/
type: DirectoryOrCreate
当删除pod资源时,不影响hostPath的存储,因此hostPath可以实现持久新存储,但是当node节点损坏时,也会导致数据丢失
PV和PVC
- PersistentVolume(PV)是集群中已由管理员配置的一段网络存储。 集群中的资源就像一个节点是一个集群资源。 PV是诸如卷之类的卷插件,但是具有独立于使用PV的任何单个pod的生命周期。 该API对象捕获存储的实现细节,即NFS,iSCSI或云提供商特定的存储系统。
- PersistentVolumeClaim(PVC)是用户存储的请求。PVC的使用逻辑:在pod中定义一个存储卷(该存储卷类型为PVC),定义的时候直接指定大小,pvc必须与对应的pv建立关系,pvc会根据定义去pv申请,而pv是由存储空间创建出来的。pv和pvc是kubernetes抽象出来的一种存储资源。
Kubernetes 支持多种类型的 PersistentVolume,比如 AWS EBS、Ceph、NFS 等,完整列表请参考 https://kubernetes.io/docs/co...
创建PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
path: /data/volumes/pv001
server: 192.168.157.20
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv002
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
path: /data/volumes/pv002
server: 192.168.157.20
accessModes 指定访问模式为 ReadWriteOnce,支持的访问模式有:
- ReadWriteOnce : PV 能以 read-write 模式 mount 到单个节点。
- ReadOnlyMany :PV 能以 read-only 模式 mount 到多个节点。
- ReadWriteMany : PV 能以 read-write 模式 mount 到多个节点.
persistentVolumeReclaimPolicy 指定当 PV 的回收策略为 Recycle,支持的策略有:
- Retain :需要管理员手工回收。
- Recycle: 清除 PV 中的数据,
- Delete :删除 Storage Provider 上的对应存储资源,例如 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。
kubectl apply -f nfs-pv.yaml
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 1Gi RWX Retain Available 3s
pv002 5Gi RWX Retain Available 3s
pv003 10Gi RWX Recycle Available 3s
创建PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc001
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
查看创建好的PVC
kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc001 Bound pv001 1Gi RWX 3s
创建好的PVC挂载到Pod
apiVersion: v1
kind: Pod
metadata:
name: mypod1
spec:
containers:
- name: mypod1
image: busybox
args:
- /bin/sh
- -c
- sleep 30000
volumeMounts:
- name: mydata
mountPath: "/check_data"
volumes:
- name: mydata
persistentVolumeClaim:
claimName: pvc001
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。