当前位置: 首页 > news >正文

Kubernetes PV及PVC的使用

前提条件

  • 拥有Kubernetes集群环境,可参考:Kubernetes集群搭建
  • 理解Kubernetes部署知识,可参考:使用Kubernetes部署第一个应用 、Deloyment控制器
  • 拥有NFS服务,可参考:Linux环境搭建NFS服务

概述

  • Persistent Volume(持久卷,简称PV):是 Kubernetes 中对存储资源的抽象,它独立于使用存储的 Pod。PV 是集群中的一块存储,可以由管理员预先配置或者通过存储类(Storage Class)动态分配。它类似于传统存储中的磁盘卷。
  • Persistent Volume Claim(持久卷声明,简称PVC):是用户对存储的请求。Pod 通过 PVC 来请求所需的存储资源,而不是直接访问 PV,实现了Pod和PV的解耦。PVC 就像是用户向存储系统 “下单”,请求一定规格的存储,比如指定存储大小、访问模式等,一定规格的存储指的就是PV。

PV(持久卷)

  • 访问模式(Access Modes)
    • ReadWriteOnce(RWO):这种模式下,存储卷可以被单个节点以读写方式挂载。例如,一个有状态的应用(如 MySQL 数据库)可能需要这种模式,因为数据库文件需要在一个地方进行读写操作,以保证数据的一致性。
    • ReadOnlyMany(ROX):存储卷可以被多个节点以只读方式挂载。适用于存储配置文件等只读数据,比如多个 Web 服务器节点可以同时挂载一个包含网站配置的存储卷,但只能读取其中的配置信息。
    • ReadWriteMany(RWX):存储卷能够被多个节点以读写方式挂载。在一些分布式文件系统(如 CephFS)中可以支持这种模式,适用于多个节点需要同时读写共享数据的场景,比如集群中的共享存储。
  • 存储类型(Storage Class):用于动态分配存储。不同的存储类型可能对应不同的后端存储系统,如网络文件系统(NFS)、网络附加存储(NAS)、云存储(如 AWS EBS、Azure Disk 等)或者分布式存储系统(如 GlusterFS、Ceph)。
  • 回收策略(Reclaim Policy)
    • Recycle:(已弃用)旧版本的 Kubernetes 有回收策略,会对存储卷进行格式化后重新使用,但是由于安全和效率等问题已经不推荐使用。
    • Delete:当 PVC 被删除后,PV 及其数据也会被自动删除。这在一些临时存储场景下比较有用,比如用于存储临时测试数据的存储卷。
    • Retain:当 PVC 被删除后,PV 仍然保留数据,需要管理员手动清理。这种策略适用于数据很重要,不能轻易删除的情况。例如,存储了重要数据库备份的 PV,在 PVC 不再使用后,管理员可能需要先检查备份数据是否还需要,再决定是否删除 PV。
  • 生命周期管理
    • 静态分配:管理员手动创建 PV,并将其与后端存储系统(如物理磁盘、网络存储等)进行绑定。例如,在一个本地数据中心部署的 Kubernetes 集群中,管理员可以先将服务器上的一块硬盘格式化为合适的文件系统,然后创建一个 PV 来表示这块硬盘的存储空间,并且配置好容量、访问模式等属性。
    • 动态分配:通过存储类(Storage Class)来实现。存储类定义了存储的提供方、参数等信息。当用户创建一个 PVC 时,Kubernetes 会根据 PVC 的要求和存储类的定义,自动创建一个合适的 PV 来满足需求。比如,在一个云环境中的 Kubernetes 集群,使用云存储服务提供商的存储类,可以让集群自动分配云硬盘来满足 PVC 的存储请求。

创建PV对象

新建一个 PV 对象,使用NFS类型的后端存储(如果还没有NFS服务,需要先搭建NFS服务,可参考 :Linux环境搭建NFS服务),1G 的存储空间,访问模式为 ReadWriteOnce,回收策略为 Recyle。

目录准备

[root@k8s-master01 test]# mkdir pvpvctest
[root@k8s-master01 test]# cd pvpvctest/
[root@k8s-master01 pvpvctest]# 

创建

[root@k8s-master01 pvpvctest]# vi pv1-demo.yaml

内容如下

apiVersion: v1
kind: PersistentVolume
metadata:name:  pv1
spec:capacity: storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Recyclenfs:path: /data/k8sserver: k8s-node02

