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

K8S临时存储-本地存储-PV和PVC的使用-动态存储(StorageClass)

介绍

容器中的文件在磁盘上是临时存放的,当容器崩溃或停止时容器上面的数据未保存, 因此在容器生命周期内创建或修改的所有文件都将丢失。 在崩溃期间,kubelet 会以干净的状态重新启动容器。 当多个容器在一个 Pod 中运行并且需要共享文件时,会出现另一个问题,跨所有容器设置和访问共享文件系统具有一定的挑战性。K8S 卷(Volume) 这一抽象概念能够解决这两个问题。

存储卷的分类

hostPath 存储

警告:
HostPath 卷存在许多安全风险,最佳做法是尽可能避免使用 HostPath。 当必须使用 HostPath 卷时,它的范围应仅限于所需的文件或目录,并以只读方式挂载。HostPath 仅适用于单个节点上的存储,不支持跨节点访问(如果Pod偏移到其他宿主机节点上面可能会出问题)。

支持的 type 值如下:

type值说明
空字符串(默认)用于向后兼容,这意味着在安装 hostPath 卷之前不会执行任何检查
DirectoryOrCreate如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 kubelet相同的组和属主信息
Directory在给定路径上必须存在的目录
FileOrCreate如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 kubelet 相同的组和所有权
File在给定路径上必须存在的文件
Socket在给定路径上必须存在的 UNIX 套接字
CharDevice在给定路径上必须存在的字符设备
BlockDevice在给定路径上必须存在的块设备

hostPath 配置示例

如有多个节点,在使用 hostPath 存储需要指定pod部署在那个节点上面,例如在Pod上面添加nodeSelector字段指定到某一个节点(需要提前给节点打标签)

apiVersion: v1
kind: Pod
metadata:name: test-pd
spec:containers:
#  nodeSelector:      # 指定部署到特定节点上面
#    disktype: ssd     # 标签- image: nginxname: test-containervolumeMounts:- mountPath: /test-pdname: test-volumevolumes:- name: test-volumehostPath:path: /data          # 宿主机上目录位置,注意权限type: Directory      # 此字段为可选,详细解释在上面

emptyDir

定义了 emptyDir 卷的 Pod,在 Pod 被指派到某节点时此卷会被创建。emptyDir 卷最初是空的。Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会被永久删除。主要作用是为了共享数据用。

emptyDir 卷存储可以使用任何磁盘、SSD 或网络存储,这取决于你的环境。 你可以将 emptyDir.medium 字段设置为 “Memory”, 以告诉 Kubernetes 为你挂载 tmpfs(基于 RAM 的文件系统)。虽然 tmpfs 速度非常快,但是要注意它与磁盘不同, 并且你所写入的所有文件都会计入容器的内存消耗,受容器内存限制约束

说明:
容器崩溃并不会导致 Pod 被从节点上移除,因此容器崩溃期间 emptyDir 卷中的数据是安全的。

emptyDir 配置示例

apiVersion: v1
kind: Pod
metadata:name: test-pd
spec:containers:- image: nginxname: test-containervolumeMounts:- mountPath: /cachename: cache-volumevolumes:- name: cache-volumeemptyDir:sizeLimit: 500Mi  # 写入磁盘的大小限制,如果没限制直接删除这行 在emptyDir: []即可

nfs

nfs 卷能将 NFS (网络文件系统) 挂载到你的 Pod 中。 不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载。 这意味着 nfs 卷可以被预先填充数据,并且这些数据可以在 Pod 之间共享。

配置示例

说明:
在使用 NFS 卷之前,你必须部署自己的 NFS 服务器才可以使用,这里不再叙述。

apiVersion: v1
kind: Pod
metadata:name: test-pd
spec:containers:- image: registry.k8s.io/test-webservername: test-containervolumeMounts:- mountPath: /my-nfs-dataname: test-volumevolumes:- name: test-volumenfs:server: my-nfs-server.example.com   # nfs服务的地址path: /my-nfs-volume                # nfs 服务共享的路径readOnly: true                    

PV和PVC的使用

