k8s存储CSI插件的存储方案

news/2024/10/3 8:38:09

 

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.139share: /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:- ReadWriteManyresources:requests:storage: 10GistorageClassName: nfs-csi

 创建pod

[root@master1 example]# cat 1.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:name: deployment-nfs
spec:replicas: 1selector:matchLabels:name: deployment-nfstemplate:metadata:name: deployment-nfslabels:name: deployment-nfsspec:nodeSelector:"kubernetes.io/os": linuxcontainers:- image: 192.168.148.139/nginx/nginx:latestimagePullPolicy: IfNotPresentname: deployment-nfscommand:- "/bin/bash"- "-c"- set -euo pipefail; while true; do echo $(hostname) $(date) >> /mnt/nfs/outfile; sleep 1; donevolumeMounts:- name: nfsmountPath: "/mnt/nfs"readOnly: falsevolumes:- name: nfspersistentVolumeClaim: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.

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/44576.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

12款高效开源Wiki系统推荐,打造团队知识管理利器

在企业知识管理和团队协作中,Wiki系统因其强大的编辑和组织功能,逐渐成为一种重要的工具。文章介绍了12款好用的开源Wiki:PingCode、DokuWiki、MediaWiki、Tiki Wiki CMS Groupware、XWiki、BookStack、PMWiki、Foswiki、GitBook、Wiki.js、TiddlyWiki、Slite。以及对比了一…

C# 每次生成之后自动更新软件版本号

第一步:在解决方案资源管理器中找到【AssemblyInfo.cs】文件,修改版本生成方式:[assembly: AssemblyVersion("1.0.0.*")] // 程序集的版本信息由下列四个值组成: // // 主版本 // 次版本 // 生成号 // 修订号 // //可以指定所有这些值,也可…

在Python中使用LSTM和PyTorch进行时间序列预测|附代码数据

全文链接:http://tecdat.cn/?p=8145 最近我们被客户要求撰写关于LSTM的研究报告,包括一些图形和统计输出。 顾名思义,时间序列数据是一种随时间变化的数据类型。例如,24小时内的温度,一个月内各种产品的价格,一年中特定公司的股票价格 诸如长期短期记忆网络(LSTM)之类…

蒸发温差热机-大号尺寸饮水鸟发电应用原理详细分析

蒸发温差热机-大号尺寸饮水鸟发电应用原理详细分析 作为物联网数据采集解决方案专业提供商,数采物联网小编daq-iot在这里做以下内容介绍,并诚挚的欢迎大家讨论和交流饮水鸟是一种热机,它利用温差将热能转换为设备内的压差,并执行机械做功。像所有热机一样,饮水鸟通过热力学循…

KC81710H 电池BMS AFE 规格书解读

1.工作模式 Full Power,Normal Sleep,Deep Sleep,Shut DownNormal Sleep 内部工作状态完全和 Full Power 模式一样,只是降低了 auto scan 的频率,Deep Sleep 在 Deep Sleep 模式下,充放电MOS 被强制关闭,ADC1 和ADC2(取决sw_cc_md[1:0]的配置)和其它功能模块都被强制关闭…

零售业上云为什么首选谷歌云

零售业是国民经济的重要组成部分,在促进经济发展、改善人民生活水平方面发挥着重要作用。零售业也是一个竞争激烈的行业,零售企业需要不断创新经营方式、提高服务质量才能在竞争中立于不败之地。零售业是国民经济的重要组成部分,在促进经济发展、改善人民生活水平方面发挥着…

协同平台查看权限打开业务对象提示当前用户没有权限!请检查用户[BOS设计器]的[编辑]权限与应用的编辑权限!

8.0版本金蝶设计如此,需要应用的编辑权限才能从解决方案打开业务对象。查看权限只能从查找搜索中打开业务对象。 8.2版本已优化,应用查看权限也可以从解决方案打开业务对象,如下图

流畅的python--第十二章 序列的特殊方法

Vector 类第 1 版:与 Vector2d 类兼容 示例 12-2 vector_v1.py:从 vector2d_v1.py 衍生而来 from array import array import reprlib import math class Vector:typecode = ddef __init__(self, components):self._components = array(self.typecode, components)# ❶def _…