k8s 中存储之 PV 持久卷 与 PVC 持久卷申请

目录

1 PV 与 PVC 介绍

1.1 PersistentVolume(持久卷,简称PV)

1.2 PersistentVolumeClaim(持久卷声明,简称PVC)

1.3 使用了PV和PVC之后,工作可以得到进一步的细分:

2 持久卷实验配置介绍

2.1 PV 的配置介绍

2.2 PVC 的配置介绍

3 持久卷实验

3.1 创建 PV

3.2 查看 PV 资源是否被创建成功

3.3 创建 PVC 与 PV 进行绑定

3.4 创建一个pod进行测试

3.5 接下来的 pv2 与 pv3 也是相同的操作

3.6 PV 2 

3.7 PV 3


1 PV 与 PVC 介绍

前面已经学习了使用NFS提供存储,此时就要求用户会搭建NFS系统,并且会在yaml配置nfs。由于kubernetes支持的存储系统有很多,要求客户全都掌握,显然不现实。为了能够屏蔽底层存储实现的细节,方便用户使用, kubernetes引入PV和PVC两种资源对象。

PV(Persistent Volume)是持久化卷的意思,是对底层的共享存储的一种抽象。一般情况下PV由kubernetes管理员进行创建和配置,它与底层具体的共享存储技术有关,并通过插件完成与共享存储的对接。

PVC(Persistent Volume Claim)是持久卷声明的意思,是用户对于存储需求的一种声明。换句话说,PVC其实就是用户向kubernetes系统发出的一种资源需求申请。

1.1 PersistentVolume(持久卷,简称PV)

  • pv是集群内由管理员提供的网络存储的一部分。

  • PV也是集群中的一种资源。是一种volume插件,

  • 但是它的生命周期却是和使用它的Pod相互独立的。

  • PV这个API对象,捕获了诸如NFS、ISCSI、或其他云存储系统的实现细节

  • pv有两种提供方式:静态和动态

    • 静态PV:集群管理员创建多个PV,它们携带着真实存储的详细信息,它们存在于Kubernetes API中,并可用于存储使用

    • 动态PV:当管理员创建的静态PV都不匹配用户的PVC时,集群可能会尝试专门地供给volume给PVC。这种供给基于StorageClass

1.2 PersistentVolumeClaim(持久卷声明,简称PVC)

  • 是用户的一种存储请求

  • 它和Pod类似,Pod消耗Node资源,而PVC消耗PV资源

  • Pod能够请求特定的资源(如CPU和内存)。PVC能够请求指定的大小和访问的模式持久卷配置

  • PVC与PV的绑定是一对一的映射。没找到匹配的PV,那么PVC会无限期得处于unbound未绑定状态

1.3 使用了PV和PVC之后,工作可以得到进一步的细分:

  • 存储:存储工程师维护

  • PV: kubernetes管理员维护

  • PVC:kubernetes用户维护

2 持久卷实验配置介绍

2.1 PV 的配置介绍

PV是存储资源的抽象,下面是资源清单文件的解释:

apiVersion: v1  
kind: PersistentVolume
metadata:name: pv2
spec:nfs: # 存储类型,与底层真正存储对应capacity:  # 存储能力,目前只支持存储空间的设置storage: 2GiaccessModes:  # 访问模式storageClassName: # 存储类别persistentVolumeReclaimPolicy: # 回收策略

PV 的关键配置参数说明:

  • 存储类型

    底层实际存储的类型,kubernetes支持多种存储类型,每种存储类型的配置都有所差异

  • 存储能力(capacity)