在 Kubernetes 中,PV(PersistentVolume)和 PVC(PersistentVolumeClaim)是用于持久化存储的核心概念,其本身并没有存储的相关功能所以需要准备后端存储的环境。

  • PersistentVolume(PV):PV 是集群中的一块持久化存储,它是集群管理员预先配置好的存储资源。PV 可以是网络存储(如 NFS、GlusterFS、Ceph)、云存储(如 AWS EBS、Azure Disk)、本地存储(HostPath)等。PV 与存储后端进行绑定,表示集群中的可用存储资源,支持的后端存储类型详情请查看K8S官方文档

  • PersistentVolumeClaim(PVC):PVC 是 Pod 对 PV 的申请。PVC 定义了对存储资源的需求,包括存储容量、访问模式和其他属性。Pod 中的容器可以通过 PVC 来申请并使用 PV 提供的持久化存储。Kubernetes 会根据 PVC 的需求匹配可用的 PV,并将其动态绑定到 Pod 中。

PV(PersistentVolume)

下面是 hostPath PersistentVolume 的配置文件:

apiVersion: v1
kind: PersistentVolume
metadata:labels:type: localname: task-pv-volume
spec:accessModes:- ReadWriteOncecapacity:storage: 10GihostPath:path: /mnttype: ""persistentVolumeReclaimPolicy: RecyclestorageClassName: manualvolumeMode: Filesystem

关键词解释

  • spec: capacity: storage: 10Gi:定义了 PV 的存储容量为 10Gi。
  • volumeMode: Filesystem:指定了 PV 的卷模式为文件系统。
  • accessModes: - ReadWriteOnce:指定了 PV 的访问模式为 ReadWriteOnce,表示此 PV 只能被单个节点挂载为读写模式。
  • persistentVolumeReclaimPolicy: Recycle:指定了 PV 回收策略为 Recycle,表示当 PV 被释放时,其存储资源将被重新使用。
  • storageClassName: manual:指定了 PV 的存储类名称为 slow。
  • hostPath.path:指定了 PV 的路径。在这里,path 指定了 PV 使用的主机路径,即 “/mnt/data”。
  • hostPath.type:指定 PV 所使用的主机路径的类型,不指定默认是:DirectoryOrCreate 还有 Directory 和 File 类型可选

