K8S 基于本地存储的持久卷
假设有如下三个节点的 K8S 集群:
k8s31master 是控制节点
k8s31node1、k8s31node2 是工作节点
容器运行时是 containerd
一、背景分析
阅读本文,默认您有 PV-PVC、hostPath 相关知识。
由于安全方面的考虑,K8S 官方并不推荐 hostPath + 节点选择器 来作为 Pod 的持久化方案。
转而提倡 local 持久卷的方式。我们今天就来实践一下 local 持久卷。
二、no-provisioner 方式(无供应商方式)
1)创建 StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: local-storage # 名称需与 PV 中的 storageClassName 对应
provisioner: kubernetes.io/no-provisioner # 关键:本地卷不支持动态供应
volumeBindingMode: WaitForFirstConsumer # 关键:延迟绑定直到 Pod 调度
reclaimPolicy: Delete # 卷回收策略(Retain/Delete)
provisioner=kubernetes.io/no-provisioner:本地卷还不支持动态制备; 然而还是需要创建 StorageClass 以延迟卷绑定,直到 Pod 被实际调度到合适的节点。
volumeBindingMode=WaitForFirstConsumer:延迟 PVC 与 PV 的绑定。延迟卷绑定使得调度器在为 PersistentVolumeClaim 选择一个合适的 PersistentVolume 时能考虑到所有 Pod 的调度限制。
2)创建挂载目录
因为本地卷不支持动态制备,所以需要在每个工作节点上手工创建挂载目录。
# node1 创建
[root@k8s31node1 ~]# mkdir -p /data/local_storage
# node2 创建
[root@k8s31node2 ~]# mkdir -p /data/local_storage
3)创建 PV
apiVersion: v1
kind: PersistentVolume
metadata:name: local-rwo-pvlabels:type: local
spec:capacity:storage: 1Gi # 定义存储容量volumeMode: Filesystem # 可选:Filesystem 或 BlockaccessModes:- ReadWriteOnce # 关键:仅允许单节点读写挂载persistentVolumeReclaimPolicy: Delete # 可选:Retain/Recycle/DeletestorageClassName: local-storage # 引用上面创建的存储类local:path: /data/local_storage # 节点上的实际路径nodeAffinity: # 限制卷只能被特定节点使用required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s31node1 # 替换为你的节点名
accessModes=ReadWriteOnce:因为是本地存储,所以只允许单节点挂载。
nodeAffinity:节点亲和性,限制卷只能被具有标签 kubernetes.io/hostname 且值为 k8s31node1 的节点使用。可以通过命令 kubectl get node --show-labels 查看节点标签。
- 查看 pv
STATUS=Available:实现可用状态。
4)创建 PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: local-rwo-pvc
spec: storageClassName: local-storageaccessModes:- ReadWriteOnceresources:requests:storage: 1Gi
- 查看 pv,pvc
因为是延迟绑定,所以 PVC 显示为 Pending 状态。只有当 Pod 挂载了这个 PVC,K8S 才会寻找合适的 PV 进行绑定。
5)创建部署
apiVersion: apps/v1
kind: Deployment
metadata:name: local-rwo-deploy
spec:replicas: 2selector:matchLabels:app: local-rwo-podtemplate:metadata:labels:app: local-rwo-podspec:volumes:- name: local-rwo-volumespersistentVolumeClaim:claimName: local-rwo-pvccontainers:- name: nginximage: nginx:1.14.2imagePullPolicy: IfNotPresentvolumeMounts:- name: local-rwo-volumesmountPath: /usr/share/nginx/htmlreadOnly: trueports:- containerPort: 80protocol: TCP
- 查看部署的 Pod
可以看到,因为 PV 节点亲和性的设置,所有的 Pod 会被调度到同一个节点 node1 上。
这个时候的 PV、PVC 显示绑定状态。
6)RWO 验证
此时,我们再创建一个 Pod 挂载这个 PVC,然后通过节点选择器,让它被调度到 node2 上,看看会发生什么?
apiVersion: v1
kind: Pod
metadata:name: local-node2-pod
spec:nodeName: k8s31node2 # 节点选择器volumes:- name: storagepersistentVolumeClaim:claimName: local-rwo-pvc # 需提前创建对应的 PVCcontainers:- name: nginximage: nginx:1.14.2imagePullPolicy: IfNotPresentvolumeMounts:- name: storagemountPath: /usr/share/nginx/htmlreadOnly: trueports:- containerPort: 80protocol: TCP
会发现 Pod 创建不成功。
- 查看描述
kubectl describe pod local-node2-pod
Warning FailedMount 9s (x7 over 40s) kubelet MountVolume.NodeAffinity check failed for volume "local-rwo-pv" : no matching NodeSelectorTerms
从这也能看出,本地存储实现了严格的 RWO。
7)数据持久性验证
在 node1 本地目录创建文件
[root@k8s31node1 ~]# echo "LocalStorage" > /data/local_storage/index.html
数据在 Pod1 跟 Pod2 中是共享的。
- 删除部署再重新执行
kubectl delete -f deploy.yaml
kubectl apply -f deploy.yaml
pod 被删除后重新部署,数据还在。
8)Delete 自动回收验证
删除部署、PVC 看看有没有帮我们自动删除 PV
kubectl delete -f deploy.yaml
kubectl delete -f pvc.yaml
kubectl get pv
会发现 PV 的状态是 Failed。说明自动回收失败了。
- 查看 PV 描述
Warning VolumeFailedDelete 2m51s persistentvolume-controller error getting deleter volume plugin for volume "local-rwo-pv": no volume plugin matched
卷的自动删除失败,当前的卷插件并不支持 自动回收。
9)手工回收
kubectl delete -f pv.yaml
在 node1 上删除数据文件
三、provisioner 方式(静态供应商方式)
1)介绍
kubernetes-sigs/sig-storage-local-static-provisioner 是 K8S 本地存储的静态外部供应商。
所谓静态,是说,虽然它可以帮我们创建 PV 与清理 PV 上的数据,但是真实存储目录的创建,还是需要集群管理员来做。本质上,它还是一种 PV 的静态供应方式。
- 原理
英文原文:
There is one provisioner instance on each node in the cluster. Each instance is responsible for monitoring and managing the local volumes on its node.
The basic components of the provisioner are as follows:
Discovery: The discovery routine periodically reads the configured discovery directories and looks for new mount points that don't have a PV, and creates a PV for it.
Deleter: The deleter routine is invoked by the Informer when a PV phase changes. If the phase is Released, then it cleans up the volume and deletes the PV API object.
Cache: A central cache stores all the Local PersistentVolumes that the provisioner has created. It is populated by a PV informer that filters out the PVs that belong to this node and have been created by this provisioner. It is used by the Discovery and Deleter routines to get the existing PVs.
Controller: The controller runs a sync loop that coordinates the other components. The discovery and deleter run serially to simplify synchronization with the cache and create/delete operations.
中文翻译:
在每个集群节点上都有一个供应者实例。每个实例负责监控和管理其节点上的本地卷。供应者的基本组件如下:
- 发现模块:
- 发现程序会定期读取配置好的发现目录,寻找没有 PV 的新挂载点,并为它们创建 PV。
- 删除模块:
- 当 PV 状态发生变化时,Informer 会调用删除程序。
- 如果状态是"已释放",它会清理卷并删除 PV API 对象。
- 缓存:
- 中央缓存存储供应者创建的所有本地持久卷。
- 它由一个 PV Informer 填充,该 Informer 过滤出属于该节点且由该供应者创建的 PV。
- 发现和删除程序使用它来获取现有 PV。
- 控制器:
- 控制器运行一个同步循环来协调其他组件。
- 发现和删除程序串行运行,以简化与缓存的同步以及创建/删除操作。
简单来说:
sig-storage-local-static-provisioner 会用 DaemonSet 控制器的方式,在每个集群工作节点上,都创建出一个 pod,pod 名字叫 provisioner,它会负责监听发现目录(默认是 /mnt/fast-disks)有没有新的挂载点进来,有的话,就以这个挂载点创建一个新的 PV。
我们将基于 开始文档 来进行配置
2)创建并挂载发现目录
在所有工作节点上创建发现目录(/mnt/fast-disks)和存储目录(/data/local_storage/fast-disks)
# 创建发现目录和其子目录 v1
[root@k8s31node1 ~]# mkdir -p /mnt/fast-disks/v1
# 创建实际存储目录
[root@k8s31node1 ~]# mkdir -p /data/local_storage/fast-disks/v1
# 执行绑定挂载
[root@k8s31node1 ~]# mount --bind /data/local_storage/fast-disks/v1 /mnt/fast-disks/v1# 创建发现目录和其子目录 v1
[root@k8s31node2 ~]# mkdir -p /mnt/fast-disks/v1
# 创建实际存储目录
[root@k8s31node2 ~]# mkdir -p /data/local_storage/fast-disks/v1
# 执行绑定挂载
[root@k8s31node2 ~]# mount --bind /data/local_storage/fast-disks/v1 /mnt/fast-disks/v1
mount 命令常用来将外部设备如磁盘、U盘等挂载进 Linux 系统中,我手头没有多余的硬盘来演示,所以我把文件系统目录 /data/local_storage/fast-disks/v1 通过绑定挂载的方式,挂载到 /mnt/fast-disks/v1。
3)创建 StorageClass
执行 sig-storage-local-static-provisioner\deployment\kubernetes\example\default_example_storageclass.yaml
kubectl apply -f default_example_storageclass.yaml
# Only create this for K8s 1.9+
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: fast-disks
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
# Supported policies: Delete, Retain
reclaimPolicy: Delete
- 创建名为 fast-disks 的 StorageClass:
4)镜像准备
# 找个国内好访问的镜像站,拉取镜像
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/sig-storage/local-volume-provisioner:v2.6.0
# 名字太长,改短一点
docker tag 镜像ID registry.k8s.io/sig-storage/local-volume-provisioner:v2.6.0
# 导出镜像
docker save -o local-volume-provisioner.tar.gz registry.k8s.io/sig-storage/local-volume-provisioner:v2.6.0
# 上传到工作节点
scp local-volume-provisioner.tar.gz 192.168.40.20:/root
scp local-volume-provisioner.tar.gz 192.168.40.30:/root
在工作节点导入镜像
[root@k8s31node1 ~]# ctr -n=k8s.io images import local-volume-provisioner.tar.gz
[root@k8s31node1 ~]# ctr -n=k8s.io images ls | grep local[root@k8s31node2 ~]# ctr -n=k8s.io images import local-volume-provisioner.tar.gz
[root@k8s31node2 ~]# ctr -n=k8s.io images ls | grep local
5)部署 provisioner
修改 sig-storage-local-static-provisioner\deployment\kubernetes\example\default_example_provisioner_generated.yaml
---
# Source: provisioner/templates/provisioner.yamlapiVersion: v1
kind: ConfigMap
metadata:name: local-provisioner-config namespace: default
data:storageClassMap: | fast-disks:hostDir: /mnt/fast-disksmountDir: /mnt/fast-disks blockCleanerCommand:- "/scripts/shred.sh"- "2"volumeMode: FilesystemfsType: ext4namePattern: "*"
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: local-volume-provisionernamespace: defaultlabels:app: local-volume-provisioner
spec:selector:matchLabels:app: local-volume-provisioner template:metadata:labels:app: local-volume-provisionerspec:serviceAccountName: local-storage-admincontainers:- image: "registry.k8s.io/sig-storage/local-volume-provisioner:v2.6.0" # 修改镜像版本imagePullPolicy: "IfNotPresent" # 修改镜像拉取策略name: provisioner securityContext:privileged: trueenv:- name: MY_NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeNamevolumeMounts:- mountPath: /etc/provisioner/config name: provisioner-configreadOnly: true - mountPath: /mnt/fast-disks name: fast-disksmountPropagation: "HostToContainer" volumes:- name: provisioner-configconfigMap:name: local-provisioner-config - name: fast-diskshostPath:path: /mnt/fast-disks ---
# Source: provisioner/templates/provisioner-service-account.yamlapiVersion: v1
kind: ServiceAccount
metadata:name: local-storage-adminnamespace: default---
# Source: provisioner/templates/provisioner-cluster-role-binding.yamlapiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: local-storage-provisioner-pv-bindingnamespace: default
subjects:
- kind: ServiceAccountname: local-storage-adminnamespace: default
roleRef:kind: ClusterRolename: system:persistent-volume-provisionerapiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: local-storage-provisioner-node-clusterrole
rules:
- apiGroups: [""]resources: ["nodes"]verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: local-storage-provisioner-node-bindingnamespace: default
subjects:
- kind: ServiceAccountname: local-storage-adminnamespace: default
roleRef:kind: ClusterRolename: local-storage-provisioner-node-clusterroleapiGroup: rbac.authorization.k8s.io
修改镜像版本与镜像拉取策略。
provisioner 利用 DaemonSet 控制器在每个工作节点上,都创建出一个 pod,监听发现目录(默认是 /mnt/fast-disks)挂载点,创建对应 PV。pod 要操作 node,要调用 K8S API Server,所以脚本的内容,就是创建 ServiceAccount、创建集群角色、创建账号角色绑定。
kubectl apply -f default_example_provisioner_generated.yaml
执行成功后,会创建一个 local-volume-provisioner DaemonSet,并在每个节点上创建一个 Pod。
这些 Pod 会监视每个节点发现目录的挂载点,然后创建相应的 PV:
这些 PV 都配置对应节点的节点亲和性,后续我们的业务 Pod 使用这些 PV 存储的时候,就会被调度到 PV 对应的节点上——哪个 Pod 使用了 PV,就会被调度到 PV 对应的节点上。
6)创建 PVC
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: pvc1
spec:accessModes:- ReadWriteOnceresources:requests:storage: 100MistorageClassName: fast-disks
storageClassName: fast-disks
kubectl apply -f pvc1.yaml
7)创建 Pod,使用 PVC
apiVersion: v1
kind: Pod
metadata:name: local-pod1
spec:volumes:- name: storagepersistentVolumeClaim:claimName: pvc1 # 使用上面的 PVCcontainers:- name: nginximage: nginx:1.14.2imagePullPolicy: IfNotPresentvolumeMounts:- name: storagemountPath: /usr/share/nginx/htmlreadOnly: trueports:- containerPort: 80protocol: TCP
此时,PV local-pv-4df7cdd7 已经被绑定给了 pvc1。
local-pv-4df7cdd7 位于 node2,pod 也被调度到 node2。
此时,在 node2 存储目录 /data/local_storage/fast-disks/v1 创建文件 index.html。
是可以被挂载进我们的 Pod local-pod1 的。
8)Delete 自动回收验证
# 删除 pod
kubectl delete -f pod1.yaml
# 删除 PVC
kubectl delete -f pvc1.yaml
此时可以看到,local-pv-4df7cdd7 PV 又被释放了出来。
node2 上的数据,也被清理掉了。
9)后续运维
后续运维,就只需要在每个节点上创建更多的挂载点,然后再创建对应数量的 PVC,以供开发建 Pod 使用。可以使用脚本,提高创建效率。
for i in $(seq 1 5); domkdir -p /mnt/fast-disks/v${i} mkdir -p /data/local_storage/fast-disks/v${i}mount --bind /data/local_storage/fast-disks/v${i} /mnt/fast-disks/v${i}
done
后续运维,还可以把临时挂载改为永久挂载,以防节点重启,挂载丢失。
相关文章:
K8S 基于本地存储的持久卷
假设有如下三个节点的 K8S 集群: k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、背景分析 阅读本文,默认您有 PV-PVC、hostPath 相关知识。 由于安全方面的考虑,K8S 官方并不推荐 hostPath …...
LED实验
目录 1.LED介绍 1.1LED原理图: 2.单片机运行代码的流程 3.进制的转换 4.C51数据类型 5.小编的单片机型号:STC89C52RC/LE52RC,最高波特率:9600 6.点亮一个LED 代码 步骤 代码: 7.LED闪烁 在STC内操作&#x…...
python+pytest接口自动化测试--日志记录
前言:代码可以直接复制使用 解决问题: 问题1:日志重复记录的问题,比如运行一个模块日志会记录很多遍(通过handlers是否存在解决的) 问题2:运行测试用例进行多个模块相互调用.日志记录不全的问题(通过共享公共的handlers解决问题) 首先写一个日志记录的工具 # 这个是个日志的…...
Android 蓝牙开发调试总结
Android 蓝牙开发调试总结 文章目录 Android 蓝牙开发调试总结一、前言二、蓝牙开发1、开关和连接控制2、相关日志3、相关广播4、demo示例 三、其他1、Android 蓝牙开发调试小结2、Android14 蓝牙启动流程3、Android14 蓝牙 BluetoothService 启动和相关代码介绍4、Android13 蓝…...
混淆矩阵(Confusion Matrix)
混淆矩阵(Confusion Matrix)是一个用于评估分类模型性能的工具,特别是在机器学习和统计学领域。它展示了模型预测结果与实际结果之间的关系。混淆矩阵通常用于二分类或多分类问题中,但也可以扩展到更多类别的情况。 一、混淆矩阵…...
C语言——操作符
一.操作符的分类 算术操作符: - * / %移位操作符:<< >>位操作符: & | ^赋值操作符: - * / % > & | ^单⽬操作符: ! -- & * - ~ sizeof …...
大数据处理利器:Hadoop 入门指南
一、Hadoop 是什么?—— 分布式计算的基石 在大数据时代,处理海量数据需要强大的技术支撑,Hadoop 应运而生。Apache Hadoop 是一个开源的分布式计算框架,致力于为大规模数据集提供可靠、可扩展的分布式处理能力。其核心设计理念是…...
追踪大型语言模型的思想(上)(来自针对Claude的分析)
概述 像 Claude 这样的语言模型并非由人类直接编程,而是通过大量数据进行训练。在训练过程中,它们会学习解决问题的策略。这些策略被编码在模型为每个单词执行的数十亿次计算中。对于我们这些模型开发者来说,这些策略是难以捉摸的。这意…...
系统 Python 与 Conda 环境的灵活切换
在现代 Python 开发中,经常需要在系统 Python 和 Conda 环境中的 Python 之间切换。无论是处理不同项目的依赖冲突,还是测试代码在不同 Python 版本下的兼容性,灵活切换 Python 环境都是开发者的必备技能。本文将详细介绍如何实现 Python 环境的灵活切换,并提供 Conda 命令…...
【HTTP】《HTTP 全原理解析:从请求到响应的奇妙之旅》
文章目录 一、HTTP 协议1.1、HTTP 是什么1.2、理解 "应用层协议"1.3、理解 HTTP 协议的工作过程1.4、HTTP协议格式1.5、协议格式总结 二、HTTP 请求1.1、认识 URL1.1.1、URL 基本格式1.1.2、关于 URL encode 1.2、认识 "方法"1.2.1 、GET 方法1.2.2、 POST…...
重生之我在2024学Fine-tuning
一、Fine-tuning(微调)概述 Fine-tuning(微调)是机器学习和深度学习中的一个重要概念,特别是在预训练模型的应用上。它指的是在模型已经通过大量数据训练得到一个通用的预训练模型后,再针对特定的任务或数据…...
若依前后端分离项目中可以删除哪些原若依有的?
在若依(RuoYi)前后端分离项目中完成二次开发后,可以删除以下未使用的模块和文件以简化项目结构。以下分模块和风险点说明: --- ### **一、后端(Spring Boot)可删除内容** #### 1. **未使用的功能模块** …...
element-plus中,vue3项目,el-input密码框禁止浏览器自动弹出浏览器历史密码提示框
原代码(密码框是text框): <el-form-item label"用户名" :label-width"formLabelWidth" v-if"!localOrhuawei" prop"userName"><el-input v-model"formDialog.userName" />&l…...
二叉树的遍历与构造
唉,好想回家,我想回家跟馒头酱玩,想老爸老妈。如果上天再给我一次选择的机会,我会选择当一只小动物,或者当棵大树也好,或者我希望自己不要有那么多多余的情绪,不要太被别人影响,开心…...
「Mac畅玩AIGC与多模态23」开发篇19 - Markdown 富文本输出工作流示例
一、概述 本篇基于格式化文本整合的经验,进一步介绍如何通过 LLM 输出标准 Markdown 内容,并在前端正确渲染出标题、列表、加粗等富文本格式,提升展示效果与内容结构可读性。 二、环境准备 macOS 系统Dify 平台已部署并可访问 三、在 Dif…...
记录学习《手动学习深度学习》这本书的笔记(十)
因为最近在做《语音与语言理解综合处理》的实验,所以打算先看第14章:自然语言处理:预训练和第15章:自然语言处理:应用,之后再来看第13章:计算机视觉。 第十四章:自然语言处理&#…...
Flowable7.x学习笔记(二十一)查看我的发起
前言 “查看我的发起”功能,就是将当前用户作为流程发起人启动的所有流程实例集中展示,帮助用户随时跟踪自己提交的业务请求的状态与历史,提升透明度与可控性。 业务人员通常不知道流程引擎底层如何运转,只关心“我提交的报销/申请…...
【Bootstrap V4系列】学习入门教程之 组件-折叠(Collapse)
Bootstrap V4系列 学习入门教程之 组件-折叠(Collapse) 折叠(Collapse)How it works一、Example二、Horizontal 水平的三、Multiple targets 多个目标四、Accordion example 手风琴示例 折叠(Collapse) 通…...
ROS1和ROS2使用桥接工具通信
前提:主从机在同一局域网内,可以互相ping通 我的两个设备其中一个无法连接wifi,ubuntu老生常谈的问题.....,获得新的技能:手机蓝牙提供网络,两个设备连接手机蓝牙就可以连接网络并且处于同一个局域网内。 我的主机为…...
尤雨溪宣布:Vue 生态正式引入 AI
在前端开发领域,Vue 框架一直以其易用性和灵活性受到广大开发者的喜爱。 而如今,Vue 生态在人工智能(AI)领域的应用上又迈出了重要的一步。 尤雨溪近日宣布,Vue、Vite 和 Rolldown 的文档网站均已添加了llms.txt文件,这一举措旨在让大型语言模型(LLM)更方便地理解这些…...
分布式id的两大门派!时钟回拨问题的解决方案!
2.1 两大门派 目前业界的分布式ID实现路径归结起来有两派:一派以雪花算法为代表,不强依赖DB能力,只使用分布式节点自身信息(时间戳节点ID序列号)的编码生成唯一序列,好处是去中心化、无单点风险࿱…...
QMK键盘固件配置详解
QMK键盘固件配置详解 前言 大家好!今天给大家带来QMK键盘固件配置的详细指南。如果你正在DIY机械键盘或者想要给自己的键盘刷固件,这篇文章绝对不容错过。QMK是目前最流行的开源键盘固件框架之一,它允许我们对键盘进行高度自定义。接下来&a…...
Jenkins 服务器上安装 Git
安装 Git # 更新包列表 sudo apt update# 安装 Git sudo apt install git 验证安装 # 检查 Git 版本 git --version 查看所有全局配置 git config --global --list 查看特定配置项 # 查看用户名配置 git config --global user.name# 查看邮箱配置 git config --global u…...
自由浮动时间和总浮动时间对比
一、自由浮动时间的定义 在项目进度管理中,自由浮动时间(Free Float)是指在不推迟项目后续任务最早开始时间的前提下,一个任务能够延迟的时间长度。它是针对单个任务而言的,主要考虑该任务与其紧后任务之间的关系。 …...
2025.05.07-华为机考第二题200分
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 社区智能安防系统设计 问题描述 随着智慧社区建设的发展,LYA小区需要设计一套高效的安防监控系统。该小区布局可以用一棵二叉树来表示,树的每个节点代表一户居民家庭。 为了…...
分布式架构详解
一、分布式架构的概念与设计目标 1. 基本概念 分布式架构(Distributed Architecture)是分布式计算技术的应用和工具,指将一个复杂系统拆分为多个独立的组件(或服务),并将这些组件部署在不同物理节点(服务…...
码蹄集——平方根X、整除幸运数
目录 MT1075 平方根X MT1078 整除幸运数 MT1075 平方根X 知识点: 上取整:ceil;下取整:floor;四舍五入:round 判断是否为完全平方数的方法:利用sqrt函数结果为double,将其结果相乘&a…...
【MATLAB源码-第277期】基于matlab的AF中继系统仿真,AF和直传误码率对比、不同中继位置误码率对比、信道容量、中继功率分配以及终端概率。
操作环境: MATLAB 2022a 1、算法描述 在AF(放大转发)中继通信系统中,信号的传输质量和效率受到多个因素的影响,理解这些因素对于系统的优化至关重要。AF中继通信的基本架构由发射端、中继节点和接收端组成。发射端负…...
ACE-Step - 20秒生成4分钟完整歌曲,音乐界的Stable Diffusion,支持50系显卡 本地一键整合包下载
ACE-Step 是由ACE Studio与StepFun联合开发的音乐生成模型,被誉为“音乐界的Stable Diffusion”。该模型以其惊人的生成速度和多样化功能引发行业热议,支持19种语言,可在短短20秒内生成一首长达4分钟的完整音乐作品,效率比主流模型…...
007 Linux 开发工具(上)—— vim、解放sudo、gc+
🦄 个人主页: 小米里的大麦-CSDN博客 🎏 所属专栏: Linux_小米里的大麦的博客-CSDN博客 🎁 GitHub主页: 小米里的大麦的 GitHub ⚙️ 操作环境: Visual Studio 2022 文章目录 Linux 开发工具(上)Linux 编辑器 —— vim…...
React学习路线图-Gemini版
前端开发学习路线图 (针对编程新手,主攻 React 框架) 总原则:先打好地基,再盖楼。 无论学习哪个框架,扎实的 HTML、CSS 和 JavaScript 基础是成功的关键。React 是基于 JavaScript 构建的,所以深入理解 JS 至关重要。…...
注意力(Attention)机制详解(附代码)
Attention机制是深度学习中的一种技术,特别是在自然语言处理(NLP)和计算机视觉领域中得到了广泛的应用。它的核心思想是模仿人类的注意力机制,即人类在处理信息时会集中注意力在某些关键部分上,而忽略其他不那么重要的…...
国内外Agent产品进展汇总
MCP(Model Context Protocol)是一个开放标准协议,旨在标准化应用程序向大型语言模型提供上下文信息的方式。通过集成MCP扩展,Agent可以访问和利用各种外部工具和服务,丰富了Agent的功能范围,使其能够执行更…...
AI Workflow
AI Workflow(人工智能工作流)指的是在构建、部署和管理AI模型与应用时所涉及的一系列步骤和流程。它将数据处理、模型训练、评估、部署及监控等环节有机结合起来,以实现高效、可重复的AI解决方案开发过程。以下是对AI Workflow核心组成部分及…...
MySQL OCP 认证限时免费活动 7 月 31 日 前截止!!!
为庆祝 MySQL 数据库发布 30 周年,Oracle 官方推出限时福利:2025 年 4 月 20 日至 7 月 31 日期间,所有人均可免费报考 MySQL OCP(Oracle Certified Professional)认证考试。该认证验证持证者在 MySQL 数据库管理、优化…...
【无标题】MPC软件
MPC软件是一款先进的多变量预测控制解决方案 专为复杂工业过程优化设计 **核心功能** 实时动态建模 多变量协调控制 滚动时域优化 自适应调整策略 干扰抑制 鲁棒性强 适用于时变系统 **技术优势** 基于模型预测算法 提前计算最优控制序列 处理输入输出约束 保障系…...
【EasyPan】loadDataList方法及checkRootFilePid方法解析
【EasyPan】项目常见问题解答(自用&持续更新中…)汇总版 一、loadDataList方法概览 /*** 文件列表加载接口* param session HTTP会话对象* param shareId 必须参数,分享ID(使用VerifyParam进行非空校验)* param …...
Java程序题案例分析
目录 一、基础语法 1. 类与对象 2. 接口与抽象类 二、面向对象语法 1. 继承与多态 2. 四种访问修饰符 三、设计模式相关语法 一、策略模式(接口回调实现) 1. 完整实现与解析 二、工厂模式(静态工厂方法实现) 1. 完整实…...
【Lanqiao】数位翻转
题目: 思路: 写蓝桥不能不写dp,就像.... 题目数据给的不大,所以我们可以考虑一种 n*m 的做法,那么对于这种题目可以想到的是用dp来写,但是如何构造转移方程与状态是个难事 由于这题对于任意一个数我们有两…...
基于QT(C++)实现(图形界面)校园导览系统
校园导览系统 一、任务描述 大学校园充满着忙忙碌碌的学生和老师们,但是有时候用户宝贵的时间会被复杂的道路和愈来愈多的建筑物的阻碍而浪费,为了不让同学们在自己的目的地的寻路过程中花费更多的时间,我们着手开发这样一款校园导览系统。…...
【C/C++】虚函数
📘 C 虚函数详解(Virtual Function) 📌 什么是虚函数? 虚函数(Virtual Function) 是 C 中实现运行时多态(Runtime Polymorphism) 的核心机制。 它允许派生类 重写&…...
no main manifest attribute, in xxx.jar
1、问题: Spring Boot项目在idea中可以正常运行,但是运行Spring Boot生成的jar包,报错: 1、no main manifest attribute, in xxx.jar 2、xxx.jar中没有主清单属性 2、解决办法: 删除pom.xml中<configuration&g…...
使用 AI 如何高效解析视频内容?生成思维导图或分时段概括总结
一、前言 AI 发展的如此迅速,有人想通过 AI 提效对视频的解析,怎么做呢? 豆包里面有 AI 视频总结的功能,可以解析bilibili网站上部分视频,如下图所示: 但有的视频解析时提示: 所以呢&#x…...
比较入站和出站防火墙规则
组织需要仔细配置防火墙规则,监控网络的传入和传出流量,从而最大限度降低遭受攻击的风险。在有效管理入站和出站防火墙规则前,了解入站与出站流量的区别至关重要。 一、什么是入站流量? 入站流量指的是并非源自网络内部…...
开放式耳机什么品牌的好用?性价比高的开放式耳机品牌推荐一下
这几年蓝牙耳机发展得很快,从最早的入耳式,到现在流行的开放式,选择越来越多。我自己是比较偏向佩戴舒适的类型,用过开放式之后就回不去了。它不堵耳、不压迫,戴着轻松不累,对我这种耳朵容易不适的人来说太…...
WPF之高级绑定技术
文章目录 引言多重绑定(MultiBinding)基本概念实现自定义IMultiValueConverterMultiBinding在XAML中的应用示例使用StringFormat简化MultiBinding 优先级绑定(PriorityBinding)基本概念PriorityBinding示例实现PriorityBinding的后…...
k8s高可用集群,自动化更新证书脚本
#!/bin/bash # 切换到证书目录 cd /etc/kubernetes/pki || exit # 备份原有证书(重要!) sudo cp -r apiserver.crt apiserver.key \ apiserver-etcd-client.crt apiserver-etcd-client.key \ apiserver-kubelet-client…...
【Python 函数】
Python 中的函数(Function)是可重复使用的代码块,用于封装特定功能并提高代码复用性。以下是函数的核心知识点: 一、基础语法 1. 定义函数 def greet(name):"""打印问候语""" # 文档字符串&…...
Filecoin矿工资金管理指南:使用lotus-shed actor withdraw工具
Filecoin矿工资金管理指南:使用lotus-shed actor withdraw工具 引言lotus-shed actor withdraw命令概述命令语法参数选项详解常见使用场景1. 提取全部可用余额2. 提取指定数量的FIL3. 通过受益人地址发送交易 最佳实践资金安全管理操作流程优化 常见问题与解决方案提…...
AI辅助DevOps与自动化测试:重构软件工程效率边界
随着AI技术渗透至软件开发生命周期,DevOps与自动化测试领域正经历颠覆性变革。本文系统性解析AI在需求分析、测试用例生成、部署决策、异常检测等环节的技术实现路径,结合微软Azure DevOps、Tesla自动驾驶测试等典型场景,探讨AI如何突破传统效…...