Kubernetes 支持的 PV 类型有很多,比如常见的 Ceph、GlusterFs、NFS,甚至 HostPath也可以,不过 HostPath 我们之前也说过仅仅可以用于单机测试

创建PV及查看PV

[root@k8s-master01 pvpvctest]# kubectl create -f pv1-demo.yaml
Warning: spec.persistentVolumeReclaimPolicy: The Recycle reclaim policy is deprecated. Instead, the recommended approach is to use dynamic provisioning.
persistentvolume/pv1 created
​
[root@k8s-master01 pvpvctest]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pv1    1Gi        RWO            Recycle          Available                          <unset>                          66s
​

看到 pv1 已经创建成功了,状态是 Available,表示 pv1 就绪,可以被 PVC 申请。

一个 PV 的生命周期中,可能会处于4中不同的阶段:

  • Available(可用):表示可用状态,还未被任何 PVC 绑定

  • Bound(已绑定):表示 PVC 已经被 PVC 绑定

  • Released(已释放):PVC 被删除,但是资源还未被集群重新声明

  • Failed(失败): 表示该 PV 的自动回收失败

PVC(持久卷声明)

PV(Persistent Volume)是对存储资源的抽象,代表了一块存储,而 PVC(Persistent Volume Claim)是用户(通过 Pod)对存储资源的请求。PVC 用于从集群中获取合适的 PV,然后将获取到的存储挂载到 Pod 中,为 Pod 中的应用提供持久化存储服务。

创建PVC

创建yaml文件

[root@k8s-master01 pvpvctest]# vi pvc-nfs.yaml

内容如下

kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: pvc-nfs
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1Gi

在新建 PVC 之前,查看之前创建的 PV 的状态:

[root@k8s-master01 pvpvctest]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pv1    1Gi        RWO            Recycle          Available                          <unset>                          14m

看到当前 pv-nfs 是在 Available 的一个状态,所以 PVC 可以和这个 PV 进行绑定

创建PVC

[root@k8s-master01 pvpvctest]# kubectl create -f pvc-nfs.yaml
persistentvolumeclaim/pvc-nfs created
[root@k8s-master01 pvpvctest]# kubectl get pvc
NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
pvc-nfs   Bound    pv1      1Gi        RWO                           <unset>                 10s

看到 pvc-nfs 创建成功了,状态是 Bound 状态了,此时再看 PV 的状态:

[root@k8s-master01 pvpvctest]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pv1    1Gi        RWO            Recycle          Bound    default/pvc-nfs                  <unset>                          15m

看到 PV 也是 Bound 状态了,对应的声明是 default/pvc-nfs,就是 default 命名空间下面的 pvc-nfs,证明刚刚新建的 pvc-nfs 和 pv-nfs 绑定成功了。

此前并没有在 PVC中指定PV,PVC和PV之间是系统自动匹配的,根据PVC的要求去查找处于 Available 状态的 PV,如果没有找到的话那么 PVC 就会一直处于 Pending 状态,找到会把当前的 PVC 和目标 PV 进行绑定,这个时候状态就会变成 Bound 状态了。

再新建一个 PVC验证,创建pvc2-nfs.yaml

[root@k8s-master01 pvpvctest]# vi pvc2-nfs.yaml

内容如下

kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: pvc2-nfs
spec:accessModes:- ReadWriteOnceresources:requests:storage: 2Giselector:matchLabels:app: nfs

先查看下当前系统的所有 PV:

[root@k8s-master01 pvpvctest]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pv1    1Gi        RWO            Recycle          Bound    default/pvc-nfs                  <unset>                          21m

查到的pv为 Bound 状态,并没有 Available 状态的 PV

创建PVC:

[root@k8s-master01 pvpvctest]# kubectl create -f pvc2-nfs.yaml
persistentvolumeclaim/pvc2-nfs created
​
[root@k8s-master01 pvpvctest]# kubectl get pvc
NAME       STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
pvc-nfs    Bound     pv1      1Gi        RWO                           <unset>                 7m56s
pvc2-nfs   Pending                                                     <unset>                 25s
​

名为pvc2-nfs的PVC状态是 Pending ,因为没有合适的 PV 给PVC绑定。

接下来新建一个 PV,让PVC 有合适的 PV 使用

创建pv2-nfs.yaml

