容器编排学习(五)卷的概述与存储卷管理

news2024/9/23 1:32:42

一  卷

1  容器化带来的问题

容器中的文件在磁盘上是临时存放的,这给容器中运行的重要的应用程序带来一些问题

问题1:当容器崩溃或重启的时候,kubelet 会以干净的状态(镜像的状态)重启容器,容器内的历史数据会丢失

问题2:当容器被删除时 (k8s 没有停止容器的概念,只有创建、删除),容器内的数据也会被一起清理

问题3:多个容器中有共享文件或目录的需求

2  卷是什么

卷是一个抽象化的存储设备

3  为什么使用卷

卷可以解决容器崩溃或重启后历史数据丢失的问题

卷可以解决容器或 Pod 被删除后数据持久保存的问题

卷可以解决在多个容器内共享数据的问题

Pod 可以同时使用任意数目的卷

4  k8s支持的卷的类型

持久卷:持久卷是集群中的存储资源,就像他的名字一样在里面存储的数据不会随着 Pod 的删除而丢失

临时卷:有些应用程序需要额外的存储,但并不关心数据在重启后是否仍然可用。卷会遵从 Pod 的生命周期,与 Pod一起创建和删除

投射卷:它允许您将多个现有卷源映射到同一个目录。通过将这些不同类型的卷源组合成一个统一的卷,可以更方便地管理和使用这些资源

Pod资源文件

[root@master ~]# vim web1.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: web1
spec:
  containers:
  - name: nginx
    image: myos:nginx

二  持久卷

1  hostPath卷

  • hostPath 卷的本质是使用本地设备,例如磁盘、分区、目录、Socket、CharDevice 和 BlockDevice 等等。hostPath卷的可用性取决于底层节点的可用性,如果节点变得不健康那么 hostPath 卷也将不可被访问。
  • hostPath 卷里面的数据不会随着 Pod的结束而消失
  • 注意事项:配置相同的 Pod,可能在不同的节点上表现不同因为不同节点上映射的文件内容不同

使用 hostPath 卷保存日志

[root@master ~]# vim web1.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: web1
spec:
  volumes:                     # 卷定义
  - name: logdata              # 卷名称
    hostPath:                  # 资源类型
      path: /var/weblog        # 宿主机路径
      type: DirectoryOrCreate  # 目录不存在就创建
  containers:
  - name: nginx
    image: myos:nginx
    volumeMounts:                       # mount 卷
    - name: logdata                     # 卷名称
      mountPath: /usr/local/nginx/logs  # 容器内路径

type对应的类型

验证 hostPath 卷

[root@master ~]# kubectl apply -f web1.yaml 
pod/web1 created
[root@master ~]# kubectl get pods -o wide
NAME   READY   STATUS    RESTARTS   AGE     IP             NODE
web1   1/1     Running   0          45m   10.244.2.16    node-0002

[root@master ~]# curl http://10.244.2.16/
Nginx is running !

# 删除Pod ,日志数据也不会丢失
[root@master ~]# kubectl delete pod web1
pod "web1" deleted

# 来到 node 上查看日志
[root@node-0002 ~]# cat /var/weblog/access.log 
10.244.0.0 - - [27/Jun/2022:02:00:12 +0000] "GET / HTTP/1.1" 200 19 "-" "curl/7.29.0"

2  NFS卷

NFS存储

  • k8s中允许将 nfs 存储以卷的方式挂载到你的 Pod 中
  • 在删除 Pod 时,nfs 存储卷会被卸载 (umount),而不是被删除。nfs 卷可以在不同节点的 Pod 之间共享数据。

NFS卷的用途

NFS最大的功能就是在不同节点的不同 Pd 中共享读写数据。本地NFS的客户端可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。

名称IP地址配置
nfs192.168.1.101CPU,1G内存

 配置NFS服务

# 创建共享目录,并部署测试页面
[root@nfs ~]# mkdir -p /var/webroot
[root@nfs ~]# echo "nfs server" >/var/webroot/index.html

