首页 > 其他分享 >k8s存储CSI插件的存储方案

k8s存储CSI插件的存储方案

时间:2024-06-12 17:22:00浏览次数:19  
标签:容器 存储 csi driver 插件 nfs CSI k8s

 

Kubernetes从1.9版本开始引入容器存储接口 Container Storage Interface (CSI)机制,用于在Kubernetes和外部存储系统之间建立一套标准的存储管理接口,通过该接口为容器提供存储服务。

CSI的核心组件和部署架构

Kubernetes CSI存储插件的关键组件和推荐的容器化部署架构如下(其中主要包括两类组件:CSI Controller和CSI Node):

 

CSI Controller
CSI Controller的主要功能是 提供存储服务视角对存储资源和存储卷进行管理和操作。在Kubernetes中建议将其部署为单实例Pod,可以使用StatefulSet或 Deployment控制器进行部署,设置副本数量为1,保证一种存储插件只运行一个控制器实例。

在这个Pod内部署两个容器,分别提供以下功能.

与Master ( kube-controller-manager) 通信的辅助sidecar容器:在 sidecar容器内又可以包含external-attacher和external-provisioner两个容器,它们的功能分别如下:

external-attacher:监控VolumeAttachment资源对象的变更,触发针对 CSI端点的ControllerPublish和ControllerUnpublish操作;
externail-provisioner:监控PersistentVolumeClaim资源对象的变更,触发针对CSI端点的CreateVolume和DeleteVolume操作。
另外,社区正在引入具备其他管理功能的sidecar工具,例如:externalsnapshotter,用于管理存储快照,目前为Alpha阶段;external-resizer用于管理存储容量扩容,目前为Beta阶段。

 

CsI Driver存储驱动容器,由第三方存储提供商提供,需要实现上述接口:这两个容器通过本地Socket (Unix Domain Socket, UDS),并使用gPRC协议进行通信。sidecar容器通过Socket调用CSI Driver容器的CSI接口,CSI Driver 容器负责具体的存储卷操作。

CSI Node

CSI Node的主要功能是对主机(Node )上的Volume进行管理和操作,在 Kubernetes中建议将其部署为DaemonSet,在需要提供存储资源的各个Node上都运行一个Pod。

在这个Pod中部署以下两个容器:

与kubelet通信的辅助sidecar容器node-driver-registrar:主要功能是将存储驱动注册到kubelet中;
CSI Driver存储驱动容器:由第三方存储提供商提供,主要功能是接收 kubelet 的调用,需要实现一系列与 Node 相关的 CSI 接口,例如: NodePublishVolume 接口(用于将 Volume 挂载到容器内的目标路径)、NodeUnpublishVolume接口(用于从容器中卸载Volu加粗样式me),等等。

 

流程:

node-driver-registrar容器与kubelet通过 Node主机一个hostPath目录下的 unix socket进行通信。
CSI Driver容器与kubelet通过Node主机另一个hostPath目录下的 unix socket 进行通信,同时需要将 kubelet 的工作目录(默认为 /var/lib/kubelet)挂载给CSI Driver容器,用于为Pod进行Volume的管理操作 (包括mount、 umount等)。

在k8s中安装nfs csi driver实现动态存储

安装部署nfs csi driver

git clone https://github.com/kubernetes-csi/csi-driver-nfs.git
cd csi-driver-nfs/deploy/v4.7.0/
kubectl apply -f .

 

创建storageclass,配置CSI Driver 部署的nfs server作为存储后端

cd /root/csi-driver-nfs/deploy/example

[root@master1 example]# cat  storageclass-nfs.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-csi
provisioner: nfs.csi.k8s.io
parameters:
  server: 192.168.148.139
  share: /opt/nfsdata
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
  - nfsvers=4.1
  - hard

 

创建pvc

[root@master1 example]# cat pvc-nfs-csi-dynamic.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nfs-dynamic
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: nfs-csi

 创建pod