vi pv2-nfs.yaml

内容如下

apiVersion: v1
kind: PersistentVolume
metadata:name: pv2-nfslabels:app: nfs
spec:capacity:storage: 2GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Recyclenfs:server: k8s-node02path: /data/k8s

新建PV及查看PV状态:

[root@k8s-master01 pvpvctest]# kubectl create -f pv2-nfs.yaml
Warning: spec.persistentVolumeReclaimPolicy: The Recycle reclaim policy is deprecated. Instead, the recommended approach is to use dynamic provisioning.
persistentvolume/pv2-nfs created
​
[root@k8s-master01 pvpvctest]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM              STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pv1       1Gi        RWO            Recycle          Bound    default/pvc-nfs                   <unset>                          25m
pv2-nfs   2Gi        RWO            Recycle          Bound    default/pvc2-nfs                  <unset>                          12s
​

创建完 pv2-nfs 后,就发现该 PV 是 Bound 状态了,对应的 PVC 是 default/pvc2-nfs,证明 pvc2-nfs 终于找到合适的 PV 绑定上

查看PVC状态也是Bound状态了

[root@k8s-master01 pvpvctest]# kubectl get pvc
NAME       STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
pvc-nfs    Bound    pv1       1Gi        RWO                           <unset>                 10m
pvc2-nfs   Bound    pv2-nfs   2Gi        RWO                           <unset>                 3m14s

注意:PV 的容量必须大于等于 PVC 请求的容量,例如:PVC的容量为1Gi, 而PV的容量为2Gi,PVC和PV是可以的绑定成功,但查到PVC的容量不是1Gi而是2Gi(可自行验证)。

使用 PVC

创建yaml

[root@k8s-master01 pvpvctest]# vi nfs-pvc-deploy.yaml

内容如下

apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-pvc
spec:replicas: 3selector:matchLabels:app: nfs-pvctemplate:metadata:labels:app: nfs-pvcspec:containers:- name: nginximage: nginx:1.16.1imagePullPolicy: IfNotPresentports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumes:- name: wwwpersistentVolumeClaim:claimName: pvc2-nfs---
apiVersion: v1
kind: Service
metadata:name: nfs-pvclabels:app: nfs-pvc
spec:type: NodePortports:- port: 80targetPort: webselector:app: nfs-pvc

将容器的 /usr/share/nginx/html 目录通过 volume 挂载到名为 pvc2-nfs 的 PVC 上面,然后创建一个 NodePort 类型的 Service 来暴露服务:

[root@k8s-master01 pvpvctest]# kubectl create -f nfs-pvc-deploy.yaml
deployment.apps/nfs-pvc created
service/nfs-pvc created
​
[root@k8s-master01 pvpvctest]# kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
nfs-pvc-5b4d9797d6-9pk2b   1/1     Running   0          21s
nfs-pvc-5b4d9797d6-tbqgl   1/1     Running   0          21s
nfs-pvc-5b4d9797d6-vx4k6   1/1     Running   0          21s
​
[root@k8s-master01 pvpvctest]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.0.0.1        <none>        443/TCP        82d
nfs-pvc      NodePort    10.15.179.232   <none>        80:30444/TCP   46s
​

上面命令查看到nfs-pvc service的节点端口为30444,通过任意节点的 IP:30444 端口来访问的 Nginx 服务了,但是这个时候访问会出现403

这是为什么?在nfs服务端查看/data/k8s目录

[root@k8s-node02 ~]# ls /data/k8s
test.txt

发现没有index.html文件,因为把容器目录/user/share/nginx/html和挂载到了pvc2-nfs PVC 上, PVC 就是对应着的 nfs 的共享数据目录的,但该目录下面还没有任何数据,所以访问就出现了403

接下来在/data/k8s目录下面新建一个 index.html 的文件:

[root@k8s-node02 ~]# echo "<h1>Hello Kubernetes~</h1>" >> /data/k8s/index.html
[root@k8s-node02 ~]# ls /data/k8s
index.html  test.txt

访问下服务,任一节点IP:30444:

现在看到数据了nds index.html的数据。

但是容器中的数据是直接放到共享数据目录根目录下面的,如果以后有一个新的 nginx 容器也做了数据目录的挂载,就不太好区分了,这个时候可以在 Pod 中使用一个新的属性:subPath,该属性可以来解决这个问题,只需要更改上面的 Pod 的 YAML 文件即可:

[root@k8s-master01 pvpvctest]# vi nfs-pvc-deploy.yaml

添加subPath: nginxpvc-test语句,作为nfs的子目录,部分yaml内容如下

...
volumeMounts:
- name: wwwsubPath: nginxpvc-testmountPath: /usr/share/nginx/html
...

更改完 YAML 文件后,我们重新更新即可:

$ kubectl apply -f nfs-pvc-deploy.yaml
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
deployment.extensions "nfs-pvc" configured
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
service "nfs-pvc" configured
​
[root@k8s-master01 pvpvctest]# kubectl apply -f nfs-pvc-deploy.yaml
Warning: resource deployments/nfs-pvc is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
deployment.apps/nfs-pvc configured
Warning: resource services/nfs-pvc is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
service/nfs-pvc configured
​

刷新浏览器,访问到403

更新完后,再去看看 nfs 的数据共享目录:

# 查看/data/k8s目录,多了一个目录nginxpvc-test,这就是之前yaml文件添加的subPath
[root@k8s-node02 ~]# ls /data/k8s/
index.html  nginxpvc-test  test.txt
​
# 查看nginxpvc-test目录,没有index.html内容所以浏览器访问不到
[root@k8s-node02 ~]# ls /data/k8s/nginxpvc-test/
​
# 将index.html移动到nginxpvc-test目录
[root@k8s-node02 ~]# mv /data/k8s/index.html /data/k8s/nginxpvc-test/
​
# 查看nginxpvc-test目录,看到index.html
[root@k8s-node02 ~]# ls /data/k8s/nginxpvc-test/
index.html
​

刷新浏览器,又看到数据了

 

相关文章:

Kubernetes PV及PVC的使用

前提条件 拥有Kubernetes集群环境&#xff0c;可参考&#xff1a;Kubernetes集群搭建理解Kubernetes部署知识&#xff0c;可参考&#xff1a;使用Kubernetes部署第一个应用 、Deloyment控制器拥有NFS服务&#xff0c;可参考&#xff1a;Linux环境搭建NFS服务 概述 Persistent…...

struct udp_sock

这个struct udp_sock结构体是Linux内核网络栈中用于表示一个UDP套接字的数据结构。它继承自struct inet_sock,这意味着它包含了所有IPv4或IPv6套接字共享的基础信息和函数指针。下面是对struct udp_sock中一些关键成员的解释: struct inet_sock inet;:这是udp_sock结构体的第…...

《机器学习》数据预处理简介

目录 1. 数据清洗&#xff08;Data Cleaning&#xff09; &#xff08;1&#xff09;处理缺失值 &#xff08;2&#xff09;处理异常值 &#xff08;3&#xff09;处理重复数据 2. 数据转换&#xff08;Data Transformation&#xff09; &#xff08;1&#xff09;特征缩…...

USB接口实现CDC(usb转串口功能)

主控&#xff1a;stm32f429 PHY芯片&#xff1a;usb3320 Cubemx System Core-RCC connectivity-USB_OTG_HS Middleware and Software Packs-USB_DEVICE 时钟配置&#xff1a;根据自己使用的MCU工作频率设置 Generate Code Keil5 打开工程 usbd_cdc_if.c这个文件&…...

ubuntu 网络管理--NetworkManager

ubuntu 网络管理--NetworkManager 1 介绍2 NetworkManager 命令2 nmcli 命令显示可用的wifi AP连接wifi检查网络连接 ?? 如何删除删除网络连接查看设备状态添加一个新的以太网连接设置静态 IP 地址启用并测试连接添加新的wifi连接 3 其他命令参考 1 介绍 NetworkManager 是标…...

FLV视频封装格式详解

目录(?)[-] OverviewFile Structure The FLV headerThe FLV File BodyFLV Tag Definition FLVTAGAudio TagsVideo TagsSCRIPTDATA onMetaDatakeyframes Overview Flash Video(简称FLV),是一种流行的网络格式。目前国内外大部分视频分享网站都是采用的这种格式. File Structure…...

每天五分钟机器学习:核函数

本文重点 在学习支持向量机算法之前,我们要继续学习一些数学基础,本文我们将学习核函数的概念。当数据线性不可分的时候,此时就需要核函数出场了,它可以将低维不可分的数据映射到高维可分数据,此时就可以完成数据分类了。 核函数的定义 核函数K(x, y)定义为两个数据点x…...