目前只支持存储空间的设置( storage=1Gi ),不过未来可能会加入IOPS、吞吐量等指标的配置

  • 访问模式(accessModes)

    用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:

    • ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载

    • ReadOnlyMany(ROX): 只读权限,可以被多个节点挂载

    • ReadWriteMany(RWX):读写权限,可以被多个节点挂载

    需要注意的是,底层不同的存储类型可能支持的访问模式不同

  • 回收策略(persistentVolumeReclaimPolicy)

    当PV不再被使用了之后,对其的处理方式。目前支持三种策略:

    • Retain (保留) 保留数据,需要管理员手工清理数据,当一个PV不再被任何PVC使用时(即PVC被删除或被绑定到其他PV),PV本身仍然存在,并且其上的数据不会被自动清除。管理员需要手动处理这些PV,可以重新绑定给新的PVC,或者手动删除PV。

    • Recycle(回收) 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*

    • Delete (删除) 与 PV 相连的后端存储完成 volume 的删除操作,当然这常见于云服务商的存储服务。当一个PV不再被任何PVC使用时,PV会被自动删除,并且其上的数据也会被清除。PV一旦不再使用,就会被自动清理,减少了管理员的工作量。

    需要注意的是,底层不同的存储类型可能支持的回收策略不同

只有 NFS 和 HostPath 支持回收利用

AWS EBS,GCE PD,Azure Disk,or OpenStack Cinder卷支持删除操作。

  • 存储类别

    PV可以通过storageClassName参数指定一个存储类别

    • 具有特定类别的PV只能与请求了该类别的PVC进行绑定

    • 未设定类别的PV则只能与不请求任何类别的PVC进行绑定

  • 状态(status)

    一个 PV 的生命周期中,可能会处于4中不同的阶段:

    • Available(可用): 表示可用状态,还未被任何 PVC 绑定

    • Bound(已绑定): 表示 PV 已经被 PVC 绑定

    • Released(已释放): 表示 PVC 被删除,但是资源还未被集群重新声明

    • Failed(失败): 表示该 PV 的自动回收失败

2.2 PVC 的配置介绍

PVC是资源的申请,用来声明对存储空间、访问模式、存储类别需求信息。下面是资源清单文件:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvcnamespace: dev
spec:accessModes: # 访问模式selector: # 采用标签对PV选择storageClassName: # 存储类别resources: # 请求空间requests:storage: 5Gi

PVC 的关键配置参数说明:

  • 访问模式(accessModes)

用于描述用户应用对存储资源的访问权限

  • 选择条件(selector)

    通过Label Selector的设置,可使PVC对于系统中己存在的PV进行筛选

  • 存储类别(storageClassName)

    PVC在定义时可以设定需要的后端存储的类别,只有设置了该class的pv才能被系统选出

  • 资源请求(Resources )

    描述对存储资源的请求

3 持久卷实验

3.1 创建 PV

PV 资源用于在集群中管理持久性存储。PV 资源配置如下:

其实PV 主要的作用无非就是选择哪种类型的网络文件系统,如这次使用的就是NFS的文件系统。

或者说选择 回收的策略、访问的模式等等

[root@k8s-master volumes]# vim pv1-nfs.ymlapiVersion: v1 
kind: PersistentVolume  # 定义资源类型为PersistentVolume
metadata:  name: pv1  
spec:  storageClassName: my-nfs  # 指定存储类名称capacity:  # PV的容量storage: 5Gi  # PV的大小为5GiBvolumeMode: Filesystem  # 指定卷的模式为文件系统accessModes:  # PV的访问模式- ReadWriteMany  # 支持多个节点同时读写# 设置PV的回收策略为Retain(保留),这意味着当PV不再被任何PVC使用时,# PV仍然存在,并且其上的数据不会被自动清除persistentVolumeReclaimPolicy: Retain  # 使用NFS类型的卷nfs:  # 使用NFS类型的卷server: 192.168.239.50  # NFS服务器的IP地址path: /nfsdata/pv1  # 在NFS服务器上的路径[root@k8s-master volumes]# kubectl apply -f pv1-nfs.yml 

3.2 查看 PV 资源是否被创建成功

可以发现,虽然创建成功了,但他还处于 Available 的状态 ,这是未绑定的的状态但他是可用的,我们需要将 PV 与 PVC 进行绑定,最终实现的状态为 Bound

[root@k8s-master volumes]# kubectl get persistentvolume
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pv1    5Gi        RWX            Retain           Available           my-nfs         <unset>                          13s

3.3 创建 PVC 与 PV 进行绑定

