十二、数据卷与持久卷

1.Volume

• Kubernetes中的Volume提供了在容器中挂载外部存储的能力 
• Pod需要设置卷来源(spec.volume)和挂载点(spec.containers.volumeMounts)两个信息后才可 
以使用相应的Volume
存储类型
本地     (hostPath  emptyDir)
网络     (NFS  Ceph  Glusterfs)
公有云  (AWS  EBS)

(1)emptyDir

临时目录,缓存,随着pod消失而消失 
创建一个空卷,挂载到Pod中的容器。Pod删除该卷也会被删除。 
应用场景:Pod中容器之间数据共享
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: write
    image: centos
    command: ["bash","-c","for i in {1..100};do echo $i >> /data/hello;sleep 1;done"]
    volumeMounts:
    - name: data
      mountPath: /data
  - name: read
    image: centos
    command: ["bash","-c","tail -f /data/hello"]
    volumeMounts:
    - name: data
      mountPath: /data
  volumes:
  - name: data             
emptyDir: {}
#同一个pod中的不同容器共享一个存储卷

(2)hostPath

挂载Node文件系统上文件或者目录到Pod中的容器。 要考虑到pod的生命周期是短暂的,当pod重新生成的时候,也许就会换node节点,这时导致原先的共享目录就无法使用。
应用场景:Pod中容器需要访问宿主机文件
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - /bin/sh
    - -c - sleep 36000
    volumeMounts:
    - name: data
      mountPath: /data
  volumes:
  - name: data
    hostPath:
      path: /tmp
      type: Directory

#Type类型


#在底层主机上创建的文件或目录只能由root写入。您需要在特权Container中以root身份运行您的进程, 或者修改主机上的文件权限以便能够写入hostPath卷

(3)gitRepo

在这里插入图片描述

可以在pod创建的时候把git的代码同步克隆下来,前提是宿主机有git命令,是依赖于宿主机做的,需要注意的是,无论pod中的代码修改或者是git仓库中的代码修改都不会互相影响,也就是说我git仓库代码更新了,pod还保持 刚clone下来的样子,当然这个也可以实现,在pod中来一个辅助容器,实时同步git仓库代码

2.PersistentVolume

(1)部署nfs共享服务器

[root@test ~]# yum install  -y nfs-utils
[root@test ~]# mkdir /www
[root@test ~]# vim /etc/exports
/www   192.168.74.0/24(rw,sync,no_root_squash)
关于nfs的权限可以百度

(2)简单使用nfs共享存储创建pod

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default               #指定命名空间
  labels:
    app: nginx                    #控制器的标签
spec:                             #控制器期望的状态
  replicas: 1                       #指定副本个数
  selector:                        #标签选择器
    matchLabels:                  #逻辑域(可以写多个标签)
      app: nginx
  template:                      #pod模板定义
    metadata:                   #pod的元数据
      labels:             #pod标签一定符合标签选择器,至少符合标签选择器的一个
        app: nginx
    spec:                        #pod的期望的状态
      nodeName: k8s-node1               #指定分配节点
      containers:                 #列表所以下面会有-
      - name: nginx-deployment    #镜像
        image: nginx:1.15
        ports:
        - containerPort: 80
        volumeMounts:                      #数据卷  
        - name: wwwroot                    #名称  可以写多个通过名称来对应
          mountPath: /usr/share/nginx/html    #镜像发布路径
      volumes:
      - name: wwwroot                      #对应上面数据卷名称
        nfs:                               #类型nfs
          server: 192.168.74.233            #nfs对应IP
          path: /www/aa                   #nfs的共享目录路径
          readOnly                      #只读 可以不写默认是读写
      restartPolicy: Always              #重启策略

(3)PV和PVC的概念

官网文档:
https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistent-volumes
PV是不能指定名称空间的,因为PV属于集群级别的资源,同样名称空间(namespace)也是集群级别的资源
PVC可以定义名称空间
Pvc和pv都存储在etcd中
只要pv被pvc绑定着是无法直接删除pvc
Pv和pvc限制大小取决于你底层存储,如果你底层储存可以限制大小,那么他就可以,如果底层存储没有限制大小,比如nfs,他只是一个匹配依据,并没有实际上的大小限制
PersistentVolume(PV):对存储资源创建和使用的抽象,使得存储作为集群中的资源管理 
• 静态 
• 动态 
• PersistentVolumeClaim(PVC):让用户不需要关心具体的Volume实现细节
PVC和PV之间是一 一对应的,但是一个一个pvc可以被多个pod对应,这个要取决于创建PVC的时候是否支持   accessModes

在这里插入图片描述
在这里插入图片描述

(4)PV的创建

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
  labels:                #可以定义标签来让pvc用标签选择器来绑定
    name: my-pv
spec:
  capacity:              #给多大空间
    storage: 5Gi        #单位(E P T G M K m)计算1000   (EI PI TI GI MI KI)计算1024  
  accessModes:         #访问模型是列表那么就可以定义很多种功能
