容器存储接口--CSI

news2024/9/25 13:16:56

文章目录

  • 一、背景
  • 二、CSI 是什么
  • 三、CSI 系统架构
    • 1、CSI 如何与 k8s 组件相互通信
    • 2、CSI 由哪些组件组成
    • 3、CSI 的工作原理
    • 4、k8s 存储中涉及的组件及其作用
      • 4.1、Sidecar Containers
        • 4.1.1、[external-attacher](https://kubernetes-csi.github.io/docs/external-attacher.html#csi-external-attacher)
        • 4.1.2、[external-provisioner](https://kubernetes-csi.github.io/docs/external-provisioner.html#csi-external-provisioner)
        • 4.1.3、[external-resizer](https://kubernetes-csi.github.io/docs/external-resizer.html#csi-external-resizer)
        • 4.1.4、[external-snapshotter](https://kubernetes-csi.github.io/docs/external-snapshotter.html#csi-external-snapshotter)
        • 4.1.5、[livenessprobe](https://kubernetes-csi.github.io/docs/livenessprobe.html#csi-livenessprobe)
        • 4.1.6、[node-driver-registrar](https://kubernetes-csi.github.io/docs/node-driver-registrar.html#csi-node-driver-registrar)
        • 4.1.7、[cluster-driver-registrar](https://kubernetes-csi.github.io/docs/cluster-driver-registrar.html#csi-cluster-driver-registrar)(已弃用)
        • 4.1.8、[external-health-monitor-controller](https://kubernetes-csi.github.io/docs/external-health-monitor-controller.html#csi-external-health-monitor-controller)
        • 4.1.9、[external-health-monitor-agent](https://kubernetes-csi.github.io/docs/external-health-monitor-agent.html#csi-external-health-monitor-agent)(已弃用)
      • 4.2、PV Controller
      • 4.3、AD Controller
      • 4.4、Volume Manager
  • 四、CSI 存储流程
    • 1、Provisioning Volumes
    • 2、Attaching Volumes
    • 3、Mounting Volumes
    • 4、Unmounting Volumes
    • 5、Detaching Volumes
    • 6、Deleting Volumes

一、背景

K8s 原生支持一些存储类型的 PV,如 iSCSINFSCephFS 等等,这些 in-tree 类型的存储代码放在 Kubernetes 代码仓库中。这里带来的问题是 K8s 代码与三方存储厂商的代码强耦合

  • 更改 in-tree 类型的存储代码,用户必须更新 K8s 组件,成本较高
  • in-tree 存储代码中的 bug 会引发 K8s 组件不稳定
  • K8s 社区需要负责维护及测试 in-tree 类型的存储功能
  • in-tree 存储插件享有与 K8s 核心组件同等的特权,存在安全隐患
  • 三方存储开发者必须遵循 K8s 社区的规则开发 in-tree 类型存储代码

CSI 容器存储接口标准的出现解决了上述问题,将三方存储代码与 K8s 代码解耦,使得三方存储厂商研发人员只需实现 CSI 接口(无需关注容器平台是 K8s 还是 Swarm 等)。

图片

二、CSI 是什么

CSI是Container Storage Interface(容器存储接口)的简写。

CSI的目的是定义行业标准"容器存储接口",使存储供应商(SP,Storage Provider)能够开发一个符合CSI标准的插件并使其可以在多个容器编排(CO)系统中工作。CO包括Cloud Foundry, Kubernetes, Mesos,Swarm等。

kubernetes将通过CSI接口来跟第三方存储厂商进行通信,来操作存储,从而提供容器存储服务。

三、CSI 系统架构

CSI 主要包含两个部分:

  • Controller Server:主要控制端的功能,主要实现创建、删除、挂载、卸载等功能。通常以 StatefulSet/Deployment 形式部署

  • Node Server:主要实现节点上的 mount , unmount功能。通常以DaemonSet 形式部署在每一个节点

2393007-20210724163109887-321971934

1、CSI 如何与 k8s 组件相互通信

978ee8a67f1251ee2679b41c83e83ee8

CSI Controller Server 和 External CSI SideCar 之间以及 CSI Node Server 和 Kubelet 之间其实都是通过创建 Unix Domain Socket 文件使用 gRPC 协议进行互相通信的

2、CSI 由哪些组件组成

94982fe3-1d8f-4f81-b256-113167714b34

  1. Node Service: 运行在每个 Kubernetes 节点上,负责在节点上挂载和卸载存储卷,并处理节点级别的存储操作。
  2. Controller Service: 运行在 Kubernetes 控制平面中,负责管理存储卷的生命周期,包括创建、删除和扩容等操作。
  3. Identity Service:它在 CSI 驱动器注册时提供标识信息,并向 Kubernetes 集群公开驱动器的支持能力。它负责告知 Kubernetes 驱动器的存在,提供驱动器的基本信息和功能支持。

3、CSI 的工作原理

CSI 的工作流程实际上就是围绕着两方面的组件:

ba08a7b0-d8fe-4c33-975b-b85ffeaad0a5

  1. 由 Kubernetes 官方维护的一组标准 external 组件,他们主要负责监听 K8s 里的资源对象,从而向 CSI Driver 发起 gRPC 调用。 Kubernetes CSI Sidecar Containers。它们是与 CSI 驱动器一起部署在同一个 Pod 中,用于辅助 CSI Driver 完成一些额外的任务和功能。
  2. 各存储厂商开发的组件(主要实现 Identity Service,Controller Service,Node Service)

4、k8s 存储中涉及的组件及其作用

4.1、Sidecar Containers

Sidecar Contrainers

Kubernetes CSI Sidecar 容器是一组标准容器,旨在简化 Kubernetes 上 CSI 驱动程序的开发和部署。

这些容器包含监视 Kubernetes API、针对 “CSI 卷驱动程序” 容器触发适当操作以及根据需要更新 Kubernetes API 的通用逻辑。

这些容器旨在与第三方 CSI 驱动容器捆绑在一起,并作为 pod 一起部署。

这些 Sidecar 容器的优点:

  • 减少 “样板” 代码

    • CSI 驱动程序开发人员不必担心复杂的"Kubernetes 特定"代码。
  • 关注点分离

    • 与 Kubernetes API 交互的代码与实现 CSI 接口的代码是隔离的(并且位于不同的容器中)。
4.1.1、external-attacher

它监视 Kubernetes API 服务器上的 VolumeAttachment 对象并Controller[Publish|Unpublish]Volume 针对 CSI 端点触发操作。

4.1.2、external-provisioner

CSI external-provisioner 是一个 sidecar 容器,用于监视 Kubernetes API 服务器中的 PersistentVolumeClaim 对象。

它针对指定的 CSI 端点调用 CreateVolume 以配置新卷。

如果 PVC 引用 Kubernetes StorageClass,并且存储类的配置者字段中的名称与 GetPluginInfo 调用中指定的 CSI 端点返回的名称匹配,则通过创建新的 Kubernetes PersistentVolumeClaim 对象来触发卷配置。

成功配置新卷后,sidecar 容器会创建一个 Kubernetes PersistentVolume 对象来表示该卷。

使用删除回收策略删除绑定到与此驱动程序对应的 PersistentVolume PersistentVolumeClaim 对象,会导致 sidecar 容器针对指定的 CSI 端点触发 DeleteVolume 操作以删除该卷。一旦卷被成功删除,sidecar 容器也会删除代表该卷的 PersistentVolume 对象。

4.1.3、external-resizer

CSI external-resizer 是一个 sidecar 容器,它监视 Kubernetes API 服务器上的 PersistentVolumeClaim 对象编辑,并在用户请求 PersistentVolumeClaim 对象上的更多存储时触发针对 CSI 端点的 ControllerExpandVolume 操作。

4.1.4、external-snapshotter

CSI external-snapshotter sidecar 监视 Kubernetes API 服务器中的 VolumeSnapshotContent CRD 对象。CSI external-snapshotter sidecar还负责调用 CSI RPCs CreateSnapshotDeleteSnapshotListSnapshots

可以使用 --enable-volume-group-snapshots 选项启用卷组快照支持。启用后,CSI 外部快照 sidecar 会监视 API 服务器上的 VolumeGroupSnapshotContent CRD 对象,并负责调用 CSI RPCs CreateVolumeGroupSnapshotDeleteVolumeGroupSnapshotGetVolumeGroupSnapshot

4.1.5、livenessprobe

CSI livenessprobe 是一个 sidecar 容器,用于监控 CSI 驱动程序的运行状况,并通过 Liveness Probe 机制向 Kubernetes 报告。这使得 Kubernetes 能够自动检测驱动程序的问题并重新启动 pod 以尝试修复问题。

所有 CSI 驱动程序都应使用活性探针来提高部署在 Kubernetes 上的驱动程序的可用性。

4.1.6、node-driver-registrar

CSI node-driver-registrar 是一个 sidecar 容器,它从 CSI 端点获取驱动程序信息(使用 NodeGetInfo),并使用 kubelet plugin registration mechanism (kubelet 插件注册机制)将其注册到该节点上的 kubelet。

Kubelet 直接针对 CSI driver 发出 CSI NodeGetInfoNodeStageVolumeNodePublishVolume 调用。它使用 kubelet 插件注册机制来发现 unix 域套接字以与 CSI 驱动程序通信。因此,所有 CSI 驱动程序都应该使用这个 sidecar 容器向 kubelet 注册自己。

4.1.7、cluster-driver-registrar(已弃用)

自 k8s 1.13以来,此 Sidecar Container 未更新。从 k8s 1.16开始,此 Sidecar Container 已正式弃用

CSI cluster-driver-registrar 是一个 sidecar 容器,它通过创建 CSIDriver 对象向 Kubernetes 集群注册 CSI 驱动程序,该对象使驱动程序能够自定义 Kubernetes 与其交互的方式。

使用以下 Kubernetes 功能之一的 CSI 驱动程序应使用此 sidecar 容器:

  • Skip Attach

    • 对于不支持 ControllerPublishVolume 的驱动程序,这指示 Kubernetes 跳过附加操作,并且无需部署外部附加器 sidecar。
  • Pod Info on Mount

    • 这会导致 Kubernetes 将 Pod 名称和命名空间等元数据传递给 NodePublishVolume 调用。

如果不使用这些功能之一,则不需要此 sidecar 容器(以及 CSIDriver 对象的创建)。

4.1.8、external-health-monitor-controller

CSI external-health-monitor-controller 是一个 sidecar 容器,与 CSI controller driver一起部署,类似于 CSI external-provisioner sidecar 的部署方式。它调用 CSI 控制器 RPC ListVolumesControllerGetVolume 来检查 CSI 卷的运行状况,如果卷的状况异常,则在 PersistentVolumeClaim 上报告事件。

CSI 外部运行状况监视器控制器还监视节点故障事件。可以通过将 enable-node-watcher 标志设置为true来启用该组件。目前这只会对local PVs产生影响。当检测到节点故障事件时,将在 PVC 上报告一个事件,以指示使用此 PVC 的 pod 位于故障节点上。

支持 VOLUME_CONDITION 和 LIST_VOLUMESVOLUME_CONDITIONGET_VOLUME 控制器功能的 CSI 驱动程序应使用此 sidecar 容器。

4.1.9、external-health-monitor-agent(已弃用)

此 sidecar 已被弃用,并替换为 Kubernetes 中的 CSIVolumeHealth 功能。

CSI external-health-monitor-agent 是一个 sidecar 容器,与 CSI 节点驱动程序一起部署,类似于 CSI node-driver-registrar sidecar 的部署方式。它调用 CSI 节点 RPC NodeGetVolumeStats 检查 CSI 卷的健康状况,如果卷状况异常,则报告 Pod 上的事件。

支持 VOLUME_CONDITIONNODE_GET_VOLUME_STATS 节点功能的 CSI 驱动程序应使用此 sidecar 容器。

4.2、PV Controller

kube-controller-manager 内部组件,是 k8s 控制面的一部分,负责 PV/PVC 绑定及周期管理,根据需求进行数据卷的 Provision/Delete 操作

  • in-tree:创建/删除底层存储、创建/删除pv对象的操作,由 PV controller 调用 volume plugin(in-tree)来完成。

  • out-tree CSI:创建/删除底层存储、创建/删除pv对象的操作由 external-provisionercsi plugin 共同来完成。

4.3、AD Controller

AD Cotroller 全称 Attachment/Detachment 控制器 ,也是 kube-controller-manager 内部一个组件。主要负责创建、删除VolumeAttachment 对象,并调用 volume plugin 来做存储设备的 Attach/Detach 操作(将数据卷挂载到特定node节点上/从特定node节点上解除挂载),以及更新 node.Status.VolumesAttached 等。

不同的 volume pluginAttach/Detach 操作逻辑有所不同,对于 csi plugin(out-tree volume plugin)来说,AD controllerAttach/Detach 操作只是修改 VolumeAttachment 对象的状态,而不会真正的将数据卷挂载到节点/从节点上解除挂载,真正的节点存储挂载/解除挂载操作由kubelet中 volume manager 调用 csi plugin 来完成。

4.4、Volume Manager

kubelet 内部一个组件,它主要是用来做节点 Volume 的 Attach/Detach/Mount/Unmount 操作。

对于 csi 来说,volume managerAttach/Detach 操作只创建/删除 VolumeAttachment 对象,而不会真正的将数据卷挂载到节点/从节点上解除挂载;

CSI-Attacher 组件也不会做挂载/解除挂载操作,只是更新 VolumeAttachment 对象状态,真正的节点存储挂载/解除挂载操作由kubeletvolume manager 调用调用 csi plugin 来完成。

图片

四、CSI 存储流程

K8s 中的 Pod 在挂载存储卷时需经历三个的阶段:Provision/Delete(创盘/删盘)、Attach/Detach(挂接/摘除)和 Mount/Unmount(挂载/卸载),下面以图文的方式讲解 K8s 在这三个阶段使用 CSI 的流程。

1、Provisioning Volumes

image-20240825185205076

1、集群管理员创建 StorageClass 资源,该 StorageClass 中包含 CSI 插件名称(provisioner: rancher.io/local-path )

image-202408261143213772、用户创建 PersistentVolumeClaim 资源,PVC 指定存储大小及 StorageClass。

cat << EOF > pvc-test.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-test
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: local-path
EOF

3、卷控制器(PersistentVolumeController) 观察到集群中新创建的 PVC 没有与之匹配的 PV,且其使用的存储类型为 out-of-tree,于是为 PVC 打 annotation:volume.beta.kubernetes.io/storage-provisioner=[out-of-tree CSI 插件名称](本例中为provisioner: rancher.io/local-path)。

4、External Provisioner 组件 观察到 PVC 的 annotation 中包含 “volume.beta.kubernetes.io/storage-provisioner” 且其 value 是自己,于是开始创盘流程。

  • 获取相关 StorageClass 资源并从中获取参数,用于后面 CSI 函数调用。

  • 通过 unix domain socket 调用外部 CSI 插件CreateVolume 函数

5、外部 CSI 插件返回成功后表示盘创建完成,此时 External Provisioner 组件会在集群创建一个 PersistentVolume 资源。

6、卷控制器会将 PV 与 PVC 进行绑定。

image-20240826233443978

2、Attaching Volumes

image-20240825192013952

  1. AD 控制器(AttachDetachController) 观察到使用 CSI 类型 PV 的 Pod 被调度到某一节点,此时 AD 控制器会调用**内部 in-tree CSI 插件(csiAttacher)**的 Attach 函数。

  2. 内部 in-tree CSI 插件(csiAttacher) 会创建一个 VolumeAttachment 对象到集群中。

  3. External Attacher 观察到该 VolumeAttachment 对象,并调用外部 CSI 插件ControllerPublish 函数以将卷挂接到对应节点上。外部 CSI 插件挂载成功后,External Attacher 会更新相关 VolumeAttachment 对象的 .Status.Attached 为 true。

  4. AD 控制器内部 in-tree CSI 插件(csiAttacher) 观察到 VolumeAttachment 对象的 .Status.Attached 设置为 true,于是更新 AD 控制器内部状态(ActualStateOfWorld),该状态会显示在 Node 资源的 .Status.VolumesAttached 上。

3、Mounting Volumes

image-20240825203536933

  1. Volume Manager(Kubelet 组件) 观察到有新的使用 CSI 类型 PV 的 Pod 调度到本节点上,于是调用内部 in-tree CSI 插件(csiAttacher) 的 WaitForAttach 函数。

  2. 内部 in-tree CSI 插件(csiAttacher) 等待集群中 VolumeAttachment 对象状态 .Status.Attached 变为 true。

  3. in-tree CSI 插件(csiAttacher) 调用 MountDevice 函数,该函数内部通过 unix domain socket 调用外部 CSI 插件NodeStageVolume 函数;之后插件(csiAttacher) 调用内部 in-tree CSI 插件(csiMountMgr) 的 SetUp 函数,该函数内部会通过 unix domain socket 调用外部 CSI 插件NodePublishVolume 函数

4、Unmounting Volumes

image-20240825204224368

  1. 用户删除相关 Pod。

  2. Volume Manager(Kubelet 组件) 观察到包含 CSI 存储卷的 Pod 被删除,于是调用内部 in-tree CSI 插件(csiMountMgr) 的 TearDown 函数,该函数内部会通过 unix domain socket 调用外部 CSI 插件NodeUnpublishVolume 函数

  3. Volume Manager(Kubelet 组件) 调用内部 in-tree CSI 插件(csiAttacher) 的 UnmountDevice 函数,该函数内部会通过 unix domain socket 调用外部 CSI 插件NodeUnpublishVolume 函数

5、Detaching Volumes

image-20240825223734608

  1. AD 控制器观察到包含 CSI 存储卷的 Pod 被删除,此时该控制器会调用**内部 in-tree CSI 插件(csiAttacher)**的 Detach 函数。

  2. csiAttacher 会删除集群中相关 VolumeAttachment 对象(但由于存在 finalizer,va 对象不会立即删除)。

  3. External Attacher 观察到集群中 VolumeAttachment 对象的 DeletionTimestamp 非空,于是调用外部 CSI 插件ControllerUnpublish 函数以将卷从对应节点上摘除。外部 CSI 插件摘除成功后,External Attacher 会移除相关 VolumeAttachment 对象的 finalizer 字段,此时 VolumeAttachment 对象被彻底删除。

  4. AD 控制器内部 in-tree CSI 插件(csiAttacher) 观察到 VolumeAttachment 对象已删除,于是更新 AD 控制器中的内部状态;同时 AD 控制器更新 Node 资源,此时 Node 资源的 .Status.VolumesAttached 上已没有相关挂接信息。

6、Deleting Volumes

image-20240825225346702

  1. 用户删除相关 PVC。

  2. External Provisioner 组件观察到 PVC 删除事件,根据 PVC 的回收策略(Reclaim)执行不同操作:

    • Delete:调用外部 CSI 插件DeleteVolume 函数以删除卷;一旦卷成功删除,Provisioner 会删除集群中对应 PV 对象。

    • Retain:Provisioner 不执行卷删除操作。

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

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

相关文章

3.1ER图

ER 最后总结以下E-R图的设计原则。 1&#xff09;尽量减少实体集数量&#xff0c;能作为属性时不要作为实体集。 2&#xff09;“属性”不能再具有需要描述的性质。必须时不可分割的数据项。不能时其他属性的聚集。3&#xff09;“属性”不能与其他实体具有联系 4)综合局部E-…

XDMA原理

目录 1. PCIe to AXI Lite Master1.1. BAR Address to AXI Address 2. PCIe to AXI Memory Mapped Master3. PCIe to DMA Interface3.1. Descriptor3.2. Transfer for H2C 4. MSI-X Vector Table and PBA5. AXI Lite Slave 介绍XDMA IP核的功能及原理。 根据pg195&#xff0c;…

AI生3D:从草图到交互式3D游戏场景

随着人工智能技术的进步,3D内容生成变得越来越容易。AI生3D是一种创新的技术框架,它允许用户仅使用简单的草图和文本描述就能创建出复杂的3D游戏场景。这项技术不仅降低了3D内容创作的门槛,还极大地扩展了创意表达的可能性。 技术框架概述 AI生3D利用先进的机器学习模型来…

p2p、分布式,区块链笔记:基于IPFS实现的数据库orbitdb笔记

orbitdb orbitdb &#xff1a;Peer-to-Peer Databases for the Decentralized Web 特性说明特点无服务器、分布式、p2p编程语言JavaScript对其他语言的支持A python client for the Orbitdb HTTP API&#xff0c;go-orbit-db&#xff0c; 让我们了解一下谁在使用 js-ipfs&…

【国产游戏的机遇与挑战】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

在多云生态下,如何实现跨云的自动化身份管理?

在多云环境下实现跨云的自动化身份管理是一个重要的课题&#xff0c;因为这可以帮助企业确保用户和应用程序能够在不同云服务提供商之间无缝地访问资源&#xff0c;同时保持高度的安全性和合规性。以下是一些关键技术和实践方法&#xff0c;用于实现跨云环境下的自动化身份管理…

jenkins 开启控制台详细日志

1、开启控制台详细日志&#xff0c;查看真正报错原因 开启后生成流水线语句&#xff1a; 2、根本问题 使用jenkins再次构建&#xff0c;查看控制台日志 报错&#xff1a; 意思是在执行ssh命令的时候&#xff0c; /root/apps/jenkins/portal/portal-server/Dockerfile 路径下没…

树链剖分——从入门到入坟

树链剖分的思想及能解决的问题 树链剖分用于将树分割成若干条链的形式&#xff0c;以维护树上路径的信息。 具体来说&#xff0c;将整棵树剖分为若干条链&#xff0c;使它组合成线性结构&#xff0c;然后用其他的数据结构维护信息。 树链剖分&#xff08;树剖/链剖&#xff…

优化|计算合作博弈的成本分摊

原文&#xff1a; Caprara, A., & Letchford, A. N. (2010). New techniques for cost sharing in combinatorial optimization games. Mathematical programming, 124, 93-118. https://doi.org/10.1007/s10107-010-0357-7. 原文作者&#xff1a; Alberto Caprara, Adam N…

【js原型和原型链】

js原型和原型链 一、构造函数和原型对象中的this二、原型对象的constructor属性三、原型链四、关系图五、普通函数和函数对象 参考文章链接: link 一、构造函数和原型对象中的this 指向实例对象 // 定义构造函数function Star(name,age){this.name name;this.age age;conso…

5.10 飞行控制——自稳飞行

文章目录 5.10 飞行控制——自稳飞行5.10.1 数学模型——三轴角度系统&#xff08;1&#xff09;三轴角度系统微分方程&#xff08;2&#xff09;状态空间方程的建立 5.10.2 A1软件设计5.10.3 A1运行与调试5.10.4 三轴角度串级PID控制器5.10.5 A2软件设计5.10.6 A2运行与调试 总…

记录一个iOS工程添加文件的问题

遇到一个紧急问题&#xff0c;将工程copy了一份&#xff0c;然后需要将copy工程的一个文件夹 拖到现有的工程里面&#xff0c;由于事情紧急&#xff0c;就直接从工程目录中拖拽文件夹&#xff0c; 如下图 拖过之后&#xff0c;本地项目能跑了&#xff0c;但是远端自动化构建是…

World of Warcraft [CLASSIC][80][Grandel] Equipment Recovery

World of Warcraft [CLASSIC][80][Grandel] Equipment Recovery 魔兽世界怀旧服装备恢复流程 打开战网-服务-误删恢复 选择角色 恢复装备 选中自己不小心卖点的装备&#xff0c;例如我是2024.07.01卖掉T3肩膀 联系方式&#xff0c;描述&#xff0c;误操作时间 客服邮件 邮件中…

【性能优化】:探索系统瓶颈的根源(一)

背景 本次分享的这个项目是财务系统&#xff0c;众所周知&#xff0c;财务项目的特点是系统复杂、业务繁琐&#xff0c;开发一个完整的财务平台&#xff0c;开发周期长&#xff0c;参与人员多&#xff0c;且每月月初需要产出财务报表以供财务人员分析审核。 所以&#xff0c;财…

【大模型从入门到精通43】LLM部署运维(LLM Ops)使用Kubeflow Pipelines掌握LLM工作流5

这里写目录标题 实践练习 实践练习 设置Kubeflow Pipelines SDK # 导入Kubeflow Pipelines SDK中的必要模块 from kfp import dsl, compiler# 抑制来自Kubeflow Pipelines SDK的FutureWarning警告 import warnings warnings.filterwarnings("ignore", categoryFutu…

网络路由介绍,route指令,查询路由表的过程,默认路由

目录 路由 本地主机的路由功能 引入 route指令 查询路由表的过程 介绍 示例 默认路由 注意 路由 本地主机的路由功能 引入 报文经过多个路由器转发至公网,再从公网定位后转发至私网,最终到达目标主机 而报文肯定是要先经过本地主机的 所以本地主机也具有路由功能,也…

不平衡分类阈值移动的简单介绍

不平衡分类阈值移动的简单介绍 分类预测模型通常涉及预测类别标签。 尽管如此&#xff0c;许多机器学习算法能够预测类别成员的概率或得分&#xff0c;并且必须对其进行解释&#xff0c;然后才能将其映射到明确的类别标签。这是通过使用阈值&#xff08;例如 0.5&#xff09;…

redis面试(二十三)写锁释放

先加了写锁&#xff0c;后面再次加写锁或者读锁 anyLock: { “mode”: “write”, “UUID_01:threadId_01:write”: 2, “UUID_01:threadId_01”: 1 } 写锁的释放lua脚本在这里 RedissonWriteLock.unlockInnerAsync() 比如说现在的参数是这 KEYS[1] anyLock KEYS[2] redi…

计算机毕业设计选题推荐-摇滚音乐鉴赏网站-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

提示工程自动化实践

提示工程很糟糕。 这是使用大型语言模型最乏味的部分。这些模型非常挑剔&#xff0c;对提示进行看似无害的更改可能会导致截然不同的结果。我厌倦了手动调整、不系统的变化以及与手动提示工程相关的头痛…… 首先让我们统一认识&#xff0c;提示工程是指对 AI 模型给出的指令…