volume存储

volume技术是为了实现kubernetes Pod中多个容器访问的共享目录。volume被定义在pod上,他和pod的生命周期一样,只要pod还在他就在,但是pod里面的容器停止和重启时一般不会影响volume中的数据。
根据需不需要指定目录主要有emptyDirhostPath两种。

1.emptyDir类型
emptyDir类型的volume在pod分配到node上时被创建,不用指定目录,但是实际还是有的,由自动分配的

新建一个两个容器共享一个数据卷的deployment

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: emptydir-deployment-test #这个pod的名字
  labels:
  namespace: space01  #声明一个新的命名空间
spec:
  replicas: 1
  selector:
    matchLabels:
      edtestk: edtestv
  template:
    metadata:
      labels:
        edtestk: edtestv
    spec:
      volumes: #和containerst同级
        - name: emptydir-volume
          emptyDir: {}
      containers:
        - name: redis01 #容器名
          image: redis  #镜像名字
          volumeMounts:
            - name: emptydir-volume
              mountPath: /lqh-empty-dir  #容器内挂载的目录
          imagePullPolicy: IfNotPresent

        - name: nginx01  #容器名
          image: nginx  #镜像名字
          volumeMounts:
            - name: emptydir-volume
              mountPath: /lqh-empty-dir  #容器内挂载的目录
          imagePullPolicy: IfNotPresent

2.hostpath类型
需要制定本地node的目录,master节点新建Pod时如果本地没有这个目录会报错。这也是他的缺点,无法知道新建pod会被指派到哪个node,要所有node都要新建这个目录。

新建一个两个容器共享/nodepath这个目录的deployment

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hostpath-deployment-test #这个pod的名字
  labels:
  namespace: space01  #声明一个新的命名空间
spec:
  replicas: 1
  selector:
    matchLabels:
      edtestk: edtestv
  template:
    metadata:
      labels:
        edtestk: edtestv
    spec:
      volumes: #和containerst同级
        - name: hostpath-volume
          hostPath:
            path: /nodepath  #确保node节点有这个目录,不然新建pod报错
            type: Directory
      containers:
        - name: redis01 #容器名
          image: redis  #镜像名字
          volumeMounts:
            - name: hostpath-volume
              mountPath: /lqh-hostpath  #容器内挂载的目录
          imagePullPolicy: IfNotPresent

        - name: nginx01  #容器名
          image: nginx  #镜像名字
          volumeMounts:
            - name: hostpath-volume
              mountPath: /lqh-hostpath  #容器内挂载的目录
          imagePullPolicy: IfNotPresent

注意:把这个deployment的pod删除了,node目录下的内容还在,deployment新建的pod也会同步到这个目录,删除这个deployment这个node的目录还在

PersistentVolumeClaim(PVC)存储
PVC实际就是实现可以把pod容器里面的目录挂载到其他集群以外的机器上
PV 是Volume之类的卷插件,但具有独立于使用 PV的Pod 的生命周期。此API对象包含存储实现的细节,即 NFS、iSCSI 或特定于云供应商的存储系统。

PersistentVolume 类型以插件形式实现。Kubernetes 目前支持很多插件类型,以nfs为例。

新建多个pv和pvc,pod资源清单指定pvc,由pvc给pod匹配合适的pv挂载到pod的容器中,这种很解耦。

pvc在匹配的规则有:accessModes和storageClassName;pv的这两个属性和pod资源清单相同就可以被匹配挂载.
pv状态:
卷可以处于以下的某种状态:
Available(可用)——一块空闲资源还没有被任何声明绑定
Bound(已绑定)——卷已经被声明绑定
Released(已释放)——声明被删除,但是资源还未被集群重新声明
Failed(失败)——该卷的自动回收失败
新建三个pv的资源清单:

注意:pvc和pv的accessModes和storageClassName一定要保持一致,这两个还是必填,不一致pvc新建会报找不到pv
四者关系大致如下:

 创建pv

apiVersion: v1
kind: PersistentVolume  #k8s资源类型,PersistentVolume资源
metadata:                #资源的元数据语句块,是针对kind对应资源的全局属性
  name: pv001             #自定义名称pv001
  namespace: space01