- ReadWriteMany
  persistentVolumeReclaimPolicy: Delete  #设置回收策略
  nfs:
    path: /www/bb
    server: 192.168.74.248

1 accessModes:访问模型

ReadWriteOnce (可以简写RWO)- 卷可以由单个节点以读写方式挂载
ReadOnlyMany (可以简写ROX)- 卷可以由许多节点以只读方式挂载
ReadWriteMany (可以简写RWX)- 卷可以由许多节点以读写方式挂载

2 回收策略设置(Reclaim Policy)

Retain(保留):如果下次还用就可以继续用
Recycle(回收):删除数据 把pv 空闲,可以让其他pvc使用
Delete(删除):pvc没有的时候pv直接删除

(5)PVC以及POD的创建

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default               #指定命名空间
  labels:
    app: nginx                    #控制器的标签
spec:                             #控制器期望的状态
  replicas: 1                       #指定副本个数
  selector:                        #标签选择器
    matchLabels:                  #逻辑域(可以写多个标签)
      app: nginx
  template:                      #pod模板定义
    metadata:                   #pod的元数据
      labels:             #pod标签一定符合标签选择器,至少符合标签选择器的一个
        app: nginx
    spec:                        #pod的期望的状态
      nodeName: k8s-node1               #指定分配节点
      containers:                 #列表所以下面会有-
      - name: nginx-deployment    #镜像
        image: nginx:1.15
        ports:
        - containerPort: 80
        volumeMounts:
        - name: wwwroot
          mountPath: /usr/share/nginx/html
      volumes:
      - name: wwwroot
        persistentVolumeClaim:
          claimName: my-pvc
      restartPolicy: Always              #重启策略
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
  namespace: default  # 跟pod在同一个命名空间
spec:
  selector:             #可以加标签选择器pv和pvc都使用相同标签选择器,对应绑定
    matchLabels:
      name: pv003    
  accessModes:         
    - ReadWriteMany   #必须在pv的accessModes的子集,就是说得能满足pv的
  resources:                       
    requests:           #要求存储空间
      storage: 5Gi      #pv的限制一定要大于或等于才可以绑定

3.PersistentVolume 动态供给

(1)简介

Kubernetes支持持久卷的存储插件: 
https://kubernetes.io/docs/concepts/storage/persistent-volumes/
Kubernetes支持动态供给的存储插件: 
https://kubernetes.io/docs/concepts/storage/storage-classes/
https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/
基于NFS存储实现数据持久化。 
https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy

在这里插入图片描述
Dynamic Provisioning机制工作的核心在于StorageClass的API对象。
StorageClass声明存储插件,用于自动创建PV。
在这里插入图片描述

(2)部署插件

[root@k8s-master nfs]# wget https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/deployment.yaml
[root@k8s-master nfs]# wget https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/rbac.yaml
[root@k8s-master nfs]# wget https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/class.yaml
class.yaml定义存储类
[root@k8s-master nfs]# kubectl create -f rbac.yaml 
[root@k8s-master nfs]# vim deployment.yaml 
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs
            - name: NFS_SERVER
              value: 192.168.74.233        #nfs共享的服务器IP
            - name: NFS_PATH
              value: /www               #nfs共享服务器共享目录
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.74.233        #nfs共享服务器IP
            path: /www                 #nfs共享服务器IP
[root@k8s-master nfs]# kubectl create -f class.yaml 
[root@k8s-master nfs]# kubectl create -f deployment.yaml 
部署前可以修改yaml的命名空间,以及在那个node节点,然后提前导入镜像
查看
[root@k8s-master nfs]# kubectl get storageclass  (简写sc)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default               #指定命名空间
  labels:
    app: nginx                    #控制器的标签
spec:                             #控制器期望的状态
  replicas: 1                       #指定副本个数
  selector:                        #标签选择器
    matchLabels:                  #逻辑域(可以写多个标签)
      app: nginx
  template:                      #pod模板定义
    metadata:                   #pod的元数据
      labels:             #pod标签一定符合标签选择器,至少符合标签选择器的一个
        app: nginx
    spec:                        #pod的期望的状态
      nodeName: k8s-node1               #指定分配节点
      containers:                 #列表所以下面会有-
      - name: nginx-deployment    #镜像
        image: nginx:1.15
        ports:
        - containerPort: 80
        volumeMounts:
        - name: wwwroot
          mountPath: /usr/share/nginx/html
      volumes:
      - name: wwwroot
        persistentVolumeClaim:
          claimName: my-pvc
      restartPolicy: Always              #重启策略
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: managed-nfs-storage #指定存储类sc 直接自动创建pvc并且创建pv
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
存储类的回收机制如果是delete的话pvc被删除对应的pv也会被删除,然后nfs共享的自动创建目录也会删除,数据也随之丢失,所以可以设置回收机制
Pod → pvc → storageclass(简称sc,后端存储)→ pv

猜你喜欢

转载自blog.csdn.net/qq_26489043/article/details/111320615
今日推荐