赞
踩
容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重新启动。其次,在Pod中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes 中的volume抽象就很好的解决了这些问题。
Kubernetes 中的卷有明确的寿命 —— 与封装它的 Pod 相同。所以,卷的生命比 Pod 中的所有容器都长,当这个容器重启时数据仍然得以保存。当然,当 Pod 不再存在时,卷也将不复存在。也许更重要的是,Kubernetes支持多种类型的卷,Pod 可以同时使用任意数量的卷
本次操作的环境
主机 | 节点 | cpu | 内存 | 硬盘 |
---|---|---|---|---|
192.168.233.140 | master1 | 2 | 4g | 30g |
192.168.233.141 | node1 | 2 | 4g | 30g |
192.168.233.142 | node2 | 2 | 4g | 30g |
192.168.233.143 | harbor仓库 | 2 | 4g | 30g |
当 Pod 被分配给节点时,首先创建emptyDir卷,并且只要该 Pod 在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除 Pod 时,emptyDir中的数据将被永久删除
emptyDir的用法有:
创建pod
nginx-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-volume
spec:
containers:
- name: volume
image: hub.bushro.com/public/nginx:1.16.1
volumeMounts:
- mountPath: /mymount
name: mount-volume
volumes:
- name: mount-volume
emptyDir: {}
mountPath是容器中的目录
启动
[root@k8s-master1 ~]# kubectl apply -f nginx-volume.yaml --record
pod/nginx-volume created
[root@k8s-master1 ~]# kubectl get pod|grep nginx-volume
nginx-volume 1/1 Running 0 5m33s
[root@k8s-master1 ~]# kubectl exec nginx-volume mount|grep mymount
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
/dev/mapper/centos-root on /mymount type xfs (rw,relatime,attr2,inode64,noquota)
如果说这个pod有多个容器,并且挂载的目录都一样。那么就可以共享这个目录了。
hostPath:卷将主机节点的文件系统中的文件或目录挂载到集群中
当pod停止或者被删除是hostPath文件还是会在宿主机中
hostPath的用途如下:
使用案例
apiVersion: v1
kind: Pod
metadata:
name: nginx-host
spec:
containers:
- name: host
image: hub.bushro.com/public/nginx:1.16.1
volumeMounts:
- mountPath: /mymount
name: mount-volume
volumes:
- name: mount-volume
hostPath:
path: /mymount
使用这种卷类型是请注意,因为:
由于使用本地的Volume会有一些限制,比如Pod必须要与Volume在同一台宿主机,宿主机挂了数据就会丢失。所以K8S还提供了真正的持久化存储的技术,将数据挂载到其他专门用于存储数据的服务器上,这样即使宿主机挂了,数据还在。
PersistentVolume是为用户和管理员提供了一个API抽象的细节如何提供如何使用存储。 K8S引入了两个新的API资源:PersistentVolume(PV)、PersistentVolumeClaim(PVC)。
PersistentVolume:是由管理员设置的存储,它是群集的一部分。就像节点是集群中的资源一样,PV在K8S中也是一种资源,但生命周期独立于Pod。封装了底层存储卷实现的细节。它是用来定义或配置存储的资源,市面上有很多可以作为文件服务器的工具,比如NFS、RBD、Cinder等,PV就是帮我们打通了与这些服务器的对接。
PersistentVolumeClaim:PVC是给用户申请存储空间的。 当开发者需要通过PVC去申请存储空间,可以请求特定的空间大小和访问模式,比如他们可以申请是一次读/写或多次只读等。
简单来说,PV定义了一块存储空间,Pod想要申请存储空间,就要通过PVC去申请,PVC通过访问模式与申请的空间大小去匹配PV。
以简单的NFS共享服务器说明
在141节点上安装NFS
[root@k8s-node1 ~]# yum -y install nfs-utils
[root@k8s-node1 ~]# systemctl restart rpcbind
[root@k8s-node1 ~]# systemctl restart nfs-server
[root@k8s-node1 ~]# ifconfig|grep 192
inet 192.168.233.141 netmask 255.255.255.0 broadcast 192.168.233.255
[root@k8s-node1 ~]# vim /etc/exports
写入 /mnt 192.168.233.0/24(rw,sync,no_root_squash)
[root@k8s-node1 ~]# more /etc/exports
/mnt 192.168.233.0/24(rw,sync,no_root_squash)
[root@k8s-node1 ~]# systemctl restart nfs-server
[root@k8s-node1 ~]# showmount -e
Export list for k8s-node1:
/mnt 192.168.233.0/24
mypv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mypv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /mnt
server: 192.168.233.141
[root@k8s-master1 ~]# kubectl apply -f mypv.yaml
persistentvolume/mypv created
[root@k8s-master1 ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
mypv 1Gi RWO Recycle Available nfs 8s
mypvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nfs
[root@k8s-master1 ~]# kubectl apply -f mypvc.yaml --record
persistentvolumeclaim/mypvc created
[root@k8s-master1 ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mypvc Bound mypv 1Gi RWO nfs 5s
nginx-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-host
spec:
containers:
- name: host
image: hub.bushro.com/public/nginx:1.16.1
volumeMounts:
- mountPath: /mymount
name: mount-volume
volumes:
- name: mount-volume
persistentVolumeClaim:
claimName: mypvc
在141的nfs的挂载目录/mnt上面创建一个文件hello
在140里面进去到容器中去查看,发现容器中的/mymount目录下也有了hello这个文件。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。