[root@k8s-master volumes]# vim pv1-nfs.yml apiVersion: v1
kind: PersistentVolume  # 定义PersistentVolume资源
metadata:name: pv1  # PV的名称
spec:storageClassName: my-nfs  # 指定存储类名称,与PVC要对应capacity:storage: 5Gi  # PV的容量大小volumeMode: Filesystem  # 卷的模式为文件系统accessModes:  # PV的访问模式- ReadWriteMany  # 支持多个节点同时读写persistentVolumeReclaimPolicy: Retain  # 设置PV的回收策略为Retain(保留)nfs:  # 使用NFS类型的卷server: 192.168.239.50  # NFS服务器的IP地址path: /nfsdata/pv1  # 在NFS服务器上的路径
# 在pv的 基础上增加以下 pvc 内容
---
apiVersion: v1
kind: PersistentVolumeClaim  # 定义PersistentVolumeClaim资源
metadata:name: pvc1  # PVC的名称  , 注意记住这个名字 ,在后面建立pod 的时候得引用PVC的名字
spec:storageClassName: my-nfs  # 指定存储类名称,与PV中的storageClassName要对应accessModes:  # PVC请求的访问模式- ReadWriteMany  # 支持多个节点同时读写resources:  # PVC请求的资源requests:storage: 1Gi  # 请求的存储容量大小 ,注意这个值不能超过PV的实际值# 声明 pvc
[root@k8s-master volumes]# kubectl apply -f pv1-nfs.yml # 查看pv 与pvc的状态是否变为Bound    
[root@k8s-master volumes]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM          STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pv1    5Gi        RWX            Retain           Bound    default/pvc1   my-nfs         <unset>                          164m[root@k8s-master volumes]# kubectl get pvc
NAME   STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
pvc1   Bound    pv1      5Gi        RWX            my-nfs         <unset>                 45s

3.4 创建一个pod进行测试

# 创建清单文件
[root@k8s-master volumes]# vim pvc1-nginx.yml apiVersion: v1
kind: Pod
metadata:name: pvc-nginx
spec:volumes:  # Pod中使用的卷列表- name: vol1  # 卷的名称persistentVolumeClaim:  # 使用PersistentVolumeClaim类型的卷claimName: pvc1  # 指定要使用的PVC的名称containers:- image: nginxname: nginxvolumeMounts:    # 容器内卷的挂载点 , 即将vol1卷挂载到以下此目录下- mountPath: /usr/share/nginx/htmlname: vol1# 声明清单文件
[root@k8s-master volumes]# kubectl apply -f pvc-nginx.yml # 查看pod是否创建成功
[root@k8s-master volumes]# kubectl get pods -o wide 
NAME                       READY   STATUS      RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
nginx-v1-dbd4bc45b-49hhw   1/1     Running     0          4d      10.244.2.54   k8s-node2   <none>           <none>
nginx-v2-bd85b8bc4-nqpv2   1/1     Running     0          4d      10.244.1.35   k8s-node1   <none>           <none>
pvc-nginx                  1/1     Running     0          15s     10.244.2.64   k8s-node2   <none>           <none>
testpod                    0/1     Completed   0          3d12h   10.244.2.58   k8s-node2   <none>           <none># 尝试以下去访问,发现访问不成功,这是因为这是一个新的卷里面并没有东西
[root@k8s-master volumes]# curl 10.244.2.64
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.27.1</center>
</body>
</html># NFS 服务器上在指定PV中添加数据内容
[root@harbor nfsdata]# echo this is pv1 nginx > /nfsdata/pv1/index.html
[root@harbor nfsdata]# ls pv1/
index.html# 由于并没内使用 ingress 也没有使用 NodePode 来暴露 所以仅在集群内访问
[root@k8s-master volumes]# kubectl get pod pvc-nginx -o wide
NAME        READY   STATUS    RESTARTS   AGE    IP            NODE        NOMINATED NODE   READINESS GATES
pvc-nginx   1/1     Running   0          153m   10.244.2.64   k8s-node2   <none>           <none>[root@k8s-master volumes]# curl 10.244.2.64
this is pv1 nginx

3.5 接下来的 pv2 与 pv3 也是相同的操作

步骤:

创建 PV --> 声明 PV --> 查看是否正确创建 --> 创建 PVC 与 PV 进行绑定(PVC 与 PV 的类名要相同storageClassName) --> 声明PVC --> 创建一个 pod 指定PVC名称 验证是否可用