Flutter开发HarmonyOS 鸿蒙App的好处、能力以及把Flutter项目打包成鸿蒙应用

Flutter开发HarmonyOS的好处&#xff1a; Flutter是谷歌公司开发的一款开源、免费的UI框架&#xff0c;可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。 目前 Flutter 已经支持 iOS、Android、Web、Windows、macOS、Linux 的跨平台开发…...

4-pandas常用操作

前言 一、DataFrame修改index、columns 1.获取index df2 pd.DataFrame(np.arange(9).reshape(3,3),index[sh,cs,bj],columns[a,b,c]) df2.index 2.修改index df2.index [shanghai,changsha,beijing] df2.columns [A,B,C] # 注意赋值的顺序 3.批量修改&#xff…...

Suno Api V4模型无水印开发「综合实战开发自己的音乐网站」 —— 「Suno Api系列」第14篇

历史文章 Suno AI API接入 - 将AI音乐接入到自己的产品中&#xff0c;支持120并发任务 Suno Api V4模型无水印开发「灵感模式」 —— 「Suno Api系列」第1篇 Suno Api V4模型无水印开发「自定义模式」 —— 「Suno Api系列」第2篇 Suno Api V4模型无水印开发「AI生成歌词」…...

【0376】Postgres内核 分配 last safe MultiXactId

上一篇: 【0375】Postgres内核 XLOG 之 设置下一个待分配 MultiXactId 和 offset 文章目录 1. 最后一个安全的 MultiXactId1.1 计算 multi wrap limit1.2 计算 multi stop limit1.3 计算 multi warn limit1.4 计算 multi vacuum limit2. 初始化 MultiXactState 成员3. 完成 mu…...

大模型时代的NL2SQL初探

大模型时代的NL2SQL初探 NL2SQL的基本概念NL2SQL的实现逻辑现代NL2SQL框架与技术大语言模型&#xff08;LLM&#xff09;在NL2SQL中的应用向量数据库的作用NL2SQL的应用场景未来展望 在当今信息化时代&#xff0c;数据库已成为各行各业的数据存储核心。然而&#xff0c;直接使用…...

Linux环境下使用tomcat+nginx部署若依项目

Linux Tomcat MySQL Java 是构建动态网站系统的完美解决方案之一&#xff0c;具有免费、高 效、扩展性强且资源消耗低等优良特性。 Java Web 凭借其优秀的开发框架和良好的生态被广 泛应用于社会各行业的信息化系统构建。 本实验以若依管理系统&#xff08; http://ruo…...

京准电钟解读,NTP网络授时服务器如何提升DCS系统效率

京准电钟解读&#xff0c;NTP网络授时服务器如何提升DCS系统效率 京准电钟解读&#xff0c;NTP网络授时服务器如何提升DCS系统效率 NTP 网络授时服务器为防火墙内的网络设备、终端、服务器提供准确、可靠和安全的高精度卫星时间参考&#xff0c;可为它支持数万台支持标准的网…...

06 - Django 视图view

HttpRequest 和 HttpResponse Django中的视图主要用来接受Web请求&#xff0c;并做出响应。 视图的本质就是一个Python中的函数 视图的响应分为两大类 以Json数据形式返回(JsonResponse)以网页的形式返回 重定向到另一个网页 (HttpResponseRedirect)错误视图(4XX,5XX) (Htt…...

MySQL数据库(锁)

1、MySQL有哪些锁&#xff1f; 全局锁&#xff1a;flush tables with read lock 执行以下语句之后&#xff0c;使用全局锁&#xff0c;整个数据库就处于只读状态了&#xff0c;这时其他线程执行对数据的增删改或者对表结构的更改操作操作&#xff0c;都会被阻塞。 全局锁的应…...

Mac Android studio 升级LadyBug 版本,所产生的bug

当Build 出现&#xff0c;这样的文字以后&#xff1a; Your build is currently configured to use incompatible Java 21.0.3 and Gradle 7.3.3. Cannot sync the project. We recommend upgrading to Gradle version 8.9. The minimum compatible Gradle version is 8.5. …...

springboot/ssm社区助老志愿者服务平台Java代码编写web志愿捐赠活动项目

