当前位置: 首页 > 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…...

数据仓库的—数据仓库的体系架构

数据仓库通常采用分层的体系架构设计,作为支撑企业决策分析需求的数据基础设施。典型的数据仓库体系架构由以下三个核心层次组成: 源数据层(Source Layer) 这是数据仓库的数据来源,包括组织内部的各种运营系统,如ERP、CRM、SCM等,以及外部数据源如互联网、社交媒体等。这些系…...

【C/C++基础知识】const 关键字

文章目录 Q&A and 前言const 修饰基本变量初始化const 对象仅在文件内有效 const 的引用应用 指针与 constconst 修饰类成员函数参考写在最后 Q&A and 前言 Q:简要说一说 C 中的 const 关键字,含义以及常见的使用位置 A:const 是 C…...

Docker之数据卷和Dockerfile

Docker之数据卷与Dockerfile的详细使用介绍如下: 一、Docker数据卷 数据卷(volume)是Docker中的一个重要概念,它允许你在容器和宿主机或容器之间共享文件系统。数据卷提供了持久性存储,即使在容器被删除后&#xff0…...

pull拉取最新代码

工作区、暂存区、版本库 工作区:就是你在电脑里能看到的目录。 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。 …...

工控 modbusTCP 报文

Tx 发送报文:00 C9 00 00 00 06 01 03 00 00 00 02 Rx 接收报文:00 C9 00 00 00 07 01 03 04 01 4D 00 01 Tx 发送报文:00 C9 00 00 00 06 01 03 00 00 00 02 00 C9 事务处理标识符 2字节 00 00 协议标识符 2字节 固定 00 00 00 06 长度 2字节 表示之后的字节总数 (…...

在Ubuntu服务器上快速安装一个redis并提供远程服务

一、快速安装一个Redis 第一步:更新apt源 sudo apt update第二步:下载Redis sudo apt install redis第三步:查看Redis是否已自启动 systemctl status redis二、配置Redis提供远程服务 第一步:先确保6379端口正常开放 如果是…...

玩机进阶教程------手机定制机 定制系统 解除系统安装软件限制的一些步骤解析

定制机 在于各工作室与商家合作定制rom中有一些定制机。限制用户私自安装第三方软件。或者限制解锁 。无法如正常机登陆账号等等。定制机一般用于固定行业或者一些部门。专机专用。例如很多巴枪扫描机型等等。或者一些小牌机型。对于没有官方包的机型首先要导出各个分区来制作…...

Bilstm双向长短期神经网络多输入单输出回归分析

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 BILSTM神经网络 Bilstm双向长短期神经网络多输入单输出回归分析 完整代码: Bilstm双向长短期神经网络多输入单输出回归分析.zip资源-CSDN文库 https://download.csdn.net/download/abc991835105/89087121 效果图 结果分析 展望 …...

ELK+Filebeat日志分析系统

一、ELK基本介绍: 1.ELK 简介: ELK平台是一套完整的日志集中处理解决方案(日志系统)。 将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。 ELK --> ELFK --> ELFKMQ2.ELK组件介绍…...

flex吃干抹净

Flex 布局是什么? Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。 .box{display: flex;//行内元素也可以使用flex布局//display: inline-flex; }display: flex; 使元素呈现为块级元素,…...

什么网站可做浏览器首页/网站开发培训

11月17日,阿里巴巴集团发布2023财年二季度财报。于2022年9月30日止季度,抵销跨分部交易前,菜鸟本季度营业收入同比增长26%至182.82亿元,外部收入占比进一步提升至73%。通过持续建设高质量的产业互联网,做全球化的长期主…...

wordpress的集成环境/网站推广的方式有哪些

转载于:https://www.cnblogs.com/jkwang/p/5841234.html...

哪些网站可以找到做海报的素材/百度导航最新版本免费下载

写在前面 是这样的,我们现在接口使用了Ocelot做网关,Ocelot里面集成了基于IdentityServer4开发的授权中心用于对Api资源的保护。问题来了,我们的Api用了SwaggerUI做接口的自文档,那就蛋疼了,你接入了IdentityServer4的…...

做网站视频存储在哪里/快手作品推广网站

前言:本文主要以代码用例说用jmeter-plugins-for-apache-dubbo插件测试dubbo接口时,复杂参数如何处理。 复杂参数使用案例参考FAQ(官方 https://github.com/dubbo/jmeter-plugins-for-apache-dubbo/wiki/FAQ 1、在jmeter前置处理器中填写以下脚本 impo…...

主题资源网站建设反思/互联网seo是什么

加入 PolkaWorld 社区,共建 Web 3.0!波卡提供了代理模块,你可以通过它来设置代理账户,从而增加一层安全性。本文是波卡百科(Polkadot Wiki)的一部分。Polkadot Wiki 是由波卡官方撰写的波卡介绍文档,PolkaWorld 正在逐…...

徐州网站建设xlec/外贸网站建站平台

http://blog.csdn.net/housisong/article/details/6318890...