持续集成部署-k8s-配置与存储-存储类:动态创建NFS-PV案例
动态创建NFS-PV案例
- 1. 前置条件
- 2. StorageClass 存储类的概念和使用
- 3. RBAC 配置
- 4. storageClass 配置
- 5. 创建应用,测试 PVC 的自动配置
- 6. 解决 PVC 为 Pending 状态问题
- 7. 单独测试自动创建 PVC
1. 前置条件
这里使用 NFS 存储的方式,来演示动态创建 PV 的案例。
前置条件是需要在 K8s 集群中安装 NFS 的环境,安装可参考:持续集成部署-k8s-数据持久化-NFS安装与使用
确保 NFS 服务器正常可用之后,接着后续的步骤操作。
验证配置是否生效:
- 在当前nfs-server 上查看:
[root@docker-54 nfs]# showmount --export
Export list for docker-54:
/home/nfs/ro 192.168.104.0/24
/home/nfs/rw 192.168.104.0/24
[root@docker-54 nfs]#
- 在 nfs-client 上查看:
[root@docker-55 ~]# showmount -e master
Export list for master:
/home/nfs/ro 192.168.104.0/24
/home/nfs/rw 192.168.104.0/24
[root@docker-55 ~]# [root@docker-56 ~]# showmount -e master
Export list for master:
/home/nfs/ro 192.168.104.0/24
/home/nfs/rw 192.168.104.0/24
[root@docker-56 ~]#
可以看到,两台 Node 节点上均已显示 NFS Server 的信息了。
在动态创建 PV 之前,我们需要先了解下用到的组件的基础概念。
2. StorageClass 存储类的概念和使用
在 Kubernetes 中,StorageClass 是用于定义动态存储卷的对象。它允许管理员定义不同类型的存储,并使开发人员能够按需创建 PVC(Persistent Volume Claim 持久卷声明)。
StorageClass 可以看作是一种存储资源的抽象,它定义了存储的类型、属性和参数等信息。Kubernetes 可以根据这些信息动态地创建 PV(Persistent Volume 持久卷),并将其绑定到 PVC 上。

