容器和Pod是短暂的,会被频繁的销毁和创建。容器销毁时,保存在容器内部的文件系统的数据都会被清除。为了持久化保存容器的数据,这就要引入kubernetes volume
Kubernetes Volume
Volume的声明周期独立于容器,Pod中的容器可能被销毁和重建,但Volume被保留。本质上k8s Volume 是一个目录,当Volume被挂载到pod,pod中所有的容器都可以访问这个Volume,k8s volume支持多种backend类型,包括emptyDir、hostPath、GCE Persistent Disk、AWS Elastic Block Store、NFS、Ceph 等。
emptyDir Volume
- 是host上的一个空目录。
- 对于容器来说是持久的,对于pod则不是,pod从节点删除时,Volume的内容也会被删除。如果只是删除容器,Volume不受影响
指定方法 spec: containers: - image: busybox name: xxx volumeMounts: - mountPath: /producer_dir name: shared-volume volumes: //定义一个emptyDir类型的Volume - name: shared-volume emptyDir:{}
特点:
- 方便的为Pod中的容器提供共享存储
- 不具备持久性,Pod销毁,emptyDir随之灰飞烟灭,因为本质是host的一个空目录
- 适合场景:Pod中容器需要临时共享存储空间的场景。
hostPath
将Docker host 文件系统中已经存在的目录mount给Pod的容器。大部分场景不用此类型,这增加了Pod与节点的耦合,限制了Pod的使用。适合需要访问k8s或Docker内部数据的应用则需要使用hostPath。比如kube-apiserver、kube-controller-manager。
查看方式 kubectl edit --namespace=kube-system pod kube-apiserver-k8s-master 可以看到kube-apiserver Pod的配置
volumeMounts:
- mountPath: /etc/kubernetes
name: k8s
volumes:
- hostPath:
path: /etc/kubernetes
如果Pod被销毁了,hostPath对应的目录还是会被保留,Host崩溃的话,hostPath也就无法访问了
外部 Storage Provider
部署在AWS,GCE、Azure等公有云上
apiVersion: v1
kind: Pod
metadata:
name: using-ebs
spec:
containers:
- image: busybox
name: using-ebs
volumeMounts:
- mountPath: /test-ebs
name: ebs-volume
volumes:
- name: ebs-volume
awsElasticBlockStore:
volumeID:<volume-id> //需要再AWS中创建,然后引用
fsType: ext4
---
ceph类型
volumeMounts:
- mountPath: /test-ceph
name: ceph-volume
volumes:
- name: ceph-volume
cephfs:
path:/foo/bar/cephfs //目录会被mount到容器路径test-ceph
monitors:"10.16.154.78:7689"
secretFile: "/etc/ceph/admin/secret"
特点:
- 不依赖于k8s,底层由独立的存储系统管理
- 与k8s集群分离,数据被持久化后,整个k8s都炸了也不会受损
PersistentVolume 和 PersistentVolumeClaim
PersistentVolume(PV) 是外部存储系统中的一块存储空间,由管理员创建和维护。与Volume一样,PV具有持久性,生命周期独立于Pod。
PersistentVolumeClaim(PVC)是对PV的申请(claim),由普通用户创建和维护。需要为Pod分配存储资源时,用户可以创建一个PVC,知名存储资源的容量大小和访问模式等信息,k8s会查找并提供满足条件的PV
k8s支持多种PV,AWS EBS、Ceph、NFS等。
apiVersion: v1
kind: PersistentVolume
metadata:
name: mypv1
spec:
capacity:
storage: 1Gi //指定大小
accessModes:
- ReadWriteOnce // 以read-write模式mount到单个节点,ReadOnlyMany表示PV能以read-only mount到多个节点,ReadWriteMany表示PV能以read-write mount到多个节点
persistentVolumeReclaimPolicy: Recycle //清除pv数据 retain 表示需要管理员手工回收;Delete 表示删除 Storage Provider上的对应存储资源 如AWS EBS,GCE PD
storageClassName: nfs // 指定PV的class 为nfs
nfs:
path: /nfsdata/v1 //指定PV在NFS服务器上对应的目录
server: 192.168.56.105
创建完PV之后就可以被PVC申请了
kind:PersistentVolumeClaim
apiVersion: v1
metadata:
name: mypvc1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nfs
使用 kubectl get pvc 命令就能看到mypvc1 已经 Bound到mypv1.接下来就能在Pod中使用了。
Volumes:
- name: mydata
persistentVolumeClaim:
claimName: mypvc1
回收PV
kubectl delete pvc mypvc1
清除之后就能被其他的PVC申请了,按照之前所述里面建立的文件也会被销毁。如果想保留,回收策略改成Retain。
先创建PV,然后通过PVC申请PV并在Pod中使用,这种方式叫 Static Provision 静态供给。
没有满足PVC条件的PV,会动态创建PV,这叫动态供给(Dynamic Provision),通过StorageClass实现。
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPloicy: Retain
这样就能使用了
kind:PersistentVolumeClaim
apiVersion: v1
metadata:
name: mypvc1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: standard
总结:
1 介绍了k8s支持的几种volume(卷)的类型
2 内部和外部的使用配置方法
3 介绍了PV和PVC的概念和用法。