springboot/ssm社区助老志愿者服务平台Java代码编写web志愿捐赠活动项目 基于springboot(可改ssm)vue项目 开发语言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&am…...

基于Java+Jsp Servlet Mysql实现的Java Web在线商城项目系统设计与实现

一、前言介绍&#xff1a; 1.1 项目摘要 随着互联网技术的飞速发展&#xff0c;电子商务已成为现代商业活动的重要组成部分。在线商城作为电子商务的一种重要形式&#xff0c;以其便捷性、高效性和广泛覆盖性&#xff0c;受到了越来越多消费者的青睐。同时&#xff0c;随着消…...

安装K8s集群

文章首发于我的博客 &#xff1a;https://blog.liuzijian.com/post/9aa6d426-a01c-05b0-6f7a-5da4343f0f9e.html 因阿里云加速服务调整&#xff0c;镜像加速服务自2024年7月起不再支持&#xff0c;拉取镜像&#xff0c;下载网络插件等操作&#xff0c;需要科学上网访问DockerHu…...

【数据科学导论】第一二章·大数据与数据表示与存储

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;数据处理与分析_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言…...

LabVIEW数字式气压计自动检定系统

开发了一个基于LabVIEW开发的数字式气压计自动检定系统。在自动化检定PTB220和PTB210系列数字气压计&#xff0c;通过优化硬件组成和软件设计&#xff0c;实现高效率和高准确度的检定工作&#xff0c;有效降低人力成本并提升操作准确性。 项目背景 随着自动气象站的广泛部署&a…...

按行分割文本函数(C++)

文本分割函数SplitText2Line解析 以下是对SplitText2Line函数的详细介绍&#xff1a; void SplitText2Line(s8* strText, std::vector<std::string>& vecStrLines) {// 1. 清空存储结果的向量vecStrLines.clear();// 2. 打印原始文本信息&#xff08;用于调试目的&…...

要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量

文章目录 1、we_chat_subscribe2、we_chat_union_id 1、we_chat_subscribe 要查询 user 表中 we_chat_subscribe 列不为空的用户数量&#xff0c;你可以使用以下 SQL 查询语句&#xff1a; SELECT COUNT(*) FROM user WHERE we_chat_subscribe IS NOT NULL;解释&#xff1a; …...

【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 1、输入数值 2、选择结构语句 3、计算结果并输出 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写一个程序&#xff0c;该程序需输入个人数据&#xff0c;进而预测其成年后的身高。 相关知识 为了完成本…...

使用Excel制作通达信自定义外部数据,安排!!!

Excel相信大家电脑上都有这个工具&#xff0c;相比敲编程代码&#xff0c;用这个去做自定义数据对大多数人&#xff0c;应该是比较友好的。自定义数据分为外部序列数据&#xff0c;看了一下内容理解起来比较多&#xff0c;分两期给大家介绍。为了照顾电脑基础薄弱的朋友&#x…...

阿里云镜像服务使用指南

阿里云容器镜像服务ACR&#xff08;Alibaba Cloud Container Registry&#xff09;是面向容器镜像、Helm Chart等符合OCI标准云原生制品安全托管及高效分发平台。ACR企业版支持全球同步加速、大规模和大镜像分发加速、多代码源构建加速等全链路加速能力&#xff0c;与容器服务A…...

adb无法连接到安卓设备【解决方案】报错:adb server version (40) doesn‘t match this client (41);

下载老版本Platformtools​​​​​​​​​​​​​​https://dl.google.com/android/repository/platform-tools_r28.0.2-windows.zip?hlzh-cn 替换原来的platform-tools文件夹即可。 问题原因分析&#xff1a;电脑端adb client版本&#xff08;41&#xff09;和安卓端adb …...

WPF TextBox 输入限制 详解

总目录 前言 通常对于WPF输入框 输入的控制无非以下方式 1 直接禁止输入(包括粘贴) 不符合要求的字符 如只可输入数字的输入框&#xff0c;当你输入字母的时候是无法输入的 2 输入后&#xff0c;校验内容是否符合要求&#xff0c;然后提示错误&#xff0c;禁止提交信息 如只可…...

安装Visual studio2022后,没法新建.net 4.5.2的项目