[root@master1 example]# cat 1.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nfs
spec:
  replicas: 1
  selector:
    matchLabels:
      name: deployment-nfs
  template:
    metadata:
      name: deployment-nfs
      labels:
        name: deployment-nfs
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - image: 192.168.148.139/nginx/nginx:latest
          imagePullPolicy: IfNotPresent
          name: deployment-nfs
          command:
            - "/bin/bash"
            - "-c"
            - set -euo pipefail; while true; do echo $(hostname) $(date) >> /mnt/nfs/outfile; sleep 1; done
          volumeMounts:
            - name: nfs
              mountPath: "/mnt/nfs"
              readOnly: false
      volumes:
        - name: nfs
          persistentVolumeClaim:
            claimName: pvc-nfs-dynamic

 

 

 

csi-driver-host-path 部署

检查是否有任何 Pod 正在运行 snapshot-controller 映像

[root@master1 example]# kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{range .spec.containers[*]}{.image}{", "}{end}{end}' | grep snapshot-controller
registry-k8s-io.mirrors.sjtug.sjtu.edu.cn/sig-storage/snapshot-controller:v6.3.3,
registry-k8s-io.mirrors.sjtug.sjtu.edu.cn/sig-storage/snapshot-controller:v6.3.3,

 

如果没有 Pod 运行 snapshot-controller,请按照以下说明创建 snapshot-controller

VolumeSnapshot CRD 和快照控制器安装

# Change to the latest supported snapshotter version
$ SNAPSHOTTER_VERSION=v6.3.3

# Create snapshot controller
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/${SNAPSHOTTER_VERSION}/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/${SNAPSHOTTER_VERSION}/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml

 

安装部署

git clone https://github.com/kubernetes-csi/csi-driver-host-path.git


创建rbac

cd  csi-driver-host-path/

deploy/kubernetes-latest/deploy.sh

 

替换镜像

 sed -i 's/registry.k8s.io/registry-k8s-io.mirrors.sjtug.sjtu.edu.cn/g' *.yaml

kubectl  applyf  -f   ./

 

 

部署测试验证

[root@master1 deploy]# cd /root/csi-driver-host-path/examples/
for i in ./examples/csi-storageclass.yaml ./examples/csi-pvc.yaml ./examples/csi-app.yaml; do kubectl apply -f $i; done
storageclass.storage.k8s.io/csi-hostpath-sc created
persistentvolumeclaim/csi-pvc created
pod/my-csi-app created


 

 

确认 Hostpath 驱动程序正常工作

Hostpath 驱动程序配置为在 hostpath 容器内创建新卷,该容器在此处找到的插件 StatefulSet 中指定。只要 StatefulSet Pod 启动并运行,此路径就会持续存在。/csi-data-dir

在应用程序内正确挂载的 Hostpath 卷中写入的文件应显示在 Hostpath 容器中。以下步骤确认 Hostpath 工作正常。首先,从应用程序 Pod 创建一个文件,如下所示:

$ kubectl exec -it my-csi-app /bin/sh
/ # touch /data/hello-world
/ # exit

 

接下来,通过 ssh 进入 Hostpath 容器并验证文件是否显示在那里:

$ kubectl exec -it $(kubectl get pods --selector app=csi-hostpathplugin -o jsonpath='{.items[*].metadata.name}') -c hostpath /bin/sh

然后,使用以下命令找到该文件。如果一切正常,您应该会得到类似于以下内容的结果:

# find / -name hello-world

/var/lib/kubelet/pods/803b5144-12a5-4af9-8d11-68b929fdab37/volumes/kubernetes.io~csi/pvc-eff69d7c-df46-40d2-9e46-56ee0fc7abf7/mount/hello-world
/var/lib/csi-hostpath-data/6a1c69e7-2892-11ef-a1bd-126b1bab9631/hello-world

 

 

引用:

https://blog.51cto.com/u_15294985/6236368

csi-driver-host-path/docs/deploy-1.17-and-later.md 在 master ·kubernetes-csi/csi-driver-host-path ·GitHub上

GitHub - kubernetes-csi/csi-driver-nfs: This driver allows Kubernetes to access NFS server on Linux node.

 