3.6 PV 2 

# 创建资源清单文件
[root@k8s-master volumes]# vim pv2-nfs.yml 
apiVersion: v1
kind: PersistentVolume
metadata:name: pv2
spec:storageClassName: my-nfs-pv2 # 与PVC 要对应capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadOnlyManypersistentVolumeReclaimPolicy: Retainnfs:server: 192.168.239.50path: /nfsdata/pv2
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc2
spec:storageClassName: my-nfs-pv2 # 与PV 中的 storageClassName 要对应accessModes:- ReadOnlyManyresources:requests:storage: 1Gi# 声明 PV PVC 
[root@k8s-master volumes]# kubectl apply -f pv2-nfs.yml 
persistentvolume/pv2 created
persistentvolumeclaim/pvc2 created[root@k8s-master volumes]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM          STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pv1    5Gi        RWX            Retain           Bound    default/pvc1   my-nfs         <unset>                          179m
pv2    5Gi        ROX            Retain           Bound    default/pvc2   my-nfs-pv2     <unset>                          2m52s[root@k8s-master volumes]# kubectl get pvc
NAME   STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
pvc1   Bound    pv1      5Gi        RWX            my-nfs         <unset>                 169m
pvc2   Bound    pv2      5Gi        ROX            my-nfs-pv2     <unset>                 2m59s[root@k8s-master volumes]# vim pvc2-nginx.yml 
apiVersion: v1
kind: Pod
metadata:name: pvc2-nginx
spec:containers:- image: nginxname: nginx-pvc2volumeMounts:- mountPath: /usr/share/nginx/htmlname: vol2volumes:- name: vol2persistentVolumeClaim:claimName: pvc2[root@k8s-master volumes]# kubectl apply -f pvc2-nginx.yml 
pod/pvc2-nginx created[root@k8s-master volumes]# kubectl get pod pvc2-nginx -o wide
NAME         READY   STATUS    RESTARTS   AGE    IP            NODE        NOMINATED NODE   READINESS GATES
pvc2-nginx   1/1     Running   0          2m4s   10.244.1.37   k8s-node1   <none>           <none># NFS服务器添加数据文件
[root@harbor nfsdata]# ls 
pv1  pv2  pv3
[root@harbor nfsdata]# echo this is pv2 nginx > /nfsdata/pv2/index.html# 测试访问
[root@k8s-master volumes]# curl 10.244.1.37 
this is pv2 nginx

3.7 PV 3

[root@k8s-master volumes]# vim pv3-nfs.yml 
apiVersion: v1
kind: PersistentVolume
metadata:name: pv3
spec:storageClassName: my-nfs-pv3 # 与PVC 要对应capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadOnlyManypersistentVolumeReclaimPolicy: Retainnfs:server: 192.168.239.50path: /nfsdata/pv3
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc3 # 名称必须与pod中引用的一致
spec:storageClassName: my-nfs-pv3 # 与PV 中的 storageClassName 要对应accessModes:- ReadOnlyManyresources:requests:storage: 1Gi[root@k8s-master volumes]# kubectl apply -f pv3-nfs.yml [root@k8s-master volumes]# kubectl get pv,pvc
NAME                   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM          STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
persistentvolume/pv1   5Gi        RWX            Retain           Bound    default/pvc1   my-nfs         <unset>                          3h31m
persistentvolume/pv2   5Gi        ROX            Retain           Bound    default/pvc2   my-nfs-pv2     <unset>                          8m21s
persistentvolume/pv3   5Gi        ROX            Retain           Bound    default/pvc3   my-nfs-pv3     <unset>                          10sNAME                         STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
persistentvolumeclaim/pvc1   Bound    pv1      5Gi        RWX            my-nfs         <unset>                 3h20m
persistentvolumeclaim/pvc2   Bound    pv2      5Gi        ROX            my-nfs-pv2     <unset>                 8m21s
persistentvolumeclaim/pvc3   Bound    pv3      5Gi        ROX            my-nfs-pv3     <unset>                 10s
[root@k8s-master volumes]# vim pvc3-nginx.yml 
[root@k8s-master volumes]# kubectl apply -f pvc3-nginx.yml [root@k8s-master volumes]# vim pvc3-nginx.yml 
apiVersion: v1
kind: Pod
metadata:name: pvc3-nginx
spec:containers:- image: nginxname: nginx-pvc3volumeMounts:- mountPath: /usr/share/nginx/htmlname: vol3volumes:- name: vol3persistentVolumeClaim:claimName: pvc3[root@k8s-master volumes]# kubectl apply -f pvc3-nginx.yml [root@k8s-master volumes]# kubectl get pods pvc3-nginx -o wide
NAME         READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
pvc3-nginx   1/1     Running   0          2m51s   10.244.2.65   k8s-node2   <none>           <none># NFS 增加数据文件
[root@harbor nfsdata]# echo this is pv3 nginx > /nfsdata/pv3/index.html# 访问测试
[root@k8s-master volumes]# curl 10.244.2.65
this is pv3 nginx

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

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