在Visual Studio 2022中无法新建.NET Framework 4.5.2的项目&#xff0c;通常是因为Visual Studio 2022默认不再支持较旧的.NET Framework版本&#xff0c;如4.5或4.5.2。不过&#xff0c;你可以通过一些手动步骤来使Visual Studio 2022支持.NET Framework 4.5.2项目。以下是一…...

【读书笔记】《论语别裁》孝道是这样一个东西

一、内容摘要 本章通过比较人类与其他动物的生存方式&#xff0c;探讨了孝道和人文文化的重要性。作者提到&#xff0c;在自然界中&#xff0c;所有生物都在为自身生存而努力&#xff0c;动物之间的亲子关系如母鸡保护小鸡体现了母性的重要性。虽然人类在外表上与动物无异&…...

【magic-dash】01:magic-dash创建单页面应用及二次开发

文章目录 一、magic-dash是什么1.1 安装1.2 使用1.2.1 查看内置项目模板1.2.2 生成指定项目模板1.2.3 查看当前magic-dash版本1.2.4 查看命令说明1.2.5 内置模板列表二、创建虚拟环境并安装magic-dash三、magic-dash单页工具应用开发3.1 创建单页面项目3.1.1 使用命令行创建单页…...

Python编程构建动态的圣诞画面

Python编程构建动态的圣诞画面 引言 今天是圣诞节&#xff0c;空气中弥漫着节日的气息。让我们利用Python编程技能&#xff0c;为我们的屏幕带来一丝节日的温暖。本文将引导你通过Python代码创建一个动态的圣诞场景&#xff0c;包括闪烁的圣诞树和房屋画面&#xff0c;所有这…...

2025年创业投资前瞻:AI、可持续发展与基础设施建设的深度整合

随着科技的进步和社会需求的变化,2025年的创业环境将更加复杂且充满机遇。本篇文章旨在为寻求在这一关键时期启动或扩展业务的企业家提供一份详尽的投资指南,聚焦于人工智能(AI)、可持续发展和基础设施建设三大核心领域。 1. 智能政府与公民服务 自动化行政流程:通过引入…...

vulnhub靶场-matrix-breakout-2-morpheus攻略(截止至获取shell)

扫描出ip为192.168.121.161 访问该ip&#xff0c;发现只是一个静态页面什么也没有 使用dir dirsearch 御剑都只能扫描到/robots.txt /server-status 两个页面&#xff0c;前者提示我们什么也没有&#xff0c;后面两个没有权限访问 扫描端口&#xff0c;存在81端口 访问&#x…...

C++软件设计模式之类型模式和对象型模式

在 C 软件设计模式中&#xff0c;通常将设计模式分为两大类&#xff1a;类型模式&#xff08;Type Patterns&#xff09;和对象型模式&#xff08;Object Patterns&#xff09;。这两种模式在实现和应用上有不同的特点和目的。 类型模式&#xff08;Type Patterns&#xff09;…...

Oracle、ACCSEE与TDMS的区别

Oracle、ACCSEE和TDMS都是不同类型的数据管理和存储工具&#xff0c;它们各自有独特的用途、结构和复杂性。Oracle是一个功能强大的关系型数据库管理系统&#xff0c;适用于大规模企业级应用&#xff0c;支持复杂查询和事务管理。ACCSEE主要应用于实时数据采集和过程监控&#…...

视频监控平台:Liveweb视频汇聚融合平台智慧安防视频监控应用方案

Liveweb是一款功能强大、灵活部署的安防视频监控平台&#xff0c;支持多种主流标准协议&#xff0c;包括GB28181、RTSP/Onvif、RTMP等&#xff0c;同时兼容海康Ehome、海大宇等厂家的私有协议和SDK接入。该平台不仅提供传统安防监控功能&#xff0c;还支持接入AI智能分析&#…...

【ES6复习笔记】箭头函数(5)

简介 本教程将介绍如何在 JavaScript 中使用箭头函数&#xff0c;包括箭头函数的基本语法、特点以及在实际开发中的应用。通过本教程&#xff0c;你将学会如何使用箭头函数来简化代码&#xff0c;提高代码的可读性和简洁性。 箭头函数的基本语法 箭头函数是 ES6 引入的一种新…...

数字IC前端学习笔记:脉动阵列的设计方法学(四)

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 引言 脉动结构&#xff08;也称为脉动阵列&#xff09;表示一种有节奏地计算并通过系统传输数据的处理单元(PEs)网络。这些处理单元有规律地泵入泵出数据以保持规则…...