标签:容器,存储,csi,driver,插件,nfs,CSI,k8s
From: https://www.cnblogs.com/fengjian2016/p/18243993

相关文章

  • 【K8s】专题五(1):Kubernetes 配置之 ConfigMap
    以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发!欢迎扫码关注个人公众号!目录一、基本介绍二、主要特性三、资源清单(示例)四、常用操作一、基本介绍在Kubernetes中,ConfigMap是一种用于存储非敏感信息的资源对象,提供了向Pod......
  • 贝壳找房: 为 AI 平台打造混合多云的存储加速底座
    贝壳机器学习平台的计算资源,尤其是GPU,主要依赖公有云服务,并分布在不同的地理区域。为了让存储可以灵活地跟随计算资源,存储系统需具备高度的灵活性,支持跨区域的数据访问和迁移,同时确保计算任务的连续性和高效性;此外,随着数据量的增长,元数据管理的压力也在逐渐加大。贝壳机器学习平......
  • k8s_示例_根据CPU使用率自动扩展Pod数量并使Pod分布在不同节点
    我们从制作测试用镜像开始,后续一步一步实现在k8s中使pod根据cpu用量自动扩展pod个数。知识准备在做这个示例之前,需要了解k8s(也叫kubernetes)基本原理,了解k8s是用来干嘛的即可,以及deployment、service、hpa、镜像、docker等概念。不然会有些晕的,不知道这些配置和这些操作......
  • 【jmeter】Jmeter插件PerfMon Metrics Collector安装使用
    一、场景   使用jmeterGUI测试的时候,想观察服务器性能变化  二、插件官方地址Documentation:https://jmeter-plugins.org/wiki/PerfMon/ 三、安装插件首选要安装插件管理的包(这里就不讲了,之前写过)下载地址:https://jmeter-plugins.org/install/Install/ 可用......
  • 【Jenkins+K8s】持续集成与交付 (二十):K8s集群通过Deployment方式部署安装Jenkins
    ......
  • 怎么只读USB存储设备?教你两种方法
    电脑的USB可以帮助我们连接各种设备,比如移动存储设备。而只读USB则可以保护电脑数据和移动存储设备中的设备。那么,怎么只读USB存储设备?下面我们就一起来了解一下吧。USB设备只读加密USB设备只读加密可以在不影响移动存储设备正常使用的前提下,避免其他人复制、移动、删除其......
  • 【MySQL随缘更】存储过程
    文章目录一、存储过程概述1.1、什么是存储过程1.2、存储过程特点1.3、存储过程优缺点二、存储过程创建2.1、创建格式2.2、变量2.3、变量作用域三、存储过程参数3.1、in3.2、out3.3、inout四、存储过程条件4.1、if…else…endif4.2、if…elseif…else…endif4.3、cas......
  • 限速上传文件到腾讯对象存储cos的脚本
     官网:https://cloud.tencent.com/document/product/436/12269 安装包,这里用的python2.7#pipinstall-Ucos-python-sdk-v5-ihttps://mirrors.tencent.com/pypi/simple/  脚本:vimmcw.py#-*-coding=utf-8fromqcloud_cosimportCosConfigfromqcloud_cosimp......
  • 【VMware vSAN】修改虚拟机名称后如何改变在 vSAN 数据存储中的名称。
    如果在vSphere集群环境修改虚拟机的名字后,虚拟机所在的数据存储文件中的名称并不会改变,我们知道可以通过执行一下StoragevMotion操作,以通知虚拟机在数据存储中的改变。但是,这个操作需要环境中至少具有第二个数据存储才能执行StoragevMotion来往返迁移虚拟机,最好使用的是共......
  • pytest接口自动化测试框架:为什么要做pytest插件的二次开发
    pytest二次开发的主要场景举例  https://blog.51cto.com/u_16213617/9796200 在进行接口自动化测试时,pytest框架提供了一套丰富的功能和插件,可以帮助我们快速编写和执行测试用例。然而,有时我们可能会遇到一些框架本身无法满足的特殊需求。这时,就需要进行pytest插件的二次开......