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: 1Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /data/k8s
    server: 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:
    - ReadWriteOnce
  resources:
    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:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  selector:
    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-nfs
  labels:
    app: nfs
spec:
  capacity:
    storage: 2Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    server: k8s-node02
    path: /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: 3
  selector:
    matchLabels:
      app: nfs-pvc
  template:
    metadata:
      labels:
        app: nfs-pvc
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
      volumes:
      - name: www
        persistentVolumeClaim:
          claimName: pvc2-nfs

---
apiVersion: v1
kind: Service
metadata:
  name: nfs-pvc
  labels:
    app: nfs-pvc
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: web
  selector:
    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: www
  subPath: nginxpvc-test
  mountPath: /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
​

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

 

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

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

相关文章

flink sink kafka

接上文&#xff1a;一文说清flink从编码到部署上线 之前写了kafka source&#xff0c;现在补充kafka sink。完善kafka相关操作。 环境说明&#xff1a;MySQL&#xff1a;5.7&#xff1b;flink&#xff1a;1.14.0&#xff1b;hadoop&#xff1a;3.0.0&#xff1b;操作系统&#…

【安全编码】Web平台如何设计防止重放攻击

我们先来做一道关于防重放的题&#xff0c;答案在文末 防止重放攻击最有效的方法是&#xff08; &#xff09;。 A.对用户密码进行加密存储使用 B.使用一次一密的加密方式 C.强制用户经常修改用户密码 D.强制用户设置复杂度高的密码 如果这道题目自己拿不准&#xff0c;或者…

Diagramming AI: 使用自然语言来生成各种工具图

前言 在画一些工具图时&#xff08;流程图、UML图、架构图&#xff09;&#xff0c;你还在往画布上一个个的拖拽组件来进行绘制么&#xff1f;今天介绍一款更有效率的画图工具&#xff0c;它能够通过简单的自然语言描述来完成一个个复杂的图。 首页 进入官网之后&#xff0c;我…

黑马Java面试教程_P9_MySQL

系列博客目录 文章目录 系列博客目录前言1. 优化1.1 MySQL中&#xff0c;如何定位慢查询&#xff1f;面试文稿 1.2 面试官接着问&#xff1a;那这个SQL语句执行很慢,如何分析 ( 如何优化&#xff09;呢?面试文稿 1.3 了解过索引吗?(什么是索引)1.4 继续问 索引的底层数据结构…

Windows11家庭版启动Hyper-V

Hyper-V 是微软的硬件虚拟化产品&#xff0c;允许在 Windows 上以虚拟机形式运行多个操作系统。每个虚拟机都在虚拟硬件上运行&#xff0c;可以创建虚拟硬盘驱动器、虚拟交换机等虚拟设备。使用虚拟化可以运行需要较旧版本的 Windows 或非 Windows 操作系统的软件&#xff0c;以…

第6章 图论

2024年12月25日一稿 &#x1f430;6.1 图的基本概念 6.1.1 图的定义和表示 6.1.2 图的同构 6.1.3 完全图与正则图 6.1.4 子图与补图 6.1.5 通路与回路 6.2 图的连通性 6.2.1 无向图的连通性 6.2.2 有向图的连通性 6.3 图的矩阵表示 6.3.1 关联矩阵 6.3.2 有向图的邻接矩阵…

智能网关在电力物联网中的应用

摘要 随着电力技术的快速发展&#xff0c;断路器从传统的单一保护功能演变为具备智能监控和远程管理能力的多功能设备。智能断路器作为配电系统的重要组成部分&#xff0c;集成了实时监测、远程控制和多层保护功能&#xff0c;显著提升了配电系统的安全性、稳定性和管理效率…

【论文阅读】Comprehensive Review of End-to-End Video Compression

摘要&#xff1a; 近年来&#xff0c;端到端视频压缩作为一种新兴且有前景的解决方案开始在视频压缩领域受到关注。本文对端到端视频编码和解码技术的发展与现状进行了全面的综述&#xff0c;详细介绍了传统混合编码器和端到端编码器的基本原理。本研究深入探讨了从传统视频压…

系统架构师考试 常错题记录 01