# 部署 NFS 服务
[root@nfs ~]# dnf install -y nfs-utils
[root@nfs ~]# vim /etc/exports
/var/webroot    192.168.1.0/24(rw,no_root_squash)
[root@nfs ~]# systemctl enable --now nfs-server.service
#----------------------------------------------------------#
# 由于 Pod 是随机调度的,为了保证 NFS 存储卷可以正确加载,需要在所有 node 节点都安装 NFS软件工具包
[root@node ~]# dnf install -y nfs-utils

Pod调用NFS卷

[root@master ~]# vim web1.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: web1
spec:
  volumes:
  - name: logdata
    hostPath:
      path: /var/weblog
      type: DirectoryOrCreate
  - name: website              # 卷名称
    nfs:                       # NFS 资源类型
      server: 192.168.1.10     # NFS 服务器地址
      path: /var/webroot       # NFS 共享目录
  containers:
  - name: nginx
    image: myos:nginx
    volumeMounts:
    - name: logdata
      mountPath: /usr/local/nginx/logs
    - name: website                     # 卷名称
      mountPath: /usr/local/nginx/html  # 路径

[root@master ~]# kubectl apply -f web1.yaml 
pod/web1 created
[root@master ~]# kubectl get pods -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP            NODE
web1   1/1     Running   0          12m   10.244.1.19    node-0001

访问验证 nfs 卷

[root@master ~]# curl http://10.244.1.19 
nfs server

三  PV/PVC

1  概述

PV 的全称是 Persistent Volume,是持久卷

PVC 的全称是 PersistentVolumeClaim,是持久卷声明

2  用途

存储的管理是一个与计算实例的管理完全不同的问题。管理员希望能提供一种通用的 API来完成Pod 对卷的部署管理与使用。PV/PVC就是为了满足这和需求而诞生的,PV/PVC的引入使集群具备了存储的逻辑抽象能力。

3  k8s支持的存储卷

  • -cephfs - - CephFS volume
  • -csi--fc  - -  容器存储接口(CSI)
  • -fc - - Fibre Channel (FC) 存储
  • -hostPath - - HostPath 卷
  • -iscsi-iSCSI - - (SCSI over IP) 存储
  • -nfs - - 网络文件系统 (NFS)存储
  • -rbd -- Rados 块设备(RBD) 卷

4  使用PV/PVC

PV 是资源的提供者,根据集群的基础设施变化而变化,由K8s集群管理员配置

PVC是资源的使用者,根据业务服务的需求变化来配置,用户无需知道PV的技术细节,只需要声明你需求什么样的资源即可

PVC会根据用户声明的需求,自动找到 PV完成绑定

5  PV资源文件

  • PV资源文件(hostPath)

---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv-local
spec:
  volumeMode: Filesystem                  # 提供的资源类型 [Filesystem,Block]
  accessModes:                            # 存储卷能提供的访问模式
    - ReadWriteOnce                       # 卷支持的模式,支持多种
    - ReadOnlyMany                        # RWO,ROX,RWX,RWOP
  capacity:                               # 存储卷能提供的存储空间
    storage: 30Gi                         # 空间大小
  persistentVolumeReclaimPolicy: Retain   # 数据回收方式
  hostPath:                               # hostPath配置
    path: /var/weblog
    type: DirectoryOrCreate
  • PV资源文件(NFS)

---
kind: PersistentVolume
apiVersion: v1
metadata:                       
  name: pv-nfs
spec:
  volumeMode: Filesystem                 # 提供 Fileststem 访问方式
  accessModes:                           # NFS 支持多种访问方式
    - ReadWriteOnce                      # RWO,ROX,RWX
    - ReadOnlyMany
    - ReadWriteMany
  capacity:
    storage: 20Gi                        # 提供的磁盘空间大小
  persistentVolumeReclaimPolicy: Retain  # 数据手工回收
  mountOptions:                          # mount 的参数
    - nolock
  nfs:                                   # NFS配置
    server: 192.168.1.10                 # <NFS服务器IP地址>
    path: /var/webroot                   # <共享目录路径>
  • 创建 PV

# 创建 PV
[root@master ~]# kubectl apply -f pv.yaml 
persistentvolume/pv-local created
persistentvolume/pv-nfs created

