美文网首页
kubernetes资源对象之Volume

kubernetes资源对象之Volume

作者: 一舍 | 来源:发表于2020-03-27 15:03 被阅读0次

    Kubernetes 抽象出 volume对象对pod的数据进行持久化存储。

    目前,Kubernetes 支持以下 Volume 类型:

    • awsElasticBlockStore
    • azureDisk
    • azureFile
    • cephfs
    • cinder
    • configMap
    • csi
    • downwardAPI
    • emptyDir
    • fc (fibre channel)
    • flexVolume
    • flocker
    • gcePersistentDisk
    • gitRepo (deprecated)
    • glusterfs
    • hostPath
    • iscsi
    • local
    • nfs
    • persistentVolumeClaim
    • projected
    • portworxVolume
    • quobyte
    • rbd
    • scaleIO
    • secret
    • storageos
    • vsphereVolume

    emptyDir

    当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,卷最初是空的,并且只要 Pod 在该节点上运行,卷就一直存在。当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除。

    容器崩溃并不会导致 Pod 被从节点上移除,因此容器崩溃时 emptyDir 卷中的数据是安全的。

    emptyDir 的一些用途:

    • 缓存空间,例如基于磁盘的归并排序。
    • 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
    • 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pd
    spec:
      containers:
      - image: k8s.gcr.io/test-webserver
        name: test-container
        volumeMounts:
        - mountPath: /cache
          name: cache-volume
      volumes:
      - name: cache-volume
        emptyDir: {}
    

    hostPath

    hostPath 卷能将主机节点文件系统上的文件或目录挂载到 Pod 中。

    使用hostPath必须要提供path属性,可以选择性的指定type属性,支持的type值包括:

    • DirectoryOrCreate 如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755
    • Directory 在给定路径上必须存在的目录
    • FileOrCreate 如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644
    • File 在给定路径上必须存在的文件
    • Socket 在给定路径上必须存在的 UNIX 套接字
    • CharDevice 在给定路径上必须存在的字符设备
    • BlockDevice 在给定路径上必须存在的块设备
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pd
    spec:
      containers:
      - image: k8s.gcr.io/test-webserver
        name: test-container
        volumeMounts:
        - mountPath: /test-pd
          name: test-volume
      volumes:
      - name: test-volume
        hostPath:
          path: /data
          type: Directory
    

    Projected Volume

    Projected volume 将多个 Volume 源映射到同一个目录中,支持 secret、downwardAPI 和 configMap。

    apiVersion: v1
    kind: Pod
    metadata:
      name: volume-test
    spec:
      containers:
      - name: container-test
        image: busybox
        volumeMounts:
        - name: all-in-one
          mountPath: "/projected-volume"
          readOnly: true
      volumes:
      - name: all-in-one
        projected:
          sources:
          - secret:
              name: mysecret
              items:
                - key: username
                  path: my-group/my-username
          - downwardAPI:
              items:
                - path: "labels"
                  fieldRef:
                    fieldPath: metadata.labels
                - path: "cpu_limit"
                  resourceFieldRef:
                    containerName: container-test
                    resource: limits.cpu
          - configMap:
              name: myconfigmap
              items:
                - key: config
                  path: my-group/my-config
    

    subPath

    subPath支持通过指定所引用的卷内的子路径,而不是其根路径,将数据卷提供给多方使用。比如,我们可以把HTML 内容被映射到site-data卷的 html文件夹,数据库被映射到site-data卷的 mysql 文件夹中。

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-lamp-site
    spec:
        containers:
        - name: mysql
          image: mysql
          env:
          - name: MYSQL_ROOT_PASSWORD
            value: "rootpasswd"
          volumeMounts:
          - mountPath: /var/lib/mysql
            name: site-data
            subPath: mysql
        - name: php
          image: php:7.0-apache
          volumeMounts:
          - mountPath: /var/www/html
            name: site-data
            subPath: html
        volumes:
        - name: site-data
          persistentVolumeClaim:
            claimName: my-lamp-site-data
    

    Local Volume

    本地数据卷(Local Volume)代表一个本地存储设备,比如磁盘、分区或者目录等。本地数据卷同时支持块设备和文件系统。

    本地数据卷只能以静态创建的 PV 使用, PV的定义中需要包含描述节点亲和性的信息,k8s系统则使用该信息将容器调度到正确的node节点。用户通过标准PVC接口以简单且可移植的方式访问node节点的本地存储。

    创建StorageClass

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: local-storage
    provisioner: kubernetes.io/no-provisioner
    volumeBindingMode: WaitForFirstConsumer
    

    创建PV

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: example-local-pv
    spec:
      capacity:
        storage: 100Gi
      accessModes:
      - ReadWriteOnce
      persistentVolumeReclaimPolicy: Delete
      storageClassName: local-storage
      local:
        path: /mnt/disks/ssd1
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - example-node
    

    创建 PVC

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: example-local-claim
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
      storageClassName: local-storage
    

    创建 Pod,引用 PVC

    kind: Pod
    apiVersion: v1
    metadata:
      name: mypod
    spec:
      containers:
        - name: myfrontend
          image: nginx
          volumeMounts:
          - mountPath: "/var/www/html"
            name: mypd
      volumes:
        - name: mypd
          persistentVolumeClaim:
            claimName: example-local-claim
    

    相关文章

      网友评论

          本文标题:kubernetes资源对象之Volume

          本文链接:https://www.haomeiwen.com/subject/fciluhtx.html