k8s-存储卷
存储卷
Why:数据与镜像解耦,以及容器间的数据共享;
What:k8s抽象出的一个对象,用来保存数据,做存储用。
常用的集中卷:
emptyDir:本地临时卷(容器内部)–当容器删除,数据永久删除。
hostPath:本地卷(宿主机)–将宿主机节点的文件或目录挂载到集群中,pod删除,卷不会删除。
nfs:共享卷
configmap:配置中心
PV/PVC
挂载基础容器的TCP/IP协议栈,文件目录等。
k8s.gcr.io/pause 基础容器
使用临时存储 empryDir 映射到宿主机实现挂载
#apiVersion: extensions/v1beta1 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: linux40 spec: replicas: 1 selector: matchLabels: #rs or deployment app: ng-deploy-80 template: metadata: labels: app: ng-deploy-80 spec: containers: - name: ng-deploy-80 image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80 volumeMounts: - mountPath: /cache name: cache-volume //选择将volumes的卷挂载到容器的/cache目录下 volumes: - name: cache-volume emptyDir: {}
查看容器映射宿主机挂载的目录
]# find / -name 1.txt
/var/lib/kubelet/pods/d0c1f2b7-adbc-4763-a5bd-7db6cc116142/volumes/kubernetes.io~empty-dir/cache-volume/1.txt
进入pod内第一个容器
写数据进入容器内目录文件
进入第二个容器,可以看到第二个容器已经同步数据
使用hostPath挂在到容器
#apiVersion: extensions/v1beta1 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: linux40 spec: replicas: 1 selector: matchLabels: app: ng-deploy-80 template: metadata: labels: app: ng-deploy-80 spec: containers: - name: ng-deploy-80 image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80 volumeMounts: - mountPath: /data/mysql //挂载容器的目录路径 name: data-volume //选择挂载哪个名称 volumes: - name: data-volume hostPath: //卷类型 path: /data/mysql //可以预先创建,也可以不用创建
查看容器运行的节点,去对应节点查看
]# kubectl get pods -A -o wide ]# echo "hello world" > /data/mysql/index.html
在容器查看数据是否已经同步
]# kubectl exec -it nginx-deployment-758f46d4fb-vzkn7 -n linux40 /bin/sh # cat /data/mysql/index.html hello world
使用网络共享存储NFS挂载
#apiVersion: extensions/v1beta1 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: linux40 spec: replicas: 1 selector: matchLabels: app: ng-deploy-80 template: metadata: labels: app: ng-deploy-80 spec: containers: - name: ng-deploy-80 image: nginx ports: - containerPort: 80 volumeMounts: - mountPath: /usr/share/nginx/html name: linux40-nfs1-volume - mountPath: /usr/share/nginx/html/data name: linux40-nfs2-volume volumes: - name: linux40-nfs1-volume nfs: server: 192.168.64.110 //NFS权限确保允许pod和node节点的网段挂载 path: /root/data/nfs1 - name: linux40-nfs2-volume nfs: server: 192.168.64.110 path: /root/data/nfs2 --- apiVersion: v1 kind: Service metadata: name: ng-deploy-80 namespace: linux40 spec: ports: - name: http port: 81 targetPort: 80 nodePort: 30016 protocol: TCP type: NodePort selector: app: ng-deploy-80
查看pod挂载
]# kubectl exec -it nginx-deployment-6bc6445496-vh8qh -n linux40 /bin/bash root@nginx-deployment-6bc6445496-vh8qh:/# df -hT Filesystem Type Size Used Avail Use% Mounted on overlay overlay 46G 2.7G 43G 6% / tmpfs tmpfs 64M 0 64M 0% /dev tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/mapper/centos-root xfs 46G 2.7G 43G 6% /etc/hosts shm tmpfs 64M 0 64M 0% /dev/shm 192.168.64.110:/root/data/nfs1 nfs4 50G 3.4G 47G 7% /usr/share/nginx/html tmpfs tmpfs 1.9G 12K 1.9G 1% /run/secrets/kubernetes.io/serviceaccount 192.168.64.110:/root/data/nfs2 nfs4 50G 3.4G 47G 7% /usr/share/nginx/html/data tmpfs tmpfs 1.9G 0 1.9G 0% /proc/acpi tmpfs tmpfs 1.9G 0 1.9G 0% /proc/scsi tmpfs tmpfs 1.9G 0 1.9G 0% /sys/firmware
可以实现同一个NFS挂载多个pod,也可以一个pod挂载多个NFS
PV和PVC
参考文档 https://www.cnblogs.com/dengbingbing/p/10399207.html
PersistentVolume(PV)是集群中由管理员配置的一段网络存储。 它是集群中的资源,就像节点是集群资源一样。 PV是容量插件,如Volumes,但其生命周期独立于使用PV的任何单个pod。 此API对象捕获存储实现的详细信息,包括NFS,iSCSI或特定于云提供程序的存储系统。
PersistentVolumeClaim(PVC)是由用户进行存储的请求。 它类似于pod。 Pod消耗节点资源,PVC消耗PV资源。Pod可以请求特定级别的资源(CPU和内存)。声明可以请求特定的大小和访问模式(例如,可以一次读/写或多次只读)。
PVC和PV是一一对应的,当一个PVC与PV绑定后,不能再被其他PVC绑定。但一个PVC可以被多个Pod所使用。
PV是群集中的资源。PVC是对这些资源的请求,并且还充当对资源的检查。PV和PVC之间的相互作用遵循以下生命周期:
Provisioning ——-> Binding ——–>Using——>Releasing——>Recycling
供应准备Provisioning—通过集群外的存储系统或者云平台来提供存储持久化支持。
静态提供Static:集群管理员创建多个PV。 它们携带可供集群用户使用的真实存储的详细信息。 它们存在于Kubernetes API中,可用于消费
动态提供Dynamic:当管理员创建的静态PV都不匹配用户的PersistentVolumeClaim时,集群可能会尝试为PVC动态配置卷。 此配置基于StorageClasses:PVC必须请求一个类,并且管理员必须已创建并配置该类才能进行动态配置。 要求该类的声明有效地为自己禁用动态配置。
绑定Binding—用户创建pvc并指定需要的资源和访问模式。在找到可用pv之前,pvc会保持未绑定状态。
使用Using—用户可在pod中像volume一样使用pvc。
释放Releasing—用户删除pvc来回收存储资源,pv将变成“released”状态。由于还保留着之前的数据,这些数据需要根据不同的策略来处理,否则这些存储资源无法被其他pvc使用。
回收Recycling—pv可以设置三种回收策略:保留(Retain),回收(Recycle)和删除(Delete)。
保留策略:允许人工处理保留的数据。
删除策略:将删除pv和外部关联的存储资源,需要插件支持。
回收策略:将执行清除操作,之后可以被新的pvc使用,需要插件支持。
注:目前只有NFS和HostPath类型卷支持回收策略,AWS EBS,GCE PD,Azure Disk和Cinder支持删除(Delete)策略。
定义NFS类型的PV
各个共享存储支持类型不一致,需注意
ReadWriteOnce //单路只读
ReadOnlyMany //多路只读
ReadWriteMany //多路读写
定义PV回收策略
回收Recycling—pv可以设置三种回收策略:保留(Retain),回收(Recycle)和删除(Delete)。
默认为保留(Retain)
PVC并不存储在节点,而是存储在ETCD中,所以当节点故障,数据并不会丢失。
一旦PV与PVC绑定,PV不支持删除,防止误删。
定义PVC
可以看到系统已自动匹配到最合适的PV与PVC绑定,该PV状态已变为Bound
查看PVC详情
PV、PVC、configmap、secret
StorageClass
将众多的尚未做成PV的共享存储空间进行分类,可根据任何维度进行分类、 I/O性能、存储类型等,PS:NFS、ceph、 本地/云端
当PVC再去申请PV的时候,不针对某个PV去关联,而是针对存储类进行申请创建PV;
存储系统必须支持restful 风格的API接口
工作流程,逻辑 PV PVC 存储类
在ceph存储集群前定义restful 风格的API接口,用户可以通过API直接请求,在存储空间刚好划分出符合PVC大小的的分区
编辑/etc/expose 文件,把这个分区挂载到本地的某个目录上,并expose
创建PVC绑定到这个PV