基于web的音乐网站(Java+SpringBoot+Mysql)

目录 1系统概述 1.1 研究背景 1.2研究目的 1.3系统设计思想 2相关技术 2.1?MYSQL数据库 2.2?B/S结构 2.3?Spring Boot框架简介 3系统分析 3.1可行性分析 3.1.1技术可行性 3.1.2经济可行性 3.1.3操作可行性 3.2系统性能分析 3.2.1 系统安全性 3.2.2 数据完整…...

从 GitLab.com 到 JihuLab.com 的迁移指南

本文分享从 GitLab.com 到 JihuLab.com 的迁移指南。 近期&#xff0c;GitLab Inc. 针对其 SaaS 产品做了限制&#xff0c;如果被判定为国内用户&#xff0c;则会建议使用其在国内的发布版本极狐GitLab。从 GitLab SaaS 产品&#xff08;GitLab.com&#xff09;迁移到极狐GitL…...

纯真社区版IP库CZDB数据格式使用教程

1. 概述 纯真社区版IP库是一种免费且公开的IP地理位置数据库&#xff0c;主要面向非商业用途。其最新推出的CZDB格式是一种全新的数据文件格式&#xff0c;自2024年10月起将成为官方维护和更新的唯一版本。该格式支持同时存储IPv4和IPv6地址信息&#xff0c;具备以下优点&…...

go window安装protoc protoc生成protobuf文件

1. 下载&#xff1a; Releases protocolbuffers/protobuf GitHub 2. 解压缩&#xff1a; 3. 配置环境变量&#xff1a; 选择系统变量->Path -> 新增 解压缩后的bin路径 4. 打印版本&#xff1a; protoc --version 5. 安装protoc-gen-go cmd 下输入安装命令&#xff0…...

ChildLife“童年时光杯”足球联赛启动 共促青少年健康成长

2024年12月21日至22日&#xff0c;由美国知名婴幼儿营养品牌ChildLife童年时光赞助的“童年时光杯”青少年足球联赛将在上海拉开帷幕。本次赛事U7/U8组别共有16支足球队参赛&#xff0c;包括上海幸运星足球俱乐部旗下的明星球队&#xff0c;以及其他青少年俱乐部的优秀队伍&…...

Erlang语言的数据结构

题目&#xff1a;Erlang数据结构&#xff1a;构建高效并发世界的基石 一、引言 在编程世界中&#xff0c;数据结构是组织和管理数据的关键工具&#xff0c;它不仅影响着程序的效率&#xff0c;还直接关系到代码的可读性和可维护性。Erlang&#xff0c;这门为高并发、容错性设…...

宏定义介绍

假设我们有以下代码&#xff1a; LOG_INFO("rkipc_ini_path_ is %s, rkipc_iq_file_path_ is %s, rkipc_log_level is %d\n",rkipc_ini_path_, rkipc_iq_file_path_, rkipc_log_level);1. LOG_INFO 宏定义 根据之前的 LOG_INFO 宏定义&#xff1a; #define LOG_IN…...

攻防世界 - Web - Level 1 unseping

关注这个靶场的其它相关笔记&#xff1a;攻防世界&#xff08;XCTF&#xff09; —— 靶场笔记合集-CSDN博客 0x01&#xff1a;Write UP 本关是一个 PHP 代码审计关卡&#xff0c;考察的是 PHP 反序列化漏洞以及命令执行的一些绕过手段&#xff0c;下面笔者将带你一步步过关。…...

【ES6复习笔记】ES6的模块化(18)

模块化的概念 模块化是指将一个复杂的系统分解为多个模块&#xff0c;每个模块完成一个特定的功能&#xff0c;模块之间通过接口进行通信。模块化的目的是提高代码的可读性、可维护性和可重用性。 模块化规范产品&#xff0c; ES6 之前的模块化规范有&#xff1a; CommonJS …...

[项目][boost搜索引擎#4] cpp-httplib使用 log.hpp 前端 测试及总结

目录 编写http_server模块 1. 引入cpp-httplib到项目中 2. cpp-httplib的使用介绍 3. 正式编写http_server 九、添加日志到项目中 十、编写前端模块 十一. 详解传 gitee 十二、项目总结 项目的扩展 写在前面 [项目详解][boost搜索引擎#1] 概述 | 去标签 | 数据清洗 |…...