# 查看PV状态
[root@master ~]# kubectl get persistentvolume
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS       AGE
pv-local   30Gi       RWO            Retain           Available    2s
pv-nfs     20Gi       RWO,ROX,RWX    Retain           Available    2s
  • 持久卷

[root@master ~]# vim pv.yaml
---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv-local
spec:
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 30Gi
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /var/weblog
    type: DirectoryOrCreate

---
kind: PersistentVolume
apiVersion: v1
metadata:                       
  name: pv-nfs
spec:
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
    - ReadOnlyMany
    - ReadWriteMany
  capacity:
    storage: 20Gi
  persistentVolumeReclaimPolicy: Retain
  mountOptions:
    - nolock
  nfs:
    server: 192.168.1.10
    path: /var/webroot

[root@master ~]# kubectl apply -f pv.yaml 
persistentvolume/pv-local created
persistentvolume/pv-nfs created
[root@master ~]# kubectl get persistentvolume
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS       AGE
pv-local   30Gi       RWO            Retain           Available    2s
pv-nfs     20Gi       RWO,ROX,RWX    Retain           Available    2s

6  PVC资源文件

持久卷声明

[root@master ~]# vim pvc.yaml
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc1
spec:                        # 定义需求 
  volumeMode: Filesystem     # 需要使用 Filesystem 的存储卷
  accessModes:
    - ReadWriteOnce          # 需要支持 RWO 的存储卷
  resources:
    requests:
      storage: 25Gi          # 最小磁盘需求

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc2
spec:
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 15Gi

[root@master ~]# kubectl apply -f pvc.yaml 
persistentvolumeclaim/pvc1 created
persistentvolumeclaim/pvc2 created
[root@master ~]# kubectl get persistentvolumeclaims 
NAME   STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc1   Bound    pv-local   30Gi       RWO                           8s
pvc2   Bound    pv-nfs     20Gi       RWO,ROX,RWX                   8s

7  Pod调用PVC

映射PVC为卷

  • 使用 PVC用户无需关心后端存储设备
  • 系统会自动查找匹配

Pod 挂载 PVC

[root@master ~]# vim web1.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: web1
spec:
  volumes:                   # 卷定义
  - name: logdata            # 卷名称
    persistentVolumeClaim:   # 通过PVC引用存储资源
      claimName: pvc1        # PVC名称
  - name: website            # 卷名称
    persistentVolumeClaim:   # 通过PVC引用存储资源
      claimName: pvc2        # PVC名称
  containers:
  - name: nginx
    image: myos:nginx
    volumeMounts:
    - name: logdata                      # PVC卷名称
      mountPath: /usr/local/nginx/logs   # 挂载路径
    - name: website                      # PVC卷名称
      mountPath: /usr/local/nginx/html   # 挂载路径

服务验证

创建 Pod 后访问查看

[root@master ~]# kubectl delete pods web1
pod "web1" deleted
[root@master ~]# kubectl apply -f web1.yaml 
pod/web1 created
[root@master ~]# kubectl get pods -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP             NODE
web1   1/1     Running   0          45m   10.244.2.16    node-0002
[root@master ~]# curl http://10.244.2.16 
nfs server

四  存储卷管理

1  临时卷

configMap

<1>  概述

configMap 是一种临时卷

configMap 卷提供了向 Pod 注入配置数据的方法,允许你将配置文件与镜像分离,使容器化的应用具有可移植性。

configMap 在使用之前需要先创建它,configMap 不是用来保存大量数据的,在其中保存的数据不可超过 1 MiB。

<2>  用途

配置环境变量

修改配置文件的参数,数据库的地址等

<3>  修改系统时区 

  • 修改系统时区 01

创建 configMap 语法格式

kubectI  create configmap  名称  [选项/参数]

# 使用命令创建 configMap
[root@master ~]# kubectl create configmap tz --from-literal=TZ="Asia/Shanghai"
configmap/tz created

# 使用资源对象文件创建
[root@master ~]# vim timezone.yaml
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: timezone
data:
  TZ: Asia/Shanghai