1.按照《中华人民共和国著作权法》的权利保护期&#xff08; &#xff09;受到永久保护。 A.发表权 B.修改权 C.复制权 D.发行权 正确答案&#xff1a;B 解析&#xff1a;本题考查知识产权法中的《中华人民共和著作权法》保护期限知识点。 《中华人民共和著作权法》中约定署名权…

Redis-十大数据类型

Reids数据类型指的是value的类型&#xff0c;key都是字符串 redis-server:启动redis服务 redis-cli:进入redis交互式终端 常用的key的操作 redis的命令和参数不区分大小写 &#xff0c;key和value区分 1、查看当前库所有的key keys * 2、判断某个key是否存在 exists key 3、查…

IIC驱动EEPROM

代码参考正点原子 i2c_dri:主要是三段式状态机的编写 module iic_dri#(parameter SLAVE_ADDR 7b1010000 , //EEPROM从机地址parameter CLK_FREQ 26d50_000_000, //模块输入的时钟频率parameter I2C_FREQ 18d250_000 //IIC_SCL的时钟频率)( …

webrtc获取IceCandidate流程

在WebRTC(Web Real-Time Communication)中,ICECandidate是一个关键概念,它用于描述在建立点对点(P2P)连接时可以考虑的潜在通信端点。以下是关于WebRTC中ICECandidate的详细解释: 一、ICECandidate的定义 ICECandidate对象通常包含以下关键属性: foundation:用于唯一…

一文彻底拿捏DevEco Studio的使用小技巧

程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java相关开发、鸿蒙开发、人工智能等,专注于程序员搞钱那点儿事,希望在搞钱的路上有你相伴&#xff01;君志所向,一往无前&#xff01; 0.安装DevEco Studio DevEco Studio面向HarmonyOS应用及元服务开发者提供的集成开…

基于openEuler22.09部署OpenStack Yoga云平台(一)

OpenStack Yoga部署 安装OpenStack 一、基础准备 基于OpenStack经典的三节点环境进行部署&#xff0c;三个节点分别是控制节点&#xff08;controller&#xff09;、计算节点&#xff08;compute&#xff09;、存储节点&#xff08;storage&#xff09;&#xff0c;其中存储…

新服务器ubuntu系统相关操作

1、查看驱动:驱动版本535.216.01能够支持cuda12.2,下面直接使用默认安装的cuda。 2、赋予用户管理员权限。 首先有超级用户(root)权限来编辑 /etc/sudoers 文件,visudo 是一个命令,用于安全地编辑 /etc/sudoers 文件。运行: sudo visudo 在 visudo 编辑器中,找到类似…

微机接口课设——基于Proteus和8086的打地鼠设计(8255、8253、8259)

原理图设计 汇编代码 ; I/O 端口地址定义 IOY0 EQU 0600H IOY1 EQU 0640H IOY2 EQU 0680HMY8255_A EQU IOY000H*2 ; 8255 A 口端口地址 MY8255_B EQU IOY001H*2 ; 8255 B 口端口地址 MY8255_C EQU IOY002H*2 ; 8255 C 口端口地址 MY8255_MODE EQU IOY003H*2 ; …

【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】

目录&#x1f60b; 任务描述 相关知识 1. 二叉树的基本概念与结构定义 2. 建立二叉树 3. 先序遍历 4. 中序遍历 5. 后序遍历 6. 层次遍历 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;实现二叉树的遍历 相关知识 为了完成本关任务&#xff0c;你需要掌…

简单园区网拓扑实验

1.实验拓扑 2.实验要求 1、按照图示的VLAN及IP地址需求&#xff0c;完成相关配置 2、要求SW1为VLAN 2/3的主根及主网关 SW2为vlan 20/30的主根及主网关 SW1和SW2互为备份 3、可以使用super vlan 4、上层通过静态路由协议完成数据通信过程 5、AR1为企业出口路由器 6、要求全网可…

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这个文件&…

C++---------动态内存管理

以下是对 C 中相关概念的详细说明及代码示例&#xff1a; 一、动态分配和堆 new 操作符&#xff1a; new 操作符用于在堆上动态分配内存。它会调用对象的构造函数&#xff08;如果是类对象&#xff09;并返回指向分配内存的指针。示例&#xff1a; #include <iostream&g…