K8S的持久化存储

news2024/11/13 12:15:24

文章目录

  • 一、持久化存储
    • emptyDir
      • 实际操作
    • hostPath
      • 建立过程
    • NFS存储
      • NFS 存储的优点
      • NFS 存储的缺点
      • 具体操作
    • pv和pvc
      • Persistent Volume (PV)
        • 使用场景
      • Persistent Volume Claim (PVC)
        • 使用场景
      • 使用 PV 和 PVC 的场景
      • 实际操作
    • StorageClass
      • StorageClass 概述
      • 应用场景
      • 实际应用


一、持久化存储

在Kubernetes (K8s) 中,持久化存储是一个重要的概念,它允许容器化应用程序在 Pod 重启或重新调度时保留数据。

使用存储卷,需要如下步骤:
1、定义 pod 的 volume,这个 volume 指明它要关联到哪个存储上的。
volumes:
- mountPath: PATH
name: NAME
2、在容器中要使用 volumemounts 挂载对应的存储。
volumeMounts:
- mountPath: PATH
name: PATH_NAME

emptyDir

emptyDir 是 Kubernetes 中的一种基本卷类型,它为 Pod 中的容器提供了临时存储空间。

生命周期:

  • emptyDir 卷的生命周期与 Pod 相同。
  • 当 Pod 被分配到节点时创建,当 Pod 从节点上移除时删除。

作用:

  • 临时文件存储
  • 计算过程中的中间数据
  • 容器间共享的临时数据
  • 作为应用程序的缓存

可以通过默认截止指定大小限制,来限制 emptyDir 卷的存储容量。来防止占满整个磁盘应用。

实际操作

apiVersion: v1
kind: Pod  
metadata:  
  name: nginx
spec:
  containers:
  - name: nginx
    image: harbor.hiuiu.com/nginx/nginx:1.21.5
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: /cache# 指定容器中的目录。
      name: cache-volume
  volumes:
  - name: cache-volume#创建一个cache-volume的卷
    emptyDir:
      sizeLimit: 500Mi

验证过程:
找到pod相对应的node节点,并找出uid,去相对应的节点找到这个文件夹。

kubectl get pod nginx -o yaml |grep uid
kubectl get pod -o wide

在这里插入图片描述

kubectl exec -it -n <namespace> <pod-name> -c <container-name> -- /bin/bash
进入容器内部,然后验证结果。

容器内部:
在这里插入图片描述
对应的pod上:
在这里插入图片描述
缺点:

hostPath

hostPath 是 Kubernetes 中的一种卷类型,它允许将主机节点的文件系统上的文件或目录挂载到 Pod 中。以下是关于 hostPath 的重要概念和特性:

  1. 功能:

    • 允许 Pod 访问主机文件系统。
    • 可以挂载单个文件或整个目录。
  2. 持久性:

    • 数据持久存在于主机上,即使 Pod 被删除。
  3. 使用场景:

    • 访问主机系统文件。
    • 在容器中运行需要访问 Docker 内部的应用。

建立过程

apiVersion: apps/v1
kind: Deployment  
metadata:  
  name: nginx-deployment
  labels:
    app: nginx-dep
spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: harbor.hiuiu.com/nginx/nginx:1.22a
        ports:
        - containerPort: 80 #以上是用deployment建立pod
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: nginx-volume
      volumes:
      - name: nginx-volume
        hostPath:
          path: /data/webs
          type: DirectoryOrCreate#type的值有不同的
---
apiVersion: v1
kind: Service
metadata:
  name: my-nodeport
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30007
#建立service,可以通过外网访问

将这些 hostPath 的类型:

  1. DirectoryOrCreate
    • 如果路径不存在,创建一个空目录
    • 权限设置为 0755
    • 与 kubelet 具有相同的组和属主信息
  2. Directory
    • 在指定路径上必须已存在目录
  3. FileOrCreate
    • 如果路径不存在,创建一个空文件
    • 权限设置为 0644
    • 与 kubelet 具有相同的组和所有权
  4. File
    • 在指定路径上必须已存在文件
  5. Socket
    • 在指定路径上必须存在 UNIX 套接字
  6. CharDevice (仅限 Linux 节点)
    • 在指定路径上必须存在字符设备
  7. BlockDevice (仅限 Linux 节点)
    • 在指定路径上必须存在块设备

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在不同的节点上,不同的pod会有不同的效果。这是因为挂载的文件内容是不一样的。