[root@master ~]# kubectl apply -f timezone.yaml
configmap/timezone created

[root@master ~]# kubectl get configmaps 
NAME               DATA   AGE
kube-root-ca.crt   1      9d
timezone           1      15s
tz                 1      50s
  • 修改系统时区 02
[root@master ~]# vim web1.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: web1
spec:
  volumes:
  - name: logdata
    persistentVolumeClaim:
      claimName: pvc1
  - name: website
    persistentVolumeClaim:
      claimName: pvc2
  containers:
  - name: nginx
    image: myos:nginx
    envFrom:              # 配置环境变量
    - configMapRef:       # 调用资源对象
        name: timezone    # 资源对象名称
    volumeMounts:
    - name: logdata
      mountPath: /usr/local/nginx/logs
    - name: website
      mountPath: /usr/local/nginx/html

[root@master ~]# kubectl delete pods web1
pod "web1" deleted
[root@master ~]# kubectl apply -f web1.yaml 
pod/web1 created
[root@master ~]# kubectl exec -it web1 -- date +%T
10:41:27
<4>  nginx解析php

在 Pod 中增加 php 容器,与 nginx 共享同一块网卡

  • 添加容器
# 在 Pod 中增加 php 容器,与 nginx 共享同一块网卡
[root@master ~]# vim web1.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: web1
spec:
  volumes:
  - name: logdata
    persistentVolumeClaim:
      claimName: pvc1
  - name: website
    persistentVolumeClaim:
      claimName: pvc2
  containers:
  - name: nginx
    image: myos:nginx
    envFrom:
    - configMapRef:
        name: timezone
    volumeMounts:
    - name: logdata
      mountPath: /usr/local/nginx/logs
    - name: website
      mountPath: /usr/local/nginx/html
  - name: php                            # 以下为新增加内容
    image: myos:php-fpm
    envFrom:                             # 不同容器需要单独配置时区
    - configMapRef:
        name: timezone
    volumeMounts:
    - name: website                      # 不同容器需要单独挂载NFS
      mountPath: /usr/local/nginx/html

[root@master ~]# kubectl delete pod web1
pod "web1" deleted
[root@master ~]# kubectl apply -f web1.yaml 
pod/web1 created
[root@master ~]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
web1   2/2     Running   0          5s
[root@master ~]# kubectl exec -it web1 -c nginx -- ss -ltun
Netid       State        Recv-Q       Send-Q             Local Address:Port       ... ...
tcp         LISTEN       0            128                      0.0.0.0:80         ... ...
tcp         LISTEN       0            128                    127.0.0.1:9000       ... ...
  • 制作配置文件
# 使用 nginx 配置文件创建 configMap
[root@master ~]# kubectl cp -c nginx web1:/usr/local/nginx/conf/nginx.conf nginx.conf
[root@master ~]# vim nginx.conf
        location ~ \.php$ {
            root            html;
            fastcgi_pass    127.0.0.1:9000;
            fastcgi_index   index.php;
            include         fastcgi.conf;
        }

# 使用命令创建 configMap
[root@master ~]# kubectl create configmap nginx-php --from-file=nginx.conf 
configmap/nginx-php created
  • 映射配置文件
[root@master ~]# vim web1.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: web1
spec:
  volumes:
  - name: logdata
    persistentVolumeClaim:
      claimName: pvc1
  - name: website
    persistentVolumeClaim:
      claimName: pvc2
  - name: nginx-php     # 卷名称
    configMap:          # 引用资源对象
      name: nginx-php   # 资源对象名称
  containers:
  - name: nginx
    image: myos:nginx
    envFrom:
    - configMapRef:
        name: timezone
    volumeMounts:
    - name: nginx-php                              # 卷名称
      subPath: nginx.conf                          # 键值(文件名称)
      mountPath: /usr/local/nginx/conf/nginx.conf  # 路径
    - name: logdata
      mountPath: /usr/local/nginx/logs
    - name: website
      mountPath: /usr/local/nginx/html
  - name: php
    image: myos:php-fpm
    envFrom:
    - configMapRef:
        name: timezone
    volumeMounts:
    - name: website
      mountPath: /usr/local/nginx/html
  • php解析验证
