Kubernetes入门(五)k8s的卷与挂载关系
卷k8s的卷是pod的一个组成部分,和pod共享相同的生命周期,pod的新老容器都可以识别/使用卷的内容卷用于实现容器间的数据共享卷类型emptyDir—用于存储临时数据的简单空目录hostPath—用于将目录从工作节点的文件系统挂载到pod中gitRepo—通过检查git仓库的内容来初始化卷nfs—挂载到pod的NFS共享卷gcePersistentDisk(谷歌高性能存储磁盘卷)、awsEla
卷
k8s的卷是pod的一个组成部分,和pod共享相同的生命周期,pod的新老容器都可以识别/使用卷的内容
卷用于实现容器间的数据共享
卷类型
- emptyDir—用于存储临时数据的简单空目录,可以指定存储介质为内存
piVersion: v1
kind: Pod
metadata:
name: fortune
spec:
containers:
- image: xxx
name: xxx
volumeMounts:
- name: xxxx
mountPath: /data/db
volumes:
- name: xx
emptyDir: {}
-
hostPath
-
用于将目录从工作节点的文件系统挂载到pod中
节点目录用于挂载(适用于系统级别的pod,通常是DaemonSet管理),不适用于持久化存储,也不能跨节点使用 -
gitRepo
gitRepo—通过检查git仓库的内容来初始化卷(实质也是一个emptyDir,只不过预置了git仓库内容)
每次pod重新创建时,会自动拉取最新代码
-
nfs—挂载到pod的NFS共享卷
-
- cinder、cephfs、iscsi、flocker、glusterfs、quobyte、rbd、flexVolume、vsphere-Volume、photonPersistentDisk、scaleIO—用于挂载其他类型的网络存储
-
persistentVolumClaim—一种使用预置或动态配置的持久存储类型
-
configMap、secret、downwardAPI—用于将k8s部分资源和集群信息公开给pod的特殊类型卷
持久化卷
需要满足以下两点:
①数据需要写到硬盘上
②不同节点间需要能共享数据
- gcePersistentDisk(谷歌高性能存储磁盘卷)、awsElasticBlockStore(Amazon服务弹性块存储卷)、azureDisk(微软Azure磁盘卷)—用于挂载云服务提供的特定存储类型
举例:创建一个MongoDB容器,该容器的数据必须持久化保存在磁盘上
gcloud container clusters list #查看集群所在区域
gcloud computer disks create --size=1GiB --zone=xxxx mongodb #创建1G的持久磁盘
创建一个使用GCE永久磁盘的pod
apiVersion: v1
kind: Pod
metadata:
name: mongodb
spec:
volumes:
- name: mongodb-data
gcePersistentDisk:
pdName: mongodb
fsType: ext4
containers:
- image: mondb
name: mongodb
volumeMounts:
- name: mongodb-data
mountPath: /data/db
ports:
- containerPort: 27017
protocol: TCP
持久卷和持久卷声明(PVC)
主要目的:从底层存储技术上解耦pod,无须向pod里添加卷,而是由集群管理员设置底层存储,然后通过k8s API服务器创建持久卷并注册,在创建持久卷时可以指定卷的大小和支持的访问模式。
- 1、创建持久卷
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce #仅允许单个节点挂载读写
- ReadOnlyMany #允许多个节点挂载只读
- ReadWriteMany #允许多个节点挂载读写
persistentVolumeReclaimPolicy: Retain #声明释放掉后,卷被保留,不删除
gcePersistenDisk:
pdNmae: mongodb
fsType: ext4
注意最后那部分,与在pod中引用GCE持久磁盘完全相同
使用kubectl create创建后,可以看到持久卷了。
注意,持久卷不属于任何命名空间,它与节点一样,是集群层面的东西
kubectl get pv
- 2、创建持久卷声明(用于获取持久卷)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mongodb-pvc
spec:
resources:
requests:
storage: 1Gi
accessModes:
- ReadWriteOnce
storageClassName: "" #该参数,后面会提到,不希望置备程序干预(使其获得动态配置的持久卷)
当创建好持久卷声明后,k8s会自动找合适的持久卷并将其绑定到持久卷声明,持久卷的容量必须足够大且满足声明的需求大小,并且卷的访问访问须包含声明中指定的访问模式
kubectl get pvc #查看持久卷声明
- 3、在pod中使用持久卷声明
apiVersion: v1
kind: Pod
metadata:
name: mongodb
spec:
containers:
- image: mongo
name: mongodb
volumeMounts:
- name: mongodb-data
mountPath: /data/db
ports:
- containerPort: 27017
protocol: TCP
volumes:
- name: mongodb-data
persistentVolumeClaim:#在pod卷中通过名称引用持久卷声明
claimName: mongodb-pvc
- 4、卷的回收
两种回收模式,通过设置persistentVolumeReclaimPolicy参数
①Recycle
删除卷的内容,并使卷可以被再次声明,这种方式可以使得持久卷被不同的持久卷声明和pod反复使用
②Delete
删除底层存储
③Retain
持久卷声明释放后,扔保留卷和卷的数据
持久卷的动态卷配置
主要目的:持久卷和持久卷声明可以获得持久化的存储资源,但需要一个集群管理员来支持实际的存储。进一步的,k8s支持动态配置存储卷来自动执行此任务
与管理预先准备持久卷不同,仅需要定义一个或多个StorageClass,并允许系统在每次通过持久卷声明请求时创建一个新的持久卷
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/gce-pd #指定配置插件
parameters:
type: pd-ssd
zone: europe-west1-b
StorageClass资源指定持久卷声明请求此StorageClass时,应该使用哪种置备程序来提高持久卷,StorageClass将定义的参数传递给置备程序,并具体到每个提供者插件。
创建StorageClass后,此时用户可以在持久卷声明中安名字引用存储类
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mongodb-pvc
spec:
StorageClassNmae: fast
resources:
requests:
storage: 300Mi
accessModes:
- ReadWriteOnce
注意:动态配置的持久卷的回收策略是Delete,也即当持久卷声明被删除时,持久卷也被删除
更多推荐
所有评论(0)