NFS存储

在 Kubernetes 中,NFS(Network File System)是一种用于共享存储的卷类型,可以在多个 Pod 之间共享持久化数据。使用 NFS 卷允许不同节点上的 Pod 访问同一存储空间,适合需要共享文件存储的应用场景。以下是关于 Kubernetes 中 NFS 存储的关键点:

NFS 存储的优点

  1. 共享访问

    • 多个 Pod 可以同时访问同一个 NFS 卷,实现数据共享。
  2. 持久性

    • 数据存储在 NFS 服务器上,与 Pod 的生命周期独立,这样即使 Pod 被删除,数据也会被保留。
  3. 可移植性

    • 可以在不同节点和 Pod 之间轻松移动和共享数据。
  4. 分离存储和计算

    • 存储和计算可以分别扩展,从而优化资源使用。
  5. 集中管理

    • 简化了对存储的管理,可以在集中式文件系统中进行备份和恢复。

NFS 存储的缺点

  1. 性能

    • 相较于本地存储,网络传输可能会导致较高的延迟。
    • 性能可能受到网络带宽和 NFS 服务器性能的限制。
  2. 可用性依赖

    • NFS 服务器成为数据访问的单点故障,需确保其高可用性。
  3. 安全性

    • 需要配置适当的权限和网络策略以防止未经授权的访问。
  4. 复杂的设置

    • 需要在 Kubernetes 外部配置和维护 NFS 服务器。

具体操作

apt install nfs-kernel-server
vim /etc/exports
/data/disk *(rw,sync,no_root_squash,no_subtree_check)

代表的含义:

  • /data/disk:

    • 这是你在 NFS 服务器上导出的目录路径。客户端将能够通过 NFS 挂载并访问此目录。
  • *:

    • 代表允许所有主机访问该导出。通常在生产环境中,为了安全起见,这一部分会被限定为特定的主机或域名,例如 192.168.1.0/24 或者 *.example.com
  • rw:

    • Read/Write,允许客户端对该导出的目录进行读和写操作。
  • sync:

    • 规定 NFS 服务器在响应前,将所有数据写入磁盘。这确保了数据的持久性,即使服务器意外崩溃后,数据不易丢失。sync 选项较 async 有更好的数据完整性,但可能会稍微影响性能,因为需要等待数据实际写入磁盘。
  • no_root_squash:

    • 默认情况下,NFS 会将客户端的 root 用户请求映射为匿名用户,这被称为 root_squash,防止远程 root 用户在服务器上拥有 root 权限。而 no_root_squash 则取消这个映射,允许客户端的 root 用户对导出的文件和目录具有 root 权限。这一选项在某些情况下可能造成安全漏洞,因为它允许更高特权的访问。
  • no_subtree_check:

    • 禁用子树检查。这一选项用于提升性能。默认情况下,NFS 会检查客户端请求是否属于导出文件系统中的子树。然而,如果导出目录不是文件系统的根目录,检查会增加开销。禁用此选项可以减少这种开销。
exportfs -arv
刷新/etc/exports文件
apiVersion: v1
kind: Pod  
metadata:  
  name: nginx
spec:
  containers:
  - name: nginx
    image: harbor.hiuiu.com/nginx/nginx:1.21.5
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: /usr/share/nginx/html#镜像共享的地址
      name: nginx-volume
  volumes:
  - name: nginx-volume
    nfs:
      server: 192.168.232.100#nfs服务器的地址
      path: /data/disk#本机的地址
      readOnly: false#是否是只读

验证:
进入集群,添加index.html文件。

在这里插入图片描述
挂载的文件夹中也会出现index.html。
在这里插入图片描述

pv和pvc

在 Kubernetes 中,持久存储由 Persistent Volume (PV) 和 Persistent Volume Claim (PVC) 负责管理。它们的设计使得存储与工作负载解耦,实现存储资源的动态管理和高效利用。以下是它们的详细解释以及在实际应用中的使用场景。

Persistent Volume (PV)