pv存储卷的回收策略

  • 回收(Reclaiming) :当用户不再使用其存储卷时,他们可以从 API 中将 PVC 对象删除, 从而允许该资源被回收再利用。
  • 保留(Retain):回收策略 Retain 使得用户可以手动回收资源。
  • 删除(Delete):对于支持 Delete 回收策略的卷插件,删除动作会将 PersistentVolume 对象从 Kubernetes 中移除,同时也会从外部基础设施中移除所关联的存储资产。 动态制备的卷会继承其 StorageClass 中设置的回收策略, 该策略默认为 Delete。
  • 回收(Recycle):如果下层的卷插件支持,回收策略 Recycle 会在卷上执行一些基本的擦除 (rm -rf /thevolume/*)操作,之后允许该卷用于新的 PVC 申领。(注意:回收策略 Recycle 已被废弃。取而代之的建议方案是使用动态制备。

卷模式

Kubernetes 支持两种卷模式(volumeModes):

  • Filesystem(文件系统):文件系统模式,表示 PV 中存储的数据是文件系统数据,可以像普通文件系统一样被挂载到 Pod 中,并且可以在容器中被读取和写入。默认的卷模式是 Filesystem。
  • Block():块模式,表示 PV 中存储的数据是块设备数据,可以将 PV 挂载为块设备卷(例如 /dev/sdX),并且可以被容器用作块设备。

访问模式

  • ReadWriteOnce:卷可以被一个节点以读写方式挂载。 ReadWriteOnce 访问模式仍然可以在同一节点上运行的多个 Pod 访问该卷。
  • ReadOnlyMany:卷可以被多个节点以只读方式挂载。
  • ReadWriteMany:卷可以被多个节点以读写方式挂载。
  • ReadWriteOncePod:(目前K8S版本在1.22及以上的才支持到1.29才GA)卷可以被单个 Pod 以读写方式挂载。 如果你想确保整个集群中只有一个 Pod 可以读取或写入该 PVC, 请使用 ReadWriteOncePod 访问模式。

创建PV

kubectl create -f pv0003.yaml

创建好以后查看

kubectl get pv
NAME             CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
pv0003           5Gi        RWO           Recycle         Available              manual                  4s

PV状态说明:

  • NAME:PVC名字
  • CAPACITY:PV大小
  • ACCESSMODES:访问模式
  • RECLAIMPOLICY:回收策略
  • STATUS:PV使用状态
  • STORAGECLASS: 动态存储名字
  • AGE:创建时间

在命令行接口(CLI)中,访问模式也使用以下缩写形式:

  • RWO - ReadWriteOnce
  • ROX - ReadOnlyMany
  • RWX - ReadWriteMany
  • RWOP - ReadWriteOncePod

PV每个阶段的状态

每个持久卷会处于以下阶段(Phase)之一:

  • Available:卷是一个空闲资源,尚未绑定到任何申领
  • Bound:该卷已经绑定到某申领
  • Released:所绑定的申领已被删除,但是关联存储资源尚未被集群回收
  • Failed:卷的自动回收操作失败

使用 kubectl describe persistentvolume 查看已绑定到 PV 的 PVC 的名称。

PVC(PersistentVolumeClaims)

创建一个PVC:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: myclaim
spec:accessModes:- ReadWriteOncevolumeMode: Filesystemresources:requests:storage: 5Gi

这里面的字段意思基本和PV里面的一样,访问模式和卷模式也是一样的,就不再解释了。

PV和PVC的绑定模式

匹配步骤:

  • 检查 PV 的状态:Kubernetes 控制器会查找状态为 Available(可用)的 PV,这些 PV 尚未被其他 PVC 绑定。
  • PV 属性的匹配:控制器会检查 PVC 的需求与 PV 的属性是否匹配。这包括容量、访问模式、持久性和标签等。
  • 针对 PVC 的需求选择 PV:控制器会选择满足 PVC 所有需求的 PV,并尝试将其与 PVC 绑定。

自动绑定

创建PV和PVC

apiVersion: v1
kind: PersistentVolume
metadata:name: task1labels:type: local1
spec:capacity:storage: 10GiaccessModes:- ReadWriteOncehostPath:path: "/mnt"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: task-pv-claim
spec:accessModes:- ReadWriteOnceresources:requests:storage: 9Gi

查看PV和PVC状态

[root@master01 pv]# kubectl get pvc,pv
NAME                                  STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/task-pv-claim   Bound    task1    10Gi       RWO                           26sNAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                   STORAGECLASS   REASON   AGE
persistentvolume/task1   10Gi       RWO            Retain           Bound       default/task-pv-claim                           10m

都是已经绑状态

根据标签绑定

创建PV和PVC

apiVersion: v1
kind: PersistentVolume
metadata:name: my-pvlabels:desk: "test1"       # 设置标签
spec:capacity:storage: 10GiaccessModes:- ReadWriteOncehostPath:path: /mnt
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1Giselector:matchLabels:desk: "test1"     # 匹配PV的标签

查看PV和PVC状态
可以看到 my-pvc 已经绑定到 my-pv 上面了,如果没有标签自动绑定的话 则会绑定到 task2 的PV上面

[root@master01 pv]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM            STORAGECLASS   REASON   AGE
my-pv   10Gi       RWO            Retain           Bound       default/my-pvc                           3s
task1   10Gi       RWO            Retain           Available                                            46s
task2   5Gi        RWO            Retain           Available                                            46s
[root@master01 pv]# kubectl get pvc
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
my-pvc   Bound    my-pv    10Gi       RWO                           12s

指定PV名字绑定

apiVersion: v1
kind: PersistentVolume
metadata:name: my-pv
spec:capacity:storage: 20GiaccessModes:- ReadWriteOncehostPath:path: /mnt/data
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc
spec:accessModes:- ReadWriteOncevolumeName: my-pv   # 指定要绑定的 PV 的名称resources:requests:storage: 5Gi

查看PV和PVC绑定情况

[root@master01 pv]# kubectl get pv,pvc
NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM            STORAGECLASS   REASON   AGE
persistentvolume/my-pv   20Gi       RWO            Retain           Bound       default/my-pvc                           5s
persistentvolume/task1   10Gi       RWO            Retain           Available                                            158m
persistentvolume/task2   5Gi        RWO            Retain           Available                                            158mNAME                           STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/my-pvc   Pending   my-pv    0                                        5s

注意事项

PV 和 PVC 之间的绑定是一对一的关系。一个 PVC 只能绑定到一个 PV 上,而一个 PV 可以同时被多个 PVC 绑定。如果没有足够的 PV 来满足 PVC 的需求,或者没有满足 PVC 的要求的可用 PV,则 PVC 将处于 Pending(挂起)状态,直到满足条件为止。

Pod使用PVC存储

创建PV和PVC:

apiVersion: v1
kind: PersistentVolume
metadata:name: task-pv-volumelabels:type: local
spec:capacity:storage: 10GiaccessModes:- ReadWriteOncehostPath:path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: task-pv-claim
spec:accessModes:- ReadWriteOnceresources:requests:storage: 3Gi

创建一个Pod使用上面这个PVC

apiVersion: v1
kind: Pod
metadata:name: task-pv-pod
spec:containers:- name: task-pv-containerimage: nginxports:- containerPort: 80name: "http-server"volumeMounts:- mountPath: "/usr/share/nginx/html"name: task-pv-storagevolumes:- name: task-pv-storagepersistentVolumeClaim:          # 指定使用PVC存储claimName: task-pv-claim      # PVC存储的名字

在Pod里面多次挂在PVC

apiVersion: v1
kind: Pod
metadata:name: test
spec:containers:- name: testimage: nginxvolumeMounts:# 网站数据挂载- name: configmountPath: /usr/share/nginx/htmlsubPath: html# Nginx 配置挂载- name: configmountPath: /etc/nginx/nginx.confsubPath: nginx.confvolumes:- name: configpersistentVolumeClaim:claimName: test-nfs-claim

PVC绑定常见问题

创建PVC后,一直绑定不上PV(Pending):

  • PVC的空间申请大小大于PV的大小
  • PVC的StorageClassName没有和PV的一致
  • PVC的accessModes和PV的不一致

Pod挂在PVC后,一直处于Pending状态:

  • PVC没有被创建成功,或者被创建
  • PVC和Pod不在同一个Namespace(PV是没有命名空间的,PVC是有有命名空间概念的)

删除PVC后k8s会创建一个用于回收的Pod,根据PV的回收策略进行pv的回收,回收完以后PV的状态就会变成可被绑定的状态也就是空闲状态,其他的Pending状态的PVC如果匹配到了这个PV,他就能和这个PV进行绑定。

动态存储(StorageClass)

主要功能:

  • 动态配置持久存储:StorageClass 允许管理员定义多种类型的存储,包括云存储、本地存储、网络存储等,并且可以根据用户的请求动态创建 PersistentVolume(PV)。
  • 自动绑定:一旦 PVC 请求了特定的存储类,Kubernetes 将根据 StorageClass 的定义自动创建 PV,并将其绑定到 PVC 上,简化了存储资源的管理过程。
  • 多种属性支持:StorageClass 允许管理员定义存储的各种属性,如容量、访问模式、持久性、副本数等,以满足不同应用程序的需求。
  • 灵活性和可扩展性:管理员可以根据实际需求定义多个不同的 StorageClass,并根据应用程序的需求选择合适的存储类。

环境准备

在开始之前请安装后端存储,我这里使用的是CEPH存储并且安装到K8S集群里,下面是安装方法。(所有环境中如果有用到的安装包或者容器镜像什么的都可以私信我)
安装方法:点击跳转

查看已经部署好的StorageClass

注意: 本次演示默认已经安装好ceph存储。

## sc 是 StorageClass 简写[root@master01 ~]# kubectl get sc
NAME            PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
rook-ceph-rbd   rook-ceph.rbd.csi.ceph.com      Retain          Immediate           true                   228d
rook-cephfs     rook-ceph.cephfs.csi.ceph.com   Retain          Immediate           true                   228d
  • rook-ceph-rbd :这个是块存储。区别:只能由一个节点进行读写操作
  • rook-cephfs:这个是共享文件存储。区别:可以在多个节点上同时挂载和访问。

适用场景:

  • RBD:适用于需要高性能、低延迟和可扩展性的场景,如数据库、块存储卷等。
  • CephFS:适用于需要共享数据、访问文件系统的场景,如共享存储、容器卷等。

查看 rook-ceph-rbd

查看命令

kubectl get sc rook-ceph-rbd -oyaml
allowVolumeExpansion: true
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: rook-ceph-rbd
parameters:clusterID: rook-cephcsi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisionercsi.storage.k8s.io/controller-expand-secret-namespace: rook-cephcsi.storage.k8s.io/fstype: ext4csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-nodecsi.storage.k8s.io/node-stage-secret-namespace: rook-cephcsi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisionercsi.storage.k8s.io/provisioner-secret-namespace: rook-cephimageFeatures: layeringimageFormat: "2"pool: replicapool
provisioner: rook-ceph.rbd.csi.ceph.com
reclaimPolicy: Retain
volumeBindingMode: Immediate

关键字段解释

  • kind:表示这是 Kubernetes 存储 API 的版本,而 kind 设置为 StorageClass,表示这是一个 StorageClass 对象。
  • allowVolumeExpansion: true :这个字段用于指示是否允许对使用这个 StorageClass 创建的持久卷进行扩展。
  • metadata:这个部分包含有关 StorageClass 的元数据,其中最重要的是 name 字段,它指定了 StorageClass 的名称,这里是 “rook-ceph-rbd”。
  • parameters:这个字段定义了传递给 StorageClass 的参数。在这个例子中,这些参数包括:
    • clusterID:Rook Ceph 集群的 ID。
    • csi.storage.k8s.io/controller-expand-secret-name : 的名称和命名空间。
    • csi.storage.k8s.io/controller-expand-secret-namespace:指定扩展控制器所需的密钥.
    • csi.storage.k8s.io/fstype:指定了文件系统类型。
    • csi.storage.k8s.io/node-stage-secret-name 和 csi.storage.k8s.io/node-stage-secret-namespace:这些参数用于指定节点阶段操作所需的密钥的名称和命名空间。
      csi.storage.k8s.io/provisioner-secret-name 和 csi.storage.k8s.io/provisioner-secret-namespace:这些参数用于指定提供程序所需的密钥的名称和命名空间。
  • imageFeatures:这个参数指定了卷的特性,即它包含了支持镜像层叠(layering)的功能。镜像层叠允许在卷上创建多个镜像,每个镜像可以包含自己的修改,而不会影响其他镜像。
  • imageFormat:这个参数指定了卷的格式,即它使用的是格式版本 2。格式版本 2 是 RBD 卷的一种格式,它支持更高级的功能和性能,例如支持更大的卷和更好的快照管理。
  • pool:指定了用于存储的池名称。
  • provisioner:这个字段指定了用于创建持久卷的存储提供程序。在这里,使用的提供程序是 rook-ceph.rbd.csi.ceph.com,表明这个 StorageClass 使用了 Rook Ceph 的 RBD(Rados Block Device)CSI(Container Storage Interface)提供程序。
  • reclaimPolicy:这个字段指定了持久卷的回收策略。在这里,设置为 Retain,表示当与此 StorageClass 关联的持久卷不再需要时,它们的资源应该保留而不被自动删除。
  • volumeBindingMode:这个字段指定了持久卷的绑定模式。在这里,设置为 Immediate,表示持久卷应该立即绑定到声明,即创建声明时应立即创建卷。

StorageClass 使用方法

创建 StatefulSet 使用

部署成功以后 StorageClass 会根据PVC申请的去自动创建PV并绑定好

apiVersion: apps/v1
kind: StatefulSet
metadata:name: my-statefulset
spec:serviceName: "my-statefulset"replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginx:latestports:- containerPort: 80volumeMounts:- name: my-persistent-storagemountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: my-persistent-storagespec:accessModes: [ "ReadWriteOnce" ]storageClassName: "rook-ceph-rbd" # 指定刚刚查出来的 StorageClass 名字 resources:requests:storage: 5Gi

使用PVC申请动态存储

创建PVC成功以后会自动创建PV并绑定好,后面Pod使用方式和上面手动创建PV和PVC的方式一样。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc
spec:accessModes:- ReadWriteOncestorageClassName: rook-ceph-rbd    # 指定要使用的 StorageClass 的名称resources:requests:storage: 1Gi                   # 请求 1GB 的存储容量

PVC扩容

直接修改 “storage: 1Gi ” 修改为2G即可,但是生效还需要等几分钟。

kubectl edit pvc my-pvc

相关文章:

K8S临时存储-本地存储-PV和PVC的使用-动态存储(StorageClass)

介绍 容器中的文件在磁盘上是临时存放的,当容器崩溃或停止时容器上面的数据未保存, 因此在容器生命周期内创建或修改的所有文件都将丢失。 在崩溃期间,kubelet 会以干净的状态重新启动容器。 当多个容器在一个 Pod 中运行并且需要共享文件时…...

jeecg-boot安装

我看大家都挺关注,所以集中上传了下代码和相关工具,方便大家快速完成 链接:https://pan.baidu.com/s/1-Y9yHVZ-4DQFDjPBWUk4-A 提取码:op1r 1. 下载代码 下载地址 : JEECG官方网站 - 基于BPM的低代码开发平台(低代码平台_零代…...

Unity面经(自整)——移动开发与Shader

Unity与Android混合开发 为什么使用Flutter构建 Flutter 是 Google 的开源工具包,用于从单个代码库为移动、Web、桌面和嵌入式设备构建应用程序(一套代码跨平台构建app是它最大的优点),并且可以构建高性能、稳定和丰富UI的应用程…...

Nginx实现反向代理、负载均衡、动静分离

1. 什么是Nginx的反向代理? Nginx的反向代理是指Nginx作为服务器的前端,接收客户端的请求,然后将请求转发给后端的真实服务器,并将真实服务器的响应返回给客户端。这种代理方式使得客户端并不知道真实服务器的存在,它…...

【Linux】网络基础(一)

文章目录 一、计算机网络背景1. 网络发展2. 认识“协议” 二、网络协议初识1. 协议分层2. OSI七层模型3. TCP/IP五层(或四层)模型 三、网络传输基本流程1. 同局域网的两台主机通信数据包封装和分用封装分用 2. 跨网络的两台主机通信 四、网络中的地址管理…...

前端小白学习Vue框架(二)

一.属性计算、属性监听、属性过滤 1.认识MVVM V (用户视图界面)通过VM (应用程序) 向Model(数据模型) 取值与赋值的过程! 数据双向绑定 视图改变更新数据,数据改变更新视图 2.属性计算 //在vue实例中通过computed去计算new …...

飞书api增加权限

1,进入飞书开发者后台:飞书开放平台 给应用增加权限 2,进入飞书管理后台 https://fw5slkpbyb3.feishu.cn/admin/appCenter/audit 审核最新发布的版本 如果还是不行,则需要修改数据权限,修改为全部成员可修改。 改完…...

CSS3 平面 2D 变换+CSS3 过渡

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 ✍一、CSS3 平面 2D 变换💎1 坐标轴💎2 transform 语法…...

【Jenkins】Jenkins自动化工具介绍

目录 技术背景常规的手动打包步骤 Jenkins简介起源与发展Jenkins的核心价值1.自动化1.1代码构建1.2测试自动化1.3自动部署 2.持续集成与持续部署CI/CD的概念如何减少集成问题更快速地发布软件版本 Jenkins优势Jenkins的主要竞争对手Travis CI:CircleCI:GitLab CI: Jenkins与其他…...

课时93:流程控制_函数进阶_综合练习

1.1.3 综合练习 学习目标 这一节,我们从 案例解读、脚本实践、小结 三个方面来学习。 案例解读 案例需求 使用shell脚本绘制一个杨辉三角案例解读 1、每行数字左右对称,从1开始变大,然后变小为1。    2、第n行的数字个数为n个&#xf…...

oracle创建整个数据库的只读账户

在源用户readonly 下创建只读用户 reader readonly 的表空间为AA 一、创建只读用户 create user reader identified by 密码 default tablespace AA; 二、授权 grant connect to reader ; 三、获取原账号readonly 的查询权限 select grant select on ||owner||.||object…...

文件名乱码危机:数据恢复全攻略

在数字化时代的浪潮中,电脑文件成为我们日常生活和工作中不可或缺的一部分。然而,有时我们会突然遭遇一个令人头疼的问题:原本清晰易读的文件名突然变成了乱码。这些乱码文件名不仅让我们无法准确识别文件内容,更可能意味着数据丢…...

Unity Standalone File Browser,Unity打开文件选择器

Unity Standalone File Browser,Unity打开文件选择器 下载地址:GitHub链接: https://github.com/gkngkc/UnityStandaloneFileBrowser简单的示例代码 using SFB; using System; using System.IO; using UnityEngine; using UnityEngine.UI;…...

面向对象的架构三段式写一篇论文

在面向对象的软件架构中,系统设计通常遵循一种“三段式”方法论,以确保软件的可扩展性、可维护性和灵活性。这种方法论包括三个核心阶段:概念化、详细设计和实现。通过这三个阶段的逐步深入,开发团队可以有效地应对复杂系统的挑战…...

npm ERR! code CERT_HAS_EXPIREDnpm ERR! errno CERT_HAS_EXPIRED

解决npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to 分析过后这个问题是证书过期的意思 考虑到其他的原因 这里给出三个解决方案 一: 清除npm缓存 npm cache clean --force 取消ssl验证: npm config set strict-…...

pytorch-多分类实战之手写数字识别

目录 1. 网络设计2. 代码实现2.1 网络代码2.2 train 3. 完整代码 1. 网络设计 输入是手写数字图片28x28,输出是10个分类0~9,有两个隐藏层,如下图所示: 2. 代码实现 2.1 网络代码 第一层将784降维到200,第二次使用…...

httpsok-快速申请谷歌SSL免费证书

🔥httpsok-快速申请谷歌SSL免费证书 使用场景: 部署CDN证书、OSS云存储证书证书类型: 单域名 多域名 通配符域名 混合域名证书厂商: ZeroSSL Lets Encrypt Google证书加密类型: ECC、 RSA 一、证书管理 进入 证书管…...

LiveGBS流媒体平台GB/T28181功能-国标级联中如何自定义通道国标编号编辑通道编号保持唯一性

LiveGBS国标级联中如何自定义通道国标编号编辑通道编号保持唯一性 1、国标级联选择通道修改2、通道编辑修改3、分屏展示设备树修改3.1、编辑名称中修改 4、分屏展示分组修改4.1、编辑名称中修改4.2、选择通道中修改 5、搭建GB28181视频直播平台 1、国标级联选择通道修改 国标级…...

mysql 大表凌晨定时删除数据

有几张表数据量非常大,一次维护量有点大(一个月有500多万条数据,并且还在往上涨), 于是想了个定时删除数据,每天凌晨执行,这样每天删除数据量就小, 循环删除,每次删除5…...

ArcGIS和ArcGIS Pro快速加载ArcGIS历史影像World Imagery Wayback

ArcGIS在线历史影像网站 World Imagery Wayback(网址:https://livingatlas.arcgis.com/wayback/)提供了数期历史影像在线浏览服务,之前不少自媒体作者在文中宣称其能代表Google Earth历史影像。 1、一点对比 (1)同一级别下的版本覆盖面 以下述区域为例,自2014年2月20…...

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...