在数据存储,动态构建 PV 的过程,如上面的流程图所示。
但是在我们创建的过程中,则需要先创建 StorageClass,才能保证在 PVC 使用时,对应上,另外 在 Pod 创建时指定的 PVC 也是需要提前创建才行。
3. RBAC 配置
新建配置文件:nfs-provisioner-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisionernamespace: kube-system
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]
- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]
- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccountname: nfs-client-provisionernamespace: kube-system
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisioner
rules:
- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisioner
subjects:
- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: kube-system
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io
这个对应了 k8s 中角色权限的部分内容,在 k8s 的服务管理方面,其实就是一套类似 HTTP 的 RESTful 风格的 API,这些 API 默认是具备一个 RBAC 权限的。
上面的配置文件创建了角色、账号,以及如何把角色和账号关联起来。
4. storageClass 配置
新建的配置文件:nfs-storage-class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: managed-nfs-storage
provisioner: fuseim.pri/ifs
parameters:archiveOnDelete: "false" # 是否存档 false 表示不存档,会删除 oldPath 下的数据,true表示会存档,会重命名路径
reclaimPolicy: Retain # 回收策略, 默认为 Delete 可以配置为 Retain
volumeBindingMode: Immediate # 默认为 Immediate,表示创建 PVC 立即绑定,只有azuredisk 和 AWSelasticblockstore 支持其他值
新建制备器配置文件:nfs-provisioner-deployment.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisionernamespace: kube-system
---
kind: Deployment
apiVersion: apps/v1
metadata:namespace: kube-systemname: nfs-client-provisionerlabels:app: nfs-client-provisioner
spec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccount: nfs-client-provisionercontainers:- name: nfs-client-provisioner
# image: quay.io/external_storage/nfs-client-provisioner:latestimage: registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0volumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: fuseim.pri/ifs # 对应 sc 里面的provisioner 的名称- name: NFS_SERVERvalue: 192.168.104.54 # nfs 服务的IP 和 路径 都需要关联上才行- name: NFS_PATHvalue: /home/nfs/rwvolumes:- name: nfs-client-rootnfs:server: 192.168.104.54path: /home/nfs/rw
上面这些东西,可能刚开始的时候看有点熟悉,又有点懵,上面的内容,不需要特殊记忆,理解就行,需要改动的地方,也就是最下面 volumes 相关的 server 和 path ,其他内容均为官方配置的内容。基本上也不会有很大的改动。
接着最后是应用的配置文件:nfs-sc-demo-statefulset.yaml
---
apiVersion: v1
kind: Service
metadata:name: nginx-sclabels:app: nginx-sc
spec:type: NodePortports:- name: webport: 80protocol: TCPselector:app: nginx-sc
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: nginx-sc
spec:replicas: 1serviceName: "nginx-sc" # 对应上面的 Service selector:matchLabels:app: nginx-sc # 匹配到下面的 Pod 的标签配置template:metadata:labels:app: nginx-sc # Pod 模板标签spec:containers:- image: nginxname: nginx-scimagePullPolicy: IfNotPresentvolumeMounts:- mountPath: /usr/share/nginx/html # 挂载到容器的哪个目录name: nginx-sc-test-pvc # 挂载哪个 volumevolumeClaimTemplates:- metadata:name: nginx-sc-test-pvcspec:storageClassName: managed-nfs-storageaccessModes:- ReadWriteManyresources:requests:storage: 1Gi
这里创建了 Service 和 StatefulSet ,来管理 Nginx 的 Pod。
volumeClaimTemplates 的配置为 希望可以帮我自动创建一个 PVC,这个 PVC 声明了使用的存储类 storageClass,配置了 storageClass 的名称storageClassName和访问模式accessModes,这声明为可以多个节点同时读写的一个模式。最后声明,期望所需的资源最小是 1Gi。
5. 创建应用,测试 PVC 的自动配置
我们希望的效果是,一旦上面的应用创建起来之后,它自动帮我们把 PVC 创建出来,并且把 PV 也创建出来。
接下来完成上面这些内容的构建,分别把他们构建出来,然后再去把应用跑起来。
先看下当前环境中 pv 和 pvc 的情况:
[root@docker-54 ~]# kubectl get pv | grep nginx
[root@docker-54 ~]#
[root@docker-54 ~]# kubectl get pvc
No resources found in default namespace.
[root@docker-54 ~]#
[root@docker-54 ~]# kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-storage (default) nfs-client Delete Immediate false 132d
[root@docker-54 ~]#
可以看到,当前是没有对应的 PV 和 PVC 的。
接着需要先把 RBAC启动起来:
[root@docker-54 ~]# cd /opt/k8s/config/
[root@docker-54 config]# ls
application.yaml file-test-pod.yaml nfs-provisioner-rbac.yaml nginx.conf test
env-test-pod.yaml nfs-provisioner-deployment.yaml nfs-storage-class.yaml private-image-pull-pod.yaml
[root@docker-54 config]#
[root@docker-54 config]# kubectl apply -f nfs-provisioner-rbac.yaml
serviceaccount/nfs-client-provisioner unchanged
clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner configured
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner unchanged
role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner unchanged
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner unchanged
[root@docker-54 config]#
这里由于我之前创建过一些 RBAC 权限,这里有的显示 unchanged,首次执行这个应该是 created或者configured。
可以看到,上面RBAC 里面配置了一个 serviceaccount以及它对应的集群角色,然后是角色的绑定。接着是一个普通的角色以及普通角色的绑定。
创建完权限,接着来创建 deployment:
[root@docker-54 config]# kubectl apply -f nfs-provisioner-deployment.yaml
serviceaccount/nfs-client-provisioner unchanged
deployment.apps/nfs-client-provisioner configured
[root@docker-54 config]#
接着创建 StorageClass:kubectl apply -f nfs-storage-class.yaml
[root@docker-54 config]# kubectl apply -f nfs-storage-class.yaml
storageclass.storage.k8s.io/managed-nfs-storage created
[root@docker-54 config]#
这里 StorageClass 也创建完成后,可以查看下:
[root@docker-54 config]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
managed-nfs-storage fuseim.pri/ifs Retain Immediate false 60s
nfs-storage (default) nfs-client Delete Immediate false 132d
[root@docker-54 config]#
可以看到,这里确实多了一条记录managed-nfs-storage,并且 PROVISIONER 的值,也正是我们配置的 fuseim.pri/ifs,这个是我们后续使用时关联的一个标识。
接着我们来看下上面创建的 Deployment :
[root@docker-54 config]# kubectl get po -n kube-system | grep nfs
nfs-client-provisioner-77bdfd69d9-9hzhx 1/1 Running 0 134m
[root@docker-54 config]#
可以看到已经是正常运行的状态了。
接下来我们创建statefulset:kubectl apply -f nfs-sc-demo-statefulset.yaml
[root@docker-54 config]# kubectl apply -f nfs-sc-demo-statefulset.yaml
service/nginx-sc created
statefulset.apps/nginx-sc created
[root@docker-54 config]#
接着看下应用的状态:
[root@docker-54 config]# kubectl get sts
NAME READY AGE
nginx-sc 1/1 54s
[root@docker-54 config]#
[root@docker-54 config]# kubectl get po | grep nginx
nginx-sc-0 1/1 Running 0 115s
[root@docker-54 config]#
可以看到正常创建、并启动了。
6. 解决 PVC 为 Pending 状态问题
如果这里 Nginx 的 Pod 为 Pending 状态,则要检查下:kubectl describe po nginx-sc-0
Events:Type Reason Age From Message---- ------ ---- ---- -------Warning FailedScheduling 3m20s default-scheduler 0/3 nodes are available: 3 pod has unbound immediate PersistentVolumeClaims.Normal Scheduled 3m18s default-scheduler Successfully assigned default/nginx-sc-0 to docker-55Normal Pulled 3m18s kubelet Container image "nginx" already present on machineNormal Created 3m18s kubelet Created container nginx-scNormal Started 3m18s kubelet Started container nginx-sc
[root@docker-54 config]#
如果状态异常,上面命令可以看到具体的原因。这里有个FailedScheduling的警告,提示我们三个节点都是可用的,但是 3 个 pod 还是 unbound ,意思是还未绑定到 PVC。
这时候可以排查下 PVC 的状态及原因:
[root@docker-54 config]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nginx-sc-test-pvc-nginx-sc-0 Bound pvc-ba5db961-8b17-4507-a287-ca767d607fa9 1Gi RWX managed-nfs-storage 6m18s
[root@docker-54 config]#
如果这里也为 Pending,状态,此时可能 PV 也是非正常的,可以使用 describe 看下具体原因或者看下 PV 的状态。
[root@docker-54 config]# kubectl get pv | grep nginx
pvc-ba5db961-8b17-4507-a287-ca767d607fa9 1Gi RWX Retain Bound default/nginx-sc-test-pvc-nginx-sc-0 managed-nfs-storage 8m3s
[root@docker-54 config]#
我这里 PV 是正常的,是因为我修改了,k8s制备器的镜像,k8s 默认是quay.io/external_storage/nfs-client-provisioner:latest 镜像,这个镜像需要用到 K8s 中的 一个 selfLink 的功能,但是从 1.20 版本之后,k8s 把这个功能给关掉了,可能是处于性能以及 API 调用请求的一个方向考虑的,把这个功能给禁用掉了,所以就意味着我们新版本不能再直接使用这个镜像了。
我这里使用的版本是v1.22.6
[root@docker-54 config]# kubectl version
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.6", GitCommit:"f59f5c2fda36e4036b49ec027e556a15456108f0", GitTreeState:"clean", BuildDate:"2022-01-19T17:33:06Z", GoVersion:"go1.16.12", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.6", GitCommit:"f59f5c2fda36e4036b49ec027e556a15456108f0", GitTreeState:"clean", BuildDate:"2022-01-19T17:26:47Z", GoVersion:"go1.16.12", Compiler:"gc", Platform:"linux/amd64"}
[root@docker-54 config]#
这里PVC 处于 Pending 状态有两种解决方案:
- 第一种是配置
SelfLink:修改 apiserver 配置文件
vim /etc/kubernetes/manifests/kube-apiserver.yamlspec:containers:- command:- kube-apiserver- --feature-gates=RemoveSelfLink=false # 新增该行......
修改后重新应用该配置,
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
这样可以解决因为版本导致 PVC pending 状态的问题。不过既然官方已经不支持了,我们也没必要强制修改让它支持,看下第二种方案。
- 第二种是使用不需要
SelfLink的provisioner:将 provisioner 修改为如下镜像之一即可,下面的为阿里云的镜像,性价比更高。
gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.0registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0
修改完镜像后,然后执行:nfs-provisioner-deployment.yaml 更新deployment。
当看到 Pod 的状态正常,PVC 和 PV 的状态正常后,就完事了。
7. 单独测试自动创建 PVC
如果我们想单独测试下这个自动创建 PVC ,那么可以这么操作:
新建配置文件:auto-pv-test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: auto-pv-test-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 300MistorageClassName: managed-nfs-storage
这里直接创建 PVC,并没有声明关于 PV 的内容,仅仅声明了 PVC 的名称、需要的资源、使用的 storageClassName。
[root@docker-54 config]# kubectl apply -f auto-pv-test-pvc.yaml
persistentvolumeclaim/auto-pv-test-pvc created
[root@docker-54 config]#
[root@docker-54 config]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
auto-pv-test-pvc Bound pvc-1a180c44-a4d3-44e3-83d0-b69bbf73f2df 300Mi RWO managed-nfs-storage 26s
nginx-sc-test-pvc-nginx-sc-0 Bound pvc-ba5db961-8b17-4507-a287-ca767d607fa9 1Gi RWX managed-nfs-storage 47m
[root@docker-54 config]#
可以看到,新建的 PVC auto-pv-test-pvc 已经正常绑定到名为pvc-1a180c44-a4d3-44e3-83d0-b69bbf73f2df的 PV 上了。这样也是可以达到自动创建 PVC 的目的。
在后续的使用中,我们使用自动创建 PVC 就不用关心 PV ,我们只需要写我们的需求就好了,系统可以根据我们的需求自动创建PV 来自动绑定。
相关文章:
持续集成部署-k8s-配置与存储-存储类:动态创建NFS-PV案例
动态创建NFS-PV案例 1. 前置条件2. StorageClass 存储类的概念和使用3. RBAC 配置4. storageClass 配置5. 创建应用,测试 PVC 的自动配置6. 解决 PVC 为 Pending 状态问题7. 单独测试自动创建 PVC 1. 前置条件 这里使用 NFS 存储的方式,来演示动态创建 …...
jar包不挂断地运行命令
nohup java -jar wpfx.jar com.xiaobai.wpfx.WpfxApplication > ./demo.log 2>&1 &这段命令主要是用来在后台运行一个Java应用程序,并将输出日志写入到demo.log文件中。下面是每个参数的解释: nohup:表示不挂断地运行命令&…...
人工智能-优化算法和深度学习
优化和深度学习 对于深度学习问题,我们通常会先定义损失函数。一旦我们有了损失函数,我们就可以使用优化算法来尝试最小化损失。在优化中,损失函数通常被称为优化问题的目标函数。按照传统惯例,大多数优化算法都关注的是最小化。…...
【开源】基于Vue和SpringBoot的食品生产管理系统
项目编号: S 044 ,文末获取源码。 \color{red}{项目编号:S044,文末获取源码。} 项目编号:S044,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 加工厂管理模块2.2 客户管理模块2.3…...
洛谷P1049装箱问题 ————递归+剪枝+回溯
没没没没没没没没没错,又是一道简单的递归,只不过加了剪枝,我已经不想再多说,这道题写了一开始写了普通深搜,然后tle了一个点,后面改成剪枝,就ac了,虽然数据很水,但是不妨…...
C++通讯录管理系统
目录 系统需求 1、 创建项目 2、 菜单功能设计 3、 退出功能设计 4、 添加联系人功能设计 4.1 设计联系人结构体 4.2 设计通讯录结构体 4.3 在main函数中创建通讯录 4.4 封装添加联系人函数 4.5 添加联系人功能测试 5、 显示联系人功能设计 5.1 封装显示…...
Windows安装Python环境(V3.6)
文章目录 一:进入网址:https://www.python.org/downloads/ 二:执行安装包 默认C盘,选择自定义安装目录 记得勾选add python path 下面文件夹最好不要有 . 等特殊符号 可以创建 python36 如果安装失败Option可以选默认的&#x…...
python 如何调用GPT系列的api接口,实现想要的功能
目录 问题描述: 问题解决: 问题描述: 随着各种LLMs (Large Language Models)的出现,如何调用各种LLMs的api成为了经常会遇见的问题。 问题解决: 下面仅以生成给定sentence的复述句为例,说明…...
JS动态参数arguments与剩余参数
arguments是函数内部内置的伪数组变量,它包含了调用函数时传入的所以实参 让我为大家介绍一下arguments吧 平时我们获取实参: function fun(a, b) {console.log(a) //1console.log(b) //2}fun(1, 2)接下来我们来使用一下arguments动态获取实参 function …...
使用ListenableFuture进行异步任务执行并进行线程切换
文章目录 一、前言二、关键代码三、参考链接 一、前言 在程序中会经常需要做一些异步任务,但是由于部分操作其实很简单,仅仅是短暂的进行异步操作,然后在结果成功或失败的时候切换回主线程进行下一步处理,这期间不能阻塞主线程。…...
C#,数值计算——插值和外推,RBF_fn 与 RBF_gauss 的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { public interface RBF_fn { double rbf(double r); } } ---------------------------------------------- using System; namespace Legalsoft.Truffer { public class RBF_gauss : RBF…...
Java8实战-总结49
Java8实战-总结49 CompletableFuture:组合式异步编程对多个异步任务进行流水线操作构造同步和异步操作将两个 CompletableFuture 对象整合起来,无论它们是否存在依赖 CompletableFuture:组合式异步编程 对多个异步任务进行流水线操作 构造同…...
云匣子 FastJson反序列化RCE漏洞复现
0x01 产品简介 云匣子是租户连接云资源的安全管理工具,帮助云租户更加安全、精细的管理云上的虚拟机、数据库等资源。 云安宝结合多年的运维和安全实践,将云上的运维和安全有机结合,实现对运维过程的事前规划、事中控制和 事后审计。在此之上…...
全程云OA SQL注入漏洞复现
0x01 产品简介 全程云OA为企业提供日常办公管理、公文管理、工作请示、汇报、档案、知识体系、预算控制等26个功能,超过100多个子模块。为企业内部提供高效、畅通的信息渠道,同时也能大力推动公司信息系统发展,提高企业的办公自动化程度和综合…...
IDEA DeBug
文章目录 01_Debug简介和意义02_IDEA中的Debug步骤03_跳转到当前代码执行的行04_步过调试的使用05_步入调试的使用06_强制步入调试的使用07_步出调试的使用08_回退断点调试的使用09_运行到光标处10_计算表达式11_条件断点12_多线程调试 01_Debug简介和意义 什么是程序DeBug&am…...
本地部署 ComfyUI
本地部署 ComfyUI ComfyUI 介绍ComfyUI Github 地址部署 ComfyUI配置模型地址 or 下载模型启动 ComfyUI访问 ComfyUI使用技巧页面底部显示图片预览改变连接线的格式配置 prompt 自动补全 安装 ComfyUI-Manager安装 AIGODLIKE-COMFYUI-TRANSLATION安装 ComfyUI-Custom-Scripts安…...
RHCE---给openlab搭建web网站
作业:请给openlab搭建web网站 网站需求: 1.基于域名 www.openlab.com 可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站, 1、基于 www.openlab.com/student 网站访问学生信…...
[BJDCTF2020]The mystery of ip1
提示 ssti模板注入head头x-forwarded-for 每一次做题的最开始流程都大致因该是 信息收集找可以操控的地方 查看hint页面的源代码又发现它提示说 ####你知道为什么会知道你的ip吗 查看flag页面 从刚才给我的提示以及他这里显示的我的ip,大概找到了我可操作的可控点 …...
常见树种(贵州省):021冬青、连香树、白辛树、香合欢、云贵鹅耳枥、肥牛树、杜英、格木、黄连木、圆果化香树、南天竹
摘要:本专栏树种介绍图片来源于PPBC中国植物图像库(下附网址),本文整理仅做交流学习使用,同时便于查找,如有侵权请联系删除。 图片网址:PPBC中国植物图像库——最大的植物分类图片库 一、冬青 …...
[论文阅读]CBAM——代码实现和讲解
CBAM 论文网址:CBAM 论文代码:CBAM 本文提出了一种卷积块注意力模块(CBAM),它是卷积神经网络(CNN)的一种轻量级、高效的注意力模块。该模块沿着通道和空间两个独立维度依次推导注意力图&#x…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