相关文章

深度0.1%调光恒流芯片SL8701支持PWM调光 模拟调光 无频闪 多路共阳

一、芯片概述 SL8701是一款内置100V MOS的降压型高调光比LED恒流驱动芯片&#xff0c;专为智能调光调色照明研发设计。它支持多种调光方式&#xff0c;包括PWM调光和模拟调光&#xff0c;能够实现高调光比&#xff0c;满足不同场景的照明需求。 二、主要特性 PWM调光支持&am…

【Vue3】 h()函数的用法

目录 介绍 参数 使用案例 1.创建虚拟 DOM 元素 2. 组件的动态渲染 3. 创建功能组件 4.渲染动态属性 5. 使用插槽 6. 创建动态标签 介绍 h() 函数用于辅助创建虚拟 DOM 节点&#xff0c;它是 hypescript 的简称——能生成 HTML (超文本标记语言) 的 JavaScript&#x…

Unsupervised HDR Image and Video Tone Mapping via Contrastive Learning

Abstract 捕捉高动态范围 (HDR) 图像&#xff08;视频&#xff09;很有吸引力&#xff0c;因为它可以揭示黑暗和明亮区域的细节。 由于主流屏幕仅支持低动态范围&#xff08;LDR&#xff09;内容&#xff0c;因此需要色调映射算法来压缩HDR图像&#xff08;视频&#xff09;的…

Python编程:创意爱心表白代码集

在寻找一种特别的方式来表达你的爱意吗&#xff1f;使用Python编程&#xff0c;你可以创造出独一无二的爱心图案&#xff0c;为你的表白增添一份特别的浪漫。这里为你精选了六种不同风格的爱心表白代码&#xff0c;让你的创意和情感通过代码展现出来。 话不多说&#xff0c;咱…

Collection-LinkedList源码解析

文章目录 概述LinkedList实现底层数据结构构造函数getFirst(), getLast()removeFirst(), removeLast(), remove(e), remove(index)add()addAll()clear()Positional Access 方法查找操作 概述 LinkedList同时实现了List接口和Deque接口&#xff0c;也就是说它既可以看作一个顺序…

Magnum IO

NVIDIA Magnum IO 文章目录 前言加速数据中心 IO 性能,随时随地助力 AINVIDIA Magnum IO 优化堆栈1. 存储 IO2. 网络 IO3. 网内计算4. IO 管理跨数据中心应用加速 IO1. 数据分析Magnum IO 库和数据分析工具2. 高性能计算Magnum IO 库和 HPC 应用3. 深度学习Magnum IO 库和深度…

ModelMapper的常见用法 ,号称是beanUtils.copyProp....的升级版??,代码复制粘贴即可复现效果,so convenient

官网案例 以下将官网案例做一个解释 1&#xff09;快速入门 递归遍历源对象的属性拷贝给目标对象 拷贝对象下对象的属性值 Data class Order {private Customer customer;private Address billingAddress; }Data class Customer {private Name name; }Data class Name {pr…

【笔记】自动驾驶预测与决策规划_Part5_决策过程(上)

