使用本地存储
所有文档

          容器引擎 CCE

          使用本地存储

          EmptyDir

          概述

          emptyDir 类型的 Volume 在 Pod 分配到 Node 上时被创建,Kubernetes 会在 Node 上自动分配一个目录,因此无需指定宿主机 Node 上对应的目录文件,这个目录的初始内容为空。

          当 Pod 从 Node 上移除时,emptyDir 中的数据会被永久删除。

          使用 kubectl create -f testemptyDir.yaml 创建一个 Pod,该 Pod 使用 EmptyDir,testemptyDir.yaml 如下所示:

          apiVersion: v1
          kind: Pod
          metadata:
            name: test-ed
          spec:
            containers:
            - image: nginx
              name: test-container
              volumeMounts:
              - mountPath: /test
                name: cache-volume
            volumes:
            - name: cache-volume
              emptyDir: {}

          查看创建的 Pod 详情:

          $ kubectl describe pod test-ed

          进入 Pod 内部查看挂载效果:

          $ kubectl exec -it test-ed -c test-container /bin/sh

          HostPath

          概述

          HostPath 类型则是映射 Node 文件系统中的文件或者目录到 Pod 里。在使用 HostPath 类型的存储卷时,也可以设置 type 字段,支持的类型有文件、目录、File、Socket、CharDevice 和 BlockDevice。

          使用 kubectl create -f testhostPath.yaml 创建一个 Pod,该 Pod 使用 HostPath,testhostPathr.yaml 如下所示:

          apiVersion: v1
          kind: Pod
          metadata:
            name: test-hp
          spec:
            containers:
            - image: nginx
              name: test-container
              volumeMounts:
              - mountPath: /test-pd
                name: test-volume
            volumes:
            - name: test-volume
              hostPath:
                #directory location on host
                path: /data

          Local Volume

          概述

          Local Volume 允许将 Node 本地的磁盘、分区或者目录作为持久化存储使用。Local Volume 适合应用于数据缓存,应用可以就近访问数据,快速处理,同时还适用于分布式存储系统,如分布式数据库 Cassandra ,分布式文件系统 ceph/gluster。

          目前 Kubernetes 对于 Local PV 的一些支持情况:

          • Kubernetes v1.7: 正式引入 Local PV;
          • Kubernetes v1.10: Local PV 进入 Beta;
          • Kubernetes v1.14: Local PV 进入 GA

          创建storage class

          kubectl create -f local-volume.yaml,local-volume.yaml 内容如下:

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

          其中WaitForFirstConsumer表示PV不要立即绑定PVC,而是直到有Pod需要用PVC的时候才绑定。

          静态创建 PV

          通过 kubectl create -f local-volume-pv.yaml,静态创建一个 5GiB 的 PV;该 PV 使用 node 的 /data/volume 目录(需要手动创建目录)

          local-volume-pv.yaml 内容如下:

          apiVersion: v1
          kind: PersistentVolume
          metadata:
            name: example-local-pv
          spec:
            capacity:
              storage: 5Gi
            accessModes:
            - ReadWriteOnce
            persistentVolumeReclaimPolicy: Retain
            storageClassName: local-volume
            local:
              path: /data/volume
            nodeAffinity:
              required:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: kubernetes.io/hostname
                    operator: In
                    values:
                    - HOSTNAME

          通过kubectl get nodes 获得node_name替换上面的HOSTNAME字段。

          $ kubectl get pv example-local-pv
          $ kubectl get pv
          NAME                                      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                          STORAGECLASS      REASON   AGE
          example-local-pv                          5Gi        RWO            Retain           Bound    default/myclaim                local-volume               5s

          使用 local volume PV

          创建一个关联 local-volume的PVC,并创建一个pod使用该pvc,kubectl create -f local-volume-pvc.yaml

          local-volume-pvc.yaml内容如下:

          apiVersion: v1
          kind: PersistentVolumeClaim
          metadata:
            name: mypvc
          spec:
            accessModes:
            - ReadWriteOnce
            resources:
              requests:
                storage: 5Gi
            storageClassName: local-volume
          ---
          kind: Pod
          apiVersion: v1
          metadata:
            name: mypod
          spec:
            containers:
              - name: myfrontend
                image: nginx
                volumeMounts:
                - mountPath: "/usr/share/nginx/html"
                  name: mypd
            volumes:
              - name: mypd
                persistentVolumeClaim:
                  claimName: mypvc

          查看创建的pv,pvc,pod。

          $ kubectl get pv
          NAME                    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                          STORAGECLASS      REASON   AGE
          example-local-pv        5Gi        RWO            Retain           Bound    default/mypvc                  local-volume               5s
          $ kubectl get pvc
          NAME                   STATUS   VOLUME                                    CAPACITY   ACCESS MODES   STORAGECLASS      AGE
          mypvc                  Bound    example-local-pv                          5Gi        RWO            local-volume      4m20s
          $ kubectl get pods
          NAME                             READY   STATUS    RESTARTS   AGE
          mypod                            1/1     Running   0          4m28s

          向本地的/data/volume写入内容,使用curl查看是否写入成功

          $ echo "hello world" > /data/volume/index.html
          $ curl 172.19.4.63
          #这里替换自己的pod的ip
          hello world

          删除时注意首先删除创建的pod,随后删除pvc,pv。

          上一篇
          概述
          下一篇
          使用云盘CDS