Persistent Volume 是一个独立于 Pod 生命周期的存储抽象。PV 是集群中具体存储的表示,由管理员管理和配置。PV 可以在多种存储后端上实现,如本地磁盘、NFS、云提供商的存储服务等。

PV 定义了:

  • 存储容量(如 1Gi)
  • 访问模式(如 ReadWriteOnce、ReadOnlyMany、ReadWriteMany)
  • 存储后端类型和具体配置(如 NFS 服务器地址和路径)
使用场景
  • 企业数据存储:例如,将重要的数据库持久化,将数据库数据文件存储在一个 PV 上,确保即便 Pod 停止或迁移,数据都不会丢失。
  • 共享存储使用:多个应用可以共享相同的持久化数据源,例如多个应用共享一个内容管理系统(CMS)的静态内容。

Persistent Volume Claim (PVC)

PVC 是用户对存储的一种请求。PVC 代表某种存储需求,如需要一个持久化的存储卷,指定的存储大小和访问模式等。PVC 将业务需求与具体存储实现分离,使得开发者无需关心底层存储的细节。

PVC 发出请求后,Kubernetes 会自动寻找满足条件的 PV 并进行绑定。
PVC 定义了:

  • 所需存储大小(如 1Gi)
  • 访问模式(需与所请求的 PV 兼容)
使用场景
  • Pod 持久化存储:对于需要持久化存储空间的应用,Pod 可以通过 PVC 使用后台的 PV,PVC 确保应用所需存储资源存续及可用。
  • 动态存储供给:通过 StorageClass 和 PVC,Kubernetes 可以自动为 PVC 创建和销毁 PV,实现存储的动态供给。

使用 PV 和 PVC 的场景

  1. 静态存储:管理员提前配置好 PV,对应于实际的存储资源。用户创建 PVC 时,这些 PVC 自主找到可用的 PV 并进行绑定,实现静态资源利用。
  2. 动态存储:通过 StorageClass,PVC 可以请求动态供应的存储。Kubernetes 使用 StorageClass 来自动化地为 PVC 创建相应的 PV。这样,存储资源在需要时动态创建,减少了管理员的工作量。
  3. 跨集群存储:通过 PV 和 PVC 的结合,可以实现多集群间共享底层存储资源,用于灾备和跨集群高可用设计。
    总结来说,PV 和 PVC 是 Kubernetes 世界中强大而灵活的持久化存储管理方式,降低了深度存储系统管理的复杂性,提供了与工作负载分离的资源管理方式,使得开发和运维能够更专注于应用本身的开发与交付。

实际操作

创建顺序:pv>pvc>pod
删除顺序:pod>pvc>pv

(1)准备存储服务

mkdir /data/disk/v{1,2,3,4,5} -p
vim /etc/exports
/data/disk/v1 *(rw,sync,no_root_squash)
/data/disk/v2 *(rw,sync,no_root_squash)
/data/disk/v3 *(rw,sync,no_root_squash)
/data/disk/v4 *(rw,sync,no_root_squash)
/data/disk/v5 *(rw,sync,no_root_squash)

(2)建立pv

apiVersion: v1  
kind: PersistentVolume  
metadata:  
  name: v1  
spec:  
  capacity:  
    storage: 1Gi  
  accessModes:  
    - ReadOnlyMany  
  nfs:  
    path: /data/volume/v1  
    server: 172.16.1.30