spec:                        #规格语句块
  capacity:                   #PV的存储空间语句块
    storage: 10M             #PV的具体存储空间大小,Mi表示1024进制
  volumeMode: Filesystem        #卷模式,有两种,Filesystem(文件系统),Block(块)
  accessModes: ["ReadWriteOnce"] #访问模式,有三种,ReadWriteOnce(该卷可以被单个节点以读/写模式挂载),ReadOnlyMany,ReadWriteMany
  persistentVolumeReclaimPolicy: Retain #回收策略,有三种,Retain,Recycle,Delete
  storageClassName: "lqhnfs"
  nfs:                                  #NFS文件系统配置语句块
    path: /root/nfs        #在NFS文件系统上创建的共享文件目录
    server: 10.211.55.3
---
apiVersion: v1
kind: PersistentVolume  #k8s资源类型,PersistentVolume资源
metadata:                #资源的元数据语句块,是针对kind对应资源的全局属性
  name: pv002             #自定义名称pv001
  namespace: space01
spec:                        #规格语句块
  capacity:                   #PV的存储空间语句块
    storage: 10M             #PV的具体存储空间大小,Mi表示1024进制
  volumeMode: Filesystem        #卷模式,有两种,Filesystem(文件系统),Block(块)
  accessModes: ["ReadWriteOnce"] #访问模式,有三种,ReadWriteOnce(该卷可以被单个节点以读/写模式挂载),ReadOnlyMany,ReadWriteMany
  persistentVolumeReclaimPolicy: Retain #回收策略,有三种,Retain,Recycle,Delete
  storageClassName: "lqhnfs"
  nfs:                                  #NFS文件系统配置语句块
    path: /root/nfs        #在NFS文件系统上创建的共享文件目录
    server: 10.211.55.3
---
apiVersion: v1
kind: PersistentVolume  #k8s资源类型,PersistentVolume资源
metadata:                #资源的元数据语句块,是针对kind对应资源的全局属性
  name: pv003             #自定义名称pv001
  namespace: space01
spec:                        #规格语句块
  capacity:                   #PV的存储空间语句块
    storage: 10M             #PV的具体存储空间大小,Mi表示1024进制
  volumeMode: Filesystem        #卷模式,有两种,Filesystem(文件系统),Block(块)
  accessModes: ["ReadWriteOnce"] #访问模式,有三种,ReadWriteOnce(该卷可以被单个节点以读/写模式挂载),ReadOnlyMany,ReadWriteMany
  persistentVolumeReclaimPolicy: Retain #回收策略,有三种,Retain,Recycle,Delete
  storageClassName: "lqhnfs"
  nfs:                                  #NFS文件系统配置语句块
    path: /root/nfs/v3        #在NFS文件系统上创建的共享文件目录
    server: 10.211.55.3

创建pvc

apiVersion: v1                    #指定的api版本,要符合kubectl apiVersion规定,v1是稳定版本
kind: PersistentVolumeClaim       #k8s资源类型,PersistentVolumeClaim资源,
metadata:                         #资源的元数据语句块,是针对kind对应资源的全局属性元数据块
  name: lqh-pvc1                  #PVC名称,自定义
  namespace: space01
spec:                             #规格语句块
  accessModes: ["ReadWriteOnce"]  #访问模式 
  resources:                      #访问模式下的资源语句块
    requests:                     #请求语句块
      storage: 25Mi               #请求存储空间
  storageClassName: "lqhnfs"

创建pod,并挂在pvc

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: pvc-deployment-test #这个pod的名字
  labels:
  namespace: space01  #声明一个新的命名空间

spec:
  replicas: 1
  selector:
    matchLabels:
      pvc1k: pvc1v
  template:
    metadata:
      labels:
        pvc1k: pvc1v
    spec:
      volumes: #和containerst同级
        - name: pvc1  #这个pod的数据卷名字
          persistentVolumeClaim: #指定pvc
            claimName: lqh-pvc1  #pvc名字
      containers:
        - name: redis01 #容器名
          image: redis  #镜像名字
          volumeMounts:
            - name: pvc1
              mountPath: /lqh-nfspvs1  #容器内挂载的目录
          imagePullPolicy: IfNotPresent

        - name: nginx01  #容器名
          image: nginx  #镜像名字
          volumeMounts:
            - name: pvc1
              mountPath: /usr/share/nginx/html/  #容器内挂载的目录
          imagePullPolicy: IfNotPresent

对这个deployment进行扩容后的pod还是按照资源清单绑定到这个lqh-pvc1这个pvc,这个pvc只绑定这个pv001这个pv,不会变,所有就多个pod绑在一个pv下

 

posted @ 2024-03-22 14:32  羊脂玉净瓶  阅读(8)  评论(0)    收藏  举报