# 拷贝测试页面 s4/public/info.php
[root@ecs-proxy s4]# rsync -av public/info.php  192.168.1.10:/var/webroot/info.php
#---------------------------------------------------------------------------------#
[root@master ~]# kubectl delete pod web1 
pod "web1" deleted
[root@master ~]# kubectl apply -f web1.yaml 
pod/web1 created
[root@master ~]# kubectl get pods -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP             NODE
web1   2/2     Running   0          18s   10.244.3.17    node-0003

  • 页面解析测试
[root@master ~]# curl http://10.244.3.17/info.php
<pre>
Array
(
    [REMOTE_ADDR] => 10.244.0.0
    [REQUEST_METHOD] => GET
    [HTTP_USER_AGENT] => curl/7.29.0
    [REQUEST_URI] => /info.php
)
php_host:   web1
1229

2  secret卷

<1>  概述

Secret 是一种临时卷

Secret 类似于 ConfigMap 但专门用于保存机密数据

在设置 Secret.data 字段时,所有键值都必须是经过base64编码的字符串

<2>  用途

配置一些需要加密的环境变量或文件(例如:https 证书)

访问需要认证登录的私有镜像仓库(例如: harbor 私有仓库)

<3>  语法格式

kubect creat secret 子类型 名称 [选项/参数]

<4>  子类型

  • 通用类型

kubect creat secret generic 名称 [选项/参数]

  • 用于认证登录私有仓库的子类型

kubect creat secret docker-registry 名称 [选项/参数]

  • 用于创建TLS证书的子类型

kubectl create secret tls 名称 [选项/参数]

<5> 登录私有仓库
  • 仓库 harbor:443/myimg/httpd:latest需要认证
  • 使用私有仓库中的镜像创建容器
# 创建需要登录私有仓库的资源对象
[root@master ~]# kubectl create secret docker-registry harbor-auth --docker-server=harbor:443 --docker-username="用户名" --docker-password="密码"
secret/harbor-auth created

[root@master ~]# kubectl get secrets harbor-auth -o yaml
apiVersion: v1
data:
  .dockerconfigjson: <经过加密的数据>
kind: Secret
metadata:
  name: harbor-auth
  namespace: default
  resourceVersion: "1558265"
  uid: 08f55ee7-2753-41fa-8aec-98a292115fa6
type: kubernetes.io/dockerconfigjson
<6>  登录认证私有仓库
[root@master ~]# vim web2.yaml 
---
kind: Pod
apiVersion: v1
metadata:
  name: web2
spec:
  imagePullSecrets:                           # 引用 secret 数据
  - name: harbor-auth                         # 资源对象名称
  containers:
  - name: apache
    image: harbor:443/myimg/httpd:latest      # 使用私有仓库里的镜像

[root@master ~]# kubectl apply -f web2.yaml
pod/web2 created
[root@master ~]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
web1   2/2     Running   0          33m
web2   1/1     Running   0          18m

3  emptyDir卷

<1>  概述

emptyDir 的本质是一个简单的空目录

emptyDir 可以提供临时空间,同一个 Pod 中容器也可以用来共享数据。案例:缓存服务器、数据统计分析、排序等

emptyDir 随 Pod 创建而创建,Pod 在该节点上运行期间一直存在。当 Pod 被从节点上删除时,临时卷中的数据也会被永久删除

重启 Pod中的容器不会造成 emptyDir 数据的丢失

<2>  临时空间

[root@master ~]# vim web2.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: web2
spec:
  imagePullSecrets:
  - name: harbor-auth
  volumes:               # 卷配置
  - name: cache          # 卷名称
    emptyDir: {}         # 资源类型
  containers:
  - name: apache
    image: harbor:443/myimg/httpd:latest
    volumeMounts:            # 挂载卷
    - name: cache            # 卷名称
      mountPath: /var/cache  # 路径

<3>  验证配置

创建容器,验证配置