决策过程 0. 前言1.决策过程的引入1.1有了planning&#xff0c;为什么还需要decision-making&#xff1f;1.2 决策规划的一些思考 2.马尔可夫决策过程及其关键要素2.1 马尔可夫过程2.1.1 什么是随机过程&#xff1f;2.1.2 什么是马尔科夫性&#xff1f;2.1.3 马尔可夫决策过程 …

单片机(学习)2024.10.11

目录 按键 按键原理 按键消抖 1.延时消抖 2.抬手检测 通信 1.通信是什么 2.电平信号和差分信号 3.通信的分类 (1)时钟信号划分 同步通信 异步通信 (2)通信方式划分 串行通信 并行通信 (3)通信方向划分 单工 半双工 全双工 4.USART和UART&#xff08;串口通信&a…

计算机毕业设计 基于Python的食品销售数据分析系统的设计与实现 Python毕业设计 Python毕业设计选题 数据分析 Vue【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

安装R和RStudio:开始你的数据分析之旅

数据分析是当今世界中一个非常热门的领域&#xff0c;而R语言是进行数据分析的强大工具之一。R是一种编程语言和软件环境&#xff0c;用于统计计算和图形表示。RStudio是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;它为R语言提供了一个更加友好和高效的工作环境。…

从commit校验失效问题探究husky原理

一、背景 之前创建的项目&#xff0c;发现代码 commit 提交的时候没有了任何校验&#xff0c;具体表现&#xff1a; 一是 feat fix 等主题格式校验没有了二是代码 lint 不通过也能提交 尝试解决这个问题&#xff0c;并深入了解husky的实现原理&#xff0c;将相关的一些知识点…

【Canvas与诗词】要做一棵树,站成永恒

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>要做一棵树站成永恒</title><style type"text/css&quo…

tauri开发Mac电脑Safari浏览器一个很奇怪的问题:在 input 输入框输入的是全小写英文字母,会自动将首字母转换为大写解决办法

问题原因 在 Mac 系统中默认使用 Safari 的内核 WKWebView 作为渲染引擎&#xff0c;而 Safari 浏览器的一些 “人性化” 机制&#xff1a;如果输入框中输入的是全小写英文&#xff0c;会自动将首字母转换为大写。 解决办法 我只需要禁止这个默认的行为&#xff0c;即可解决这…

STM32(十八):实时时钟

时间戳 Unix 时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数&#xff0c;不考虑闰秒。 时间戳存储在一个秒计数器中&#xff0c;秒计数器为32位/64位的整型变量。 世界上所有时区的秒计数器相同&#xff0c;不同时…

项目_C_Ncurses_Flappy bird小游戏

Ncurses库 概述 什么是Ncurses库&#xff1a; Ncurses是一个管理应用程序在字符终端显示的函数库&#xff0c;库中提供了创建窗口界面、移动光标、产生颜色、处理键盘按键等功能。 安装Ncurses库&#xff1a; sudo apt-get install libncurses5-dev 头文件与编译&#xf…

ECCV`24 | 新加坡国立华为提出Vista3D: 实现快速且多视角一致的3D生成

文章链接&#xff1a;https://arxiv.org/pdf/2409.12193 gitbub链接&#xff1a;https://github.com/florinshen/Vista3D 亮点直击 提出了Vista3D&#xff0c;一个用于揭示单张图像3D darkside 的框架&#xff0c;能够高效地利用2D先验生成多样的3D物体。开发了一种从高斯投影到…

初级学习:Python实现AI并搭建

随着人工智能(AI)的迅猛发展,越来越多的人希望能够学习如何通过编程实现AI应用。Python,因为其简洁易用,被广泛认为是AI开发的理想编程语言。本文将介绍Python在AI开发中的基础应用,帮助初学者入门并构建自己的AI项目。 为什么选择Python 在了解如何用Python实现AI之前,…

十、kotlin的协程

协程 基本概念定义组成挂起和恢复结构化并发协程构建器作用域构建器挂起函数阻塞与非阻塞runBlocking全局协程像守护线程 Job的生命周期 常用函数延时和等待启动和取消启动取消 暂停 协程启动调度器启动方式启动模式线程上下文继承的定义继承的公式 协程取消与超时取消挂起点取…

HTMLCSS练习

1) 效果如下 2) 代码如下 2.1) HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" conte…