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

 

posted @ 2021-11-21 17:16  不会跳舞的胖子  阅读(354)  评论(0编辑  收藏  举报