[root@master ~]# kubectl delete pod web2 
pod "web2" deleted
[root@master ~]# kubectl apply -f web2.yaml 
pod/web2 created
[root@master ~]# kubectl exec -it web2 -- bash
[root@web2 html]# mount -l |grep cache
/dev/vda1 on /var/cache type xfs (rw,relatime,attr2)

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

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

相关文章

Mediasoup本地部署

一、环境 1、nodejs、npm、mac、ssh 注意:不能使用python3&#xff0c;请用自带的python 二、代码下载 1、mediasoup-demo 包含app(客户端)、server(服务端)、broadcasters(推流模块) git clone https://github.com/versatica/mediasoup-demo.git git checkout v3 2、me…

RC-u3 兰州拉面派餐系统--睿抗2023国赛

兰州拉面是著名美食&#xff0c;其煮面很有讲究&#xff0c;不同种类的面需要煮不同的时长。拉面馆的煮面师傅的规则很简单&#xff0c;只要手头有煮面篮子是空闲的&#xff0c;就把下一份客单指定的面放到空闲篮子里煮&#xff1b;如果空闲的篮子不止一个&#xff0c;那么先放…

无涯教程-JavaScript - BITLSHIFT函数

描述 BITLSHIFT函数返回一个左移指定位数的数字。 语法 BITLSHIFT (number, shift_amount)争论 Argument描述Required/OptionalnumberNumber must be an integer greater than or equal to 0.Requiredshift_amountShift_amount must be an integer.Required Notes 向左移动…

Zenlayer 软件定义网络平台赋能海底光缆服务

上海&#xff0c;2023年9月6日&#xff0c;一年一度的印尼电信国际大会——Batic在巴厘岛隆重举行。该盛会云集了亚太地区电信及相关行业的重要领导者&#xff0c;就“共塑亚太地区数字化未来”进行了深入探讨。Zenlayer作为该会议的黄金赞助商&#xff0c;宣布将在原有L2、L3网…

Science adv | 转录因子SPIC连接胚胎干细胞中的细胞代谢与表观调控

代谢是生化反应网络的结果&#xff0c;这些反应吸收营养物质并对其进行处理&#xff0c;以满足细胞的需求&#xff0c;包括能量产生和生物合成。反应的中间体被用作各种表观基因组修饰酶的底物和辅助因子&#xff0c;因此代谢与表观遗传密切相关。代谢结合表观遗传涉及疾病&…

【特殊文本文件——Properties和xml文件】

特殊文本文件 一、Properties 是一个Map集合&#xff08;键值对集合&#xff09;&#xff0c;但是我们一般不会当集合用核心作用&#xff1a;Properties是用来代表属性文件的&#xff0c;通过Properties可以读写属性文件里的内容 1.使用Properties读取属性文件里的键值对数据…

基于51单片机烟雾温度检测报警系统设计

一、系统方案 本设计采用52单片机作为主控器&#xff0c;液晶1602显示&#xff0c;DS18B20采集温度&#xff0c;MQ2采集烟雾值&#xff0c;火焰传感器&#xff0c;按键设置报警&#xff0c;声光报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系…

MS-TTS:免费微软TTS语音合成工具(一键合成导出MP3音频)

声明 本工具是个免费工具&#xff0c;遇到问题&#xff0c;还请自行解决&#xff0c;下面有文字教程&#xff0c;B站有视频教程&#xff08;链接在文章末尾&#xff09;&#xff1b; 其次&#xff0c;微软接口卡顿&#xff0c;连接超时等问题下方有详细说明&#xff0c;请仔细…

视频怎么制作动图?分享简单的视频制作gif方法

现在的人们常用视频来记录自己的生活&#xff0c;但是视频的体积都会比较大&#xff0c;保存传输非常的不方便。我们可以将视频制作成gif动图来使用&#xff0c;而且gif动图也能将自己的心情想表达的想法通过这种个性的方式展示给对方。接下来&#xff0c;就给大家分享一款视频…

雅思 四处刷题的记录(一)

目录 阅读 九分达人7 test2 p2 听力 剑18 test1 section 1 剑18 test1 section 2 《九分达人》6 test3 section 1 and section 2 阅读 《九分达人》7 test2 passage1 词汇 Travelling的含义 town跟介词在一起的搭配 什么情况下使用on 大作文写作思路 当我们要使…

Python自动化测试(超详细~)

1. 概述 1.1 python自动化 什么是python自动化&#xff1f;我理解的Python自动化测试就是把以前人为测试转化为机器测试的一种过程。自动化测试是一种比手工测试更快获得故障反馈的方法。 自动化测试是一种质量保障的方式&#xff0c;最重要的还是以做好一款高质量产品为前提…

商用柴油车J1939油耗管理及北斗TBOX在物流运输中的应用

随着电商的兴起&#xff0c;网上购物的用户越来越多&#xff0c;网购、直播带货、精品电商等&#xff0c;促进了大量的物品流动&#xff0c;原本在一定程度上&#xff0c;物流管理上还有一些小混乱&#xff0c;但是随着监管和政策调整&#xff0c;物流互联数字平台对于货物流动…

deepstream6.2部署yolov5详细教程与代码解读

文章目录 引言一.环境安装1、yolov5环境安装2、deepstream环境安装 二、源码文件说明三.wts与cfg生成1、获得wts与cfg2、修改wts 四.libnvdsinfer_custom_impl_Yolo.so库生成五.修改配置文件六.运行demo 引言 DeepStream 是使用开源 GStreamer 框架构建的优化图形架构&#xf…

SAP FI之批量修改财务凭证的BAPI

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 一般涉及修改财务凭证&#xff0c;或者其它凭证&#xff0c;不应直接更新数据库&#xff0c;而是使用系统提供的function module,或者BAPI&#xff0c;或者使用BDC。 一、 示例&#xf…

《Effective STL》读书笔记(四):迭代器

iterator 优先于 const_iterator, reverse_iterator, const_reverse_iterator STL中所有标准容器都提供了标题提到的四种迭代器类型。对于容器container<T>而言&#xff0c;iterator类型相当于T*&#xff0c;const_iterator类型相当于const T*&#xff0c;剩下两个是反向…

XP小皮面板中的Mysql启动就停止,本地Mysql无法启动解决方法

前言&#xff1a; XP小皮面板中的mysql启动就停止&#xff0c;尝试查看很多方法无效&#xff0c;任务管理器mysql也尝试了先终止后启动&#xff0c;没反应... 解决方法 打开CMD&#xff0c;输入命令行 sc delete Mysql 这个命令是删除本地Mysql服务 然后再点开小皮的…

数学计算式转为表达式树

数据结构“栈”的一个用途就是&#xff1a;平衡符号&#xff0c;比如这样一个代数式&#xff1a;&#xff08;a(bc)*a(e*fa*(cd))&#xff09;,你能一眼看出这个式子的括号是否正确吗&#xff1f; 更何况还可以加入中括号&#xff08;[]&#xff09;,大括号&#xff08;{}&…

harmony应用签名

1. 随便搞个halloworld程序 2.生成私匙与证书请求文件 我就是key store file选择了一个文件夹&#xff0c;又不给任何提示&#xff0c;等我输入密码时才提示 填写图中内容即可&#xff0c;图中未填项可不填 点击完成即可

CPSE深圳充换电展开幕,飞凌嵌入式引领智能充储技术新潮流

9月6日&#xff0c;2023第六届深圳国际充电桩及换电站展览会&#xff08;简称&#xff1a;CPSE深圳充换电展&#xff09;在深圳会展中心&#xff08;福田&#xff09;开幕&#xff0c;飞凌嵌入式如期亮相&#xff0c;与来自全国的客户朋友及合作伙伴一同交流分享企业在智能充电…

WebDAV之π-Disk派盘 + 天悦日记

天悦日记是一款清爽简约的日记记录工具,通过天悦日记app随时随地快速写日记,更有智能数据统计分析报表,多端同步多种备份,本地备份和基于WebDAV协议的云端备份。跨平台使用,支持多设备、多平台无差别使用。天悦日记将每一天经历都清晰记录在手机,一目了然知道曾经的经历,…