美文网首页数据存储
local-volume-provisioner使用

local-volume-provisioner使用

作者: wowshiwoniu | 来源:发表于2020-09-15 19:46 被阅读0次

    local volume

    kubernetes从1.10版本开始支持local volume(本地卷),workload(不仅是statefulsets类型)可以充分利用本地快速SSD,从而获取比remote volume(如cephfs、RBD)更好的性能。

    在local volume出现之前,statefulsets也可以利用本地SSD,方法是配置hostPath,并通过nodeSelector或者nodeAffinity绑定到具体node上。但hostPath的问题是,管理员需要手动管理集群各个node的目录,不太方便。

    下面两种类型应用适合使用local volume。

    数据缓存,应用可以就近访问数据,快速处理。
    分布式存储系统,如分布式数据库Cassandra ,分布式文件系统ceph/gluster
    下面会先以手动方式创建PV、PVC、Pod的方式,介绍如何使用local volume,然后再介绍external storage提供的半自动方式

    创建stoargeclass

    # storageclass.yaml
    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: fast-disks
    provisioner: kubernetes.io/no-provisioner
    volumeBindingMode: WaitForFirstConsumer
    

    创建pv

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: local-pv-example
    spec:
      capacity:
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
      - ReadWriteOnce
      persistentVolumeReclaimPolicy: Delete
      storageClassName: local-storage
      local:
        path: /mnt/disks/vol1
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - k8sdeploy-n102
              - k8sdeploy-n103
              - k8sdeploy-n104
    

    使用local volume PV

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: local-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
      storageClassName: fast-disks
    ---
    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: local-pvc
    

    进入到容器里,会看到挂载的目录,大小其实就是上面创建的PV所在磁盘的size。
    在宿主机的 /mnt/disks/vol1目录下创建一个index.html文件:

    echo "hello world" >  /mnt/disks/vol1/index.html
    

    然后再去curl容器的IP地址,就可以得到刚写入的字符串了。

    curl <pod-ip>
    

    删除Pod/PVC,之后PV状态改为Released,该PV不会再被绑定PVC了。
    需要手动删除pv。

    local-volume-provisioner动态创建pv

    地址:https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner

    clone项目

    git clone https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner.gi4
    git checkout tags/v2.3.4 -b v2.3.5
    helm template ./helm/provisioner -f ./helm/provisioner/values.yaml > local-volume-provisioner.generated.yaml
    kubectl create -f local-volume-provisioner.generated.yaml
    

    创建storageclass

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

    部署

    kubectl apply -f local-fast-disks.yaml
    

    挂载磁盘

    其Provisioner本身其并不提供local volume,但它在各个节点上的provisioner会去动态的“发现”挂载点(discovery directory),当某node的provisioner在/mnt/fast-disks目录下发现有挂载点时,会创建PV,该PV的local.path就是挂载点,并设置nodeAffinity为该node。

    挂载盘麻烦或者没有,可以参考mount bind方式

    #!/bin/bash
    for i in $(seq 1 5); do
      mkdir -p /mnt/fast-disks-bind/vol${i}
      mkdir -p /mnt/fast-disks/vol${i}
      mount --bind /mnt/fast-disks-bind/vol${i} /mnt/fast-disks/vol${i}
    done
    

    执行该脚本后,等待一会,执行查询pv命令,就可以发现自动创建了

    kubectl get pv
    

    测试pod是否可以运行

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: local-test
    spec:
      serviceName: "local-service"
      replicas: 3
      selector:
        matchLabels:
          app: local-test
      template:
        metadata:
          labels:
            app: local-test
        spec:
          containers:
          - name: test-container
            image: busybox
            command:
            - "/bin/sh"
            args:
            - "-c"
            - "sleep 100000"
            volumeMounts:
            - name: local-vol
              mountPath: /tmp
      volumeClaimTemplates:
      - metadata:
          name: local-vol
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "fast-disks"
          resources:
            requests:
              storage: 2Gi
    

    参考地址

    https://ieevee.com/tech/2019/01/17/local-volume.html
    https://blog.csdn.net/networken/article/details/106412691
    https://linkscue.com/posts/2019-09-18-kubernetes-local-volume-provisioner/

    相关文章

      网友评论

        本文标题:local-volume-provisioner使用

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