在 Kubernetes 中,Persistent Volume(PV)通过访问模式(Access Modes)来定义如何被 Pod 挂载和使用。访问模式对 PV 的使用场景有着重要的影响,它决定了 Pod 如何在节点间使用存储资源。
访问模式(Access Modes)

  1. ReadWriteOnce (RWO) :

    • 描述: 卷可以被单个节点以读写模式挂载。
    • 典型使用场景: 数据库、日志管理等需要读写操作且通常只会运行在单个节点上的应用。
    • 限制: 一旦一个节点已经使用此模式挂载卷,其他节点无法再以读写方式挂载。
  2. ReadOnlyMany (ROX) :

    • 描述: 卷可以被多个节点以只读模式挂载。
    • 典型使用场景: 静态内容服务器、共享配置或数据分发等无需写入操作的场景。
    • 优势: 允许在多个节点上同时读取,适用于水平扩展的读取密集型服务。
  3. ReadWriteMany (RWX) :

    • 描述: 卷可以被多个节点以读写模式挂载。
    • 典型使用场景: 需要多个实例共同读写共享数据的应用,如并行处理框架。
    • 限制: 并非所有存储系统都支持此模式,需要了解底层存储的具体支持情况。
      在这里插入图片描述
      回收策略
      在 Kubernetes 中,持久卷(PV)的回收策略(Reclaim Policy)是在 PV 的定义中指定的。这个策略决定了当一个绑定的 PVC 被删除后,PV 的处理方式。有以下几种回收策略:
  4. Retain

    • 这种策略意味着即使 PVC 被删除,PV 仍然会保留,转变为 Released 状态。
    • 数据仍留在 PV 中,未被清除。
    • 需要管理员手动处理 PV 才能重新使用,比如清除数据或重新绑定,适用于数据需要审查或备份的场景。
  5. Delete

    • 当与之绑定的 PVC 被删除时,PV 及其后端存储资产也会被自动删除。
    • 适用于不需要保留数据的场景,比如临时数据存储。
    • 常见于动态供应的存储系统中。
  6. Recycle(已弃用):

    • 该策略会简单地擦除 PV 上的数据,并将 PV 标记为 Available,供再次使用。
    • 在 Kubernetes 版本 1.15 已被弃用,建议使用其他更现代的存储策略。

如何设置回收策略

回收策略在 PersistentVolume(PV)的配置文件中进行定义。以下是一个定义 PV 及其回收策略的示例:

apiVersion: v1  
kind: PersistentVolume  
metadata:  
  name: example-pv  
spec:  
  capacity:  
    storage: 10Gi  
  accessModes:  
    - ReadWriteOnce  
  persistentVolumeReclaimPolicy: Retain  
  nfs:  
    path: /path/to/nfs  
    server: nfs-server.example.com  

在配置文件中的设置位置

  • persistentVolumeReclaimPolicy 字段:这是在 PV 规格(spec)下定义的,它指定了 PV 的回收策略。可选的值为 RetainDelete
  • 默认策略:如果未指定,Kubernetes 将使用默认的 Retain 策略。这意味着数据会保留,除非明确设置为 Delete

通过合理配置回收策略,可以有效管理存储资源,确保在应用需要时存储行为符合期望的数据处理和安全策略。

(3)创建pvc

apiVersion: v1
kind: PersistentVolumeClaim  
metadata:  
  name: my-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Gi

在这里插入图片描述
这边有一个问题,并没有指定pvc去找哪个pv,而且我设置的pv的限制也不相同,他们是如何寻找并绑定的呢?
PVC 和 PV 的自动匹配和绑定

  1. 自动匹配和绑定

    • Kubernetes 控制平面的控制循环持续监控新创建的 PVC。
    • 当新的 PVC 被创建时,控制器寻找能够满足其要求的可用 PV。
    • 如果找到匹配的 PV,系统会自动绑定 PVC 和 PV。
  2. 等待和绑定

    • 如果没有适合的 PV(例如缺少足够的存储大小或不匹配的访问模式),PVC 将保持未绑定状态。
    • 当一个匹配的 PV 后续被创建或释放时,此 PVC 将自动与之绑定。
    • 例如,若 PVC 请求 100 Gi 的存储而集群中只有多个 50 Gi 的 PV,则 PVC 会等待,直到有一个 100 Gi 的 PV 可用。
  3. 在 Pod 中使用 PVC

    • Pod 使用 PVC 申领的存储卷,Kubernetes 将根据 PVC 的绑定信息找到对应的 PV 并挂载到 Pod 上。
    • 如果 PV 支持多种访问模式,用户在 Pod 中使用 PVC 时需指定希望的访问模式。
  4. 持久绑定关系

    • 一旦 PVC 与 PV 绑定成功,PV 就专属于该 PVC,直到 PVC 被删除。
    • 用户通过在 Pod 规格中的 volumes 字段中引用 persistentVolumeClaim 节区来使用已申领的 PV。

(4)创建pod

apiVersion: v1  
kind: Pod  
metadata:  
  name: pod-pvc  
spec:  
  containers:  
  - name: nginx  
    image: harbor.hiuiu.com/nginx/nginx:1.21.5  
    imagePullPolicy: IfNotPresent  
    volumeMounts:  
    - name: nginx-html  
      mountPath: /usr/share/nginx/html  
  volumes:  
  - name: nginx-html  
    persistentVolumeClaim:  
      claimName: my-pvc

在这里插入图片描述
(5)验证效果
由于选的pv是/data/disk/v2,所以我们选择在v2下编写index.html文件。然后去访问相应的pod。
在这里插入图片描述
在这里插入图片描述

StorageClass

在 Kubernetes 中,StorageClass 是用于定义和管理持久卷(Persistent Volume, PV)动态供应的配置方法。通过 StorageClass,管理员可以抽象出底层存储实现的细节,并提供一种灵活的资源分配机制。以下是 StorageClass 的详细解释及其应用场景:

StorageClass 概述

  1. 定义:

    • StorageClass 是 Kubernetes 的一种资源对象,用来定义如何为 Persistent Volume Claim (PVC) 动态创建和配置 Persistent Volume (PV)。
    • 包含的信息通常包括存储类型、参数、供应策略等。
  2. 关键属性:

    • provisioner: 指定用于动态创建存储的插件或驱动程序。
    • parameters: 包含配置 provisioner 所需的参数,如存储类型、区位信息等。
    • reclaimPolicy: 定义当 PVC 删除后 PV 的回收策略(如 RetainDelete)。
    • volumeBindingMode: 指定卷绑定时间,可以是 Immediate(即时)或 WaitForFirstConsumer(等待第一个消费者)。
  3. 动态供应:

    • 使用 StorageClass 可以实现 PV 的动态供应,当 PVC 请求存储时,系统根据相关 StorageClass 创建符合需求的 PV。
    • 动态供应常用于云环境中,通过自动化的方式减少手动干预。

应用场景

  1. 多种存储类型管理:

    • 在同一集群中管理不同的存储类型,比如高性能 SSD 和低成本 HDD,为不同的工作负载提供更合适的存储解决方案。
  2. 按需分配资源:

    • 动态供应可根据应用需求自动分配存储资源,而不是预先分配所有存储,提高资源效率和利用率。
  3. 支持不同应用需求:

    • 不同的应用程序可能需要不同的存储特性(如速度、容量、备份机制等)。利用不同的 StorageClass 可以为每种需求提供个性化解决方案。
  4. 跨区域的可用性:

    • 对于分布式应用,通过 StorageClass 可以指定存储的区域或可用区,提升数据访问的延迟性能和冗余度。
  5. 简化运维:

    • 集群管理员可以通过 StorageClass 统一管理存储策略和配置,简化了复杂的存储管理任务。

实际应用

(1)创建一个SA账户
在 Kubernetes 中,“ServiceAccount”(服务账户,缩写为 SA)是一种用于管理应用在集群内运行时访问 API 服务器的身份标识。

apiVersion: v1  
kind: ServiceAccount  
metadata:  
  name: nfs-provisioner

在这里插入图片描述
(2)对sa授权

 kubectl create clusterrolebinding nfs-provisioner-clusterrolebinding --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner

(3)创建StorageClass

apiVersion: storage.k8s.io/v1  
kind: StorageClass  
metadata:  
  name: nfs  
provisioner: example.com/nfs

定义了资源的类型为 StorageClass。
NFS provisioner,用于该 StorageClass。provisioner 是存储提供者(插件或驱动)的标识符。通常你会用实际的 provisioner 名称,如 nfs-provisioner。
(4)构建一个provisioner,用于动态创建pv

apiVersion: apps/v1  
kind: Deployment  
metadata:  
  name: nfs-provisioner  
spec:  
  selector:  
    matchLabels:  
      app: nfs-provisioner  
  replicas: 1  
  strategy:  
    type: Recreate  
  template:  
    metadata:  
      labels:  
        app: nfs-provisioner  
    spec:  
      serviceAccount: nfs-provisioner  
      containers:  
        - name: nfs-provisioner  
          image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0  
          volumeMounts:  
            - name: nfs-client-root  
              mountPath: /persistentvolumes  
          env:  
            - name: PROVISIONER_NAME  
              value: example.com/nfs  
            - name: NFS_SERVER  
              value: 192.168.232.100  
            - name: NFS_PATH  
              value: /data/nfs
      volumes:  
        - name: nfs-client-root  
          nfs:  
            server: 192.168.232.100 
            path: /data/nfs

(5)准备nfs存储
(6)创建pvc

apiVersion: v1  
kind: PersistentVolumeClaim  
metadata:  
  name: test-claim1  
spec:  
  accessModes:  
    - ReadWriteMany  
  resources:  
    requests:  
      storage: 1Gi  
  storageClassName: nfs

(7)创建测试pod

apiVersion: v1  
kind: Pod  
metadata:  
  name: read-pod  
spec:  
  containers:  
    - name: read-pod  
      image: harbor.hiuiu.com/nginx/nginx:1.21.5  
      volumeMounts:  
        - name: nfs-pvc  
          mountPath: /usr/share/nginx/html  
  restartPolicy: Never  
  volumes:  
    - name: nfs-pvc  
      persistentVolumeClaim:  
        claimName: test-claim1

在这里插入图片描述
注意:需要给挂载文件夹的权限。否则文件夹挂载不上去。
(8)验证
进入容器去构建index.html
在这里插入图片描述

在这里插入图片描述
挂载路径下面也有。实验成功。

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

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

相关文章

实用攻略:亲身试用,高效数据恢复软件推荐!

今天要跟大家分享一下我使用几款数据恢复软件的经历。如果你曾经丢失过重要的文件&#xff0c;那除了注意备份外&#xff0c;也可以尝试一下这些非常棒的免费数据恢复软件&#xff01; 第一款&#xff1a;福昕数据恢复 链接&#xff1a;www.pdf365.cn/foxit-restore/ 首先聊…

Nginx+ModSecurity(3.0.x)安装教程及配置WAF规则文件

本文主要介绍ModSecurity v3.0.x在Nginx环境下的安装、WAF规则文件配置、以及防御效果的验证&#xff0c;因此对于Nginx仅进行简单化安装。 服务器操作系统&#xff1a;linux 位最小化安装 一、安装相关依赖工具 Bash yum install -y git wget epel-release yum install -y g…

大模型企业应用落地系列二》基于大模型的对话式推荐系统》核心技术架构设计图

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 大模型企业应用落地系列二基于大模型的对话式推荐系统》心技术架…

【精品】计算机毕业设计之:springboot游戏分享网站(源码+文档+辅导)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

win11,vscode上用docker环境跑项目

1.首先用dockerfile创建docker镜像 以下是dockerfile文件的内容&#xff1a; FROM pytorch/pytorch:1.11.0-cuda11.3-cudnn8-devel LABEL Service"SparseInstanceActivation"ENV TZEurope/Moscow ENV DETECTRON_TAGv0.6 ARG DEBIAN_FRONTENDnoninteractiveRUN apt-…

JavaScript:js;知识回顾;笔记分享

一&#xff0c;js前奏 1&#xff0c;js简介&#xff1a; Javascript是一种由Netscape(网景)的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言&#xff0c;主要目的是为了解决服务器端语言&#xff0c;比如Perl&#xff0c;遗留的速度问题&a…

数据结构与算法(1)

抽象数据类型定义 算法的效率 时间效率 一个算法的运行时间是指一个算法在计算机上运行所耗费的时间 大致可以等于计算机执行一种简单的操作(如赋值、比较、移动等) 所需的时间与算法中进行的简单操作次数乘积。 比较时间复杂度&#xff08;看数量级&#xff09; 空…

【STM32】RTC

忠实的时间记录者——RTC&#xff0c;板子断电也能继续记录&#xff08;当然&#xff0c;得有纽扣电池供电&#xff09;。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目录 1 概述 2 应用 3 RTC方案 4 …

javacv-ffmpeg ProcessBuilder批量旋转图片

javacv-ffmpeg ProcessBuilder实现对图片的旋转&#xff0c;最近需要处理很多图片&#xff0c;量有点多&#xff0c;所以不能一个一个去编辑旋转图片&#xff0c;所以写一个工具类&#xff0c;实现对图片的旋转 maven配置文件&#xff0c;加上对ffmpeg的依赖&#xff0c;由于f…

关于自定义控件,头文件找不到问题的解决办法

在ui文件中使用控件提升的时候&#xff0c;突然发现ui_xxxx.h竟然报错了&#xff0c; 这在之前是没有碰到过&#xff0c;苦思过后认为是环境变量的问题&#xff0c;因为现在正在用的构建套件是 mingw 的&#xff0c;但在此之前我一直用的是msvc&#xff0c;并且环境变量的配置…

骑行耳机该怎么选?精选南卡、骨聆、小米多款顶尖实用品牌!

骨传导耳机&#xff0c;作为运动骑行领域的黑科技伴侣&#xff0c;以其独特的传音方式&#xff0c;让众多骑行运动爱好者在享受音乐的同时&#xff0c;依然能清晰感知外界环境&#xff0c;提升运动安全与乐趣。然而&#xff0c;随着骨传导耳机热度增加&#xff0c;市面上开始出…

Prometheus监控Kubernetes ETCD

文章目录 一、kubeadm方式部署etcd1.修改etcd指标接口监听地址2.prometheus中添加etcd的服务发现配置3.创建etcd的service4.grafana添加etcd监控模版 二、二进制方式部署k8s etcd1.将etcd服务代理到k8s集群2.创建etcd证书的secrets3.prometheus挂载etcd证书的secrets4.promethe…

63. 不同路径 II -dp7

63. 不同路径 IIhttps://leetcode.cn/problems/unique-paths-ii/ 输入&#xff1a;obstacleGrid [[0,0,0],[0,1,0],[0,0,0]] 输出&#xff1a;2 解释&#xff1a;3x3 网格的正中间有一个障碍物。 从左上角到右下角一共有 2 条不同的路径&#xff1a; 1. 向右 -> 向右 ->…

Chrome 中的 RCE 会在 JIT 编译器中产生不正确的副作用

此类漏洞通常是“一键式”攻击的起点,当受害者访问恶意网站时,该漏洞会危害受害者的设备。Chrome 中的渲染器 RCE 允许攻击者危害 Chrome 渲染器进程并执行任意代码。但是,渲染器进程的权限有限,因此攻击者需要将此类漏洞与第二个“沙盒逃逸”漏洞串联起来:Chrome 浏览器进…

C#WinFrom 中实现可自定义按钮和事件的消息提示框

实现效果&#xff1a; public partial class CustomMessageBox : Form {// 声明按钮和标签控件private Button btnOption1;private Button btnOption2;private Label lblMessage;// 自定义属性用于获取对话框的结果public DialogResult DialogResult1 { get; private set; }// …

一文弄懂SQL事务隔离级别

SQL 事务隔离级别 在多用户数据库系统中&#xff0c;为了保证数据的完整性和一致性&#xff0c;SQL 标准提出了四种事务隔离级别&#xff0c;以规避脏读、不可重复读和幻读等问题。以下是四种隔离级别的简要介绍&#xff1a; 读未提交&#xff08;read uncommitted&#xff09…

产业报告 | 2024年中国低空经济产业研究报告

低空经济是指以各种有人驾驶和无人驾驶航空器的各类低空飞行活动为牵引&#xff0c;辐射带动航空器研发、生产、销售以及低空飞行活动相关的基础设施建设运营、飞行保障、衍生综合服务等领域产业融合发展的综合经济形态。 基于启信产业大脑的海量数据与专业研判模型&#xff0…

【Linux C++】log4cpp日志库的安装和使用详解

log4cpp 是一个开源的 C 日志库&#xff0c;灵感来源于 Java 的 log4j。它提供了灵活的日志记录功能&#xff0c;可以帮助开发者在 C 应用程序中记录、管理和格式化日志信息。log4cpp 支持多种日志记录策略和输出目标&#xff0c;可以满足各种不同的需求。 1.安装 下载压缩包…

2.2.2 Posix API与网络协议栈2

接上回2.2.2 posix api 2 传输数据 四线一⚪&#xff0c;kernel 协议栈 send- write&#xff0c; recv-read 如何知道send成功&#xff1f; 如果返回整数&#xff0c;只能证明data从user copy到内核kernel wmemory了 就是数据传输是异步的&#xff0c;send是从application cop…

二叉树的层序遍历 C++

给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例 2&#xff1a; 输入&…