【云原生】k8s集群部署Rook+Ceph云原生存储

news2024/9/21 15:36:03

文章目录

    • 一、Rook介绍
    • 二、Ceph介绍
    • 三、部署Rook和Ceph
      • 3.1 前置准备
      • 3.2 部署Rook
      • 3.3 部署Ceph集群
      • 3.4 部署ceph dashboard
    • 四、部署Rook工具箱
    • 五、部署RBD StorageClass

一、Rook介绍

Rook 官网地址:https://rook.io 是一个自管理的分布式存储编排系统,可以为Kubernetes提供便利的存储解决方案。

Rook本身并不提供存储,而是在kubernetes和存储系统之间提供适配层,简化存储系统的部署与维护工作。

目前,Rook支持的存储系统包括:Ceph、CockroachDB、Cassandra、EdgeFS、Minio、NFS。当然,Rook支持的最好的还是Ceph 和 NFS。

在这里插入图片描述

二、Ceph介绍

Ceph 是一种为优秀的性能、可靠性和可扩展性而设计的统一的、分布式文件系统。Ceph 的统一体现在可以提供文件系统、块存储和对象存储,分布式体现在可以动态扩展。

Ceph支持三种存储:

  • 块存储(RDB):可以直接作为磁盘挂载
  • 文件系统(CephFS):提供POSIX兼容的网络文件系统CephFS,专注于高性能、大容量存储
  • 对象存储(RADOSGW):提供RESTful接口,也提供多种编程语言绑定。兼容S3(是AWS里的对象存储)、Swift(是openstack里的对象存储)

核心组件:
Ceph 主要有三个基本进程:
OSD
用于集群中所有数据与对象的存储,处理集群数据的复制、恢复、回填、再均衡,并向其他osd守护进程发送心跳,然后向 Monitor 提供一些监控信息。
Monitor
监控整个集群的状态,维护集群的 cluster MAP 二进制表,保证集群数据的一致性。
MDS (可选)
为 Ceph 文件系统提供元数据计算、缓存与同步。MDS 进程并不是必须的进程,只有需要使用 CephFS 时,才需要配置 MDS 节点。

三、部署Rook和Ceph

3.1 前置准备

通过rook安装ceph集群需要满足以下两个前提条件:
1.已部署好的Kubernetes集群 (✅)
2.osd节点需要有未格式化⽂件系统的磁盘(✅)

  1. 在master1节点下载rook到本地,使用1.8.8版本
git clone --single-branch --branch v1.8.8 https://github.com/rook/rook.git
  1. 给所有需要安装ceph的worker节点安装lvm2
yum install lvm2 -y

检查三台worker节点是否安装成功
[root@k8s-worker1 ~]# yum list installed | grep lvm2
lvm2.x86_64                        7:2.02.187-6.el7_9.5       @iflytekdc-updates
lvm2-libs.x86_64                   7:2.02.187-6.el7_9.5       @iflytekdc-updates
  1. 给worker节点打上标签,保证ceph只安装在这3台worker节点上
# master1节点上操作:
kubectl label node k8s-worker1 role=ceph-storage
kubectl label node k8s-worker2 role=ceph-storage
kubectl label node k8s-worker3 role=ceph-storage

修改完成后使用命令查看label属性
[root@k8s-master1 ~]# kubectl get nodes --show-labels 
NAME              STATUS   ROLES                  AGE     VERSION   LABELS
k8s-worker1   Ready    worker                 3d17h   v1.21.5   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-worker1,kubernetes.io/os=linux,node-role.kubernetes.io/worker=,role=ceph-storage
k8s-worker2   Ready    worker                 3d17h   v1.21.5   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-worker2,kubernetes.io/os=linux,node-role.kubernetes.io/worker=,role=ceph-storage
k8s-worker3   Ready    worker                 3d17h   v1.21.5   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-worker3,kubernetes.io/os=linux,node-role.kubernetes.io/worker=,role=ceph-storage
  1. 手动下载安装ceph所需镜像
    rook 中ceph依赖很多都是使用国外的镜像,下载很慢,而且经常出现400错误,所以建议直接手动下载。注意,以下脚本在所有节点都需要运行(master 和 worker)

创建可执行文件 ceph.sh,内容如下

image_list=(
  csi-node-driver-registrar:v2.5.0
  csi-attacher:v3.4.0
  csi-snapshotter:v5.0.1
  csi-resizer:v1.4.0
  csi-provisioner:v3.1.0
)
 
aliyuncs="registry.aliyuncs.com/it00021hot"
google_gcr="k8s.gcr.io/sig-storage"
for image in ${image_list[*]}
do
  docker image pull ${aliyuncs}/${image}
  docker image tag ${aliyuncs}/${image} ${google_gcr}/${image}
  docker image rm ${aliyuncs}/${image}
  echo "${aliyuncs}/${image} ${google_gcr}/${image} downloaded."
done
修改文件权限后执行拉取镜像
chmod +x ceph.sh
sh ceph.sh
查看镜像是否下载完成(master & node节点都需要下载)
[root@k8s-worker1 ~]# docker images | grep csi
k8s.gcr.io/sig-storage/csi-node-driver-registrar                   v2.5.0    cb03930a2bd4   4 months ago    19.6MB
k8s.gcr.io/sig-storage/csi-resizer                                 v1.4.0    551fd931edd5   4 months ago    55.5MB
k8s.gcr.io/sig-storage/csi-snapshotter                             v5.0.1    53ae5b88a338   4 months ago    55.2MB
k8s.gcr.io/sig-storage/csi-provisioner                             v3.1.0    c3dfb4b04796   4 months ago    57.7MB
k8s.gcr.io/sig-storage/csi-attacher                                v3.4.0    03e115718d25   5 months ago    54.8MB
  1. 修改ceph调度算法,通过节点亲和性让其运行在指定节点上,同时手动指定节点及磁盘
    还记得我们之前挂载磁盘的时候给ceph预留了一个空盘吧,如果没有空盘,可以新建一个,流程如下:

在这里插入图片描述
在这里插入图片描述
将新增的磁盘设置成独立模式(模拟公有云厂商提供的独立磁盘),然后启动K8S集群虚拟机,在工作节点上使用以下命令检查一下磁盘条件是否符合Ceph部署要求:

[root@node1 ~]# lsblk -f
NAME        FSTYPE      LABEL           UUID                                   MOUNTPOINT
sdb                                                                            
sr0         iso9660     CentOS 7 x86_64 2020-11-04-11-36-43-00                 
sda                                                                            
├─sda2      LVM2_member                 45inUD-qJ4O-Fq9E-L6KD-8eJV-mofD-BuJDq6 
│ └─centos_node1-root
            xfs                         704f37f0-ae59-4995-80ec-58cba66e023b   /
└─sda1      xfs                         67243cc8-c3fb-490f-b0da-cc439371d5e1   /boot

上述命令输出中 sdb 磁盘就是我们为工作节点新添加的裸设备(它的FSTYPE为空),我们可以把它分配给Ceph使用。

我们使用之前预留的空盘继续:
先通过lsblk查看盘符,可以看到vdb2是预留给ceph的

[root@k8s-worker2 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1  478K  0 rom  
vda    253:0    0   50G  0 disk 
├─vda1 253:1    0    1G  0 part /boot
└─vda2 253:2    0   49G  0 part /
vdb    253:16   0  500G  0 disk 
├─vdb1 253:17   0  100G  0 part /var/lib/docker
└─vdb2 253:18   0  400G  0 part

然后修改ceph集群配置:

vim /root/rook/deploy/examples/cluster.yaml
#原始位置大概在138行 
# 第一处修改节点亲和性 ,设置为安装ceph的机器节点的标签(本文档worker节点标签role=ceph-storage)
placement:
    all:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: role
              operator: In
              values:
              - ceph-storage
 
#原始位置大概在215行起,
# Individual nodes and their config can be specified as well, but 'useAllNodes' above must be set to false. Then, only the named
 # nodes below will be used as storage resources.  Each node's 'name' field should match their 'kubernetes.io/hostname' label.
#  第二处修改
  storage: # cluster level storage configuration and selection
    useAllNodes: false
    useAllDevices: false
    config:
      journalSizeMB: "4096"
    nodes:
    - name: "k8s-worker1"
      devices:
        - name: "vdb2" # 可以通过lsblk查看磁盘信息
          config:
            storeType: bluestore
    - name: "k8s-worker2"
      devices: 
        - name: "vdb2" # 可以通过lsblk查看磁盘信息
          config:
            storeType: bluestore
    - name: "k8s-worker3"
      devices: 
        - name: "vdb2" # 可以通过lsblk查看磁盘信息
          config:
            storeType: bluestore

注意,name 不能够配置为IP,而应该是标签 kubernetes.io/hostname 的内容

  1. 修改operator.yaml,让CSI守护进程可以调度到主节点
    默认情况下master节点是不允许调度的,但是ceph有些守护进程是需要调度到master去。这一步是为了解决后面出现的问题,如果此时不修改也可以在后面出现问题的时候再改。这些都是经验教训,网上的安装手册不会告诉你有这一步。
    先查看一下master节点的污点设置
[root@k8s-master1 ~]# kubectl describe node k8s-master1 | grep Taints
Taints:             node-role.kubernetes.io/master:NoSchedule

然后修改rook operator的配置:

vim /root/rook/deploy/examples/operator.yaml

#原始位置在127行 原有注释去掉后,再往前缩进一格否则报错
CSI_PLUGIN_TOLERATIONS: |
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
    operator: Exists

3.2 部署Rook

ceph 相关镜像较大,创建集群过程中可能会存在镜像拉取失败问题,可以在worker节点提前下载。所需镜像:rook/ceph:v1.8.8 quay.io/ceph/ceph: v16.2.7 quay.io/cephcsi/cephcsi:v3.5.1

  1. 创建ceph所需要的资源
cd cluster/examples/kubernetes/ceph
kubectl create -f crds.yaml -f common.yaml -f operator.yaml

执行完成后等待容器启动,只有完全启动后才能执行进行下一步操作。

查看pod启动情况
[root@k8s-master1 examples]# kubectl get pod -n rook-ceph
rook-ceph-operator-84985d69d4-rncx4                      1/1     Running     0          117m

3.3 部署Ceph集群

需要先修改一下集群osd的资源限制,否则osd的内存使用率会无限增长(同样是经验教训)

cd /root/rook/deploy/examples
vim cluster.yaml

#在186行处加入资源限制,建议内存设置4G以上,同时需要注意yaml文件的格式
resources:
    osd:
      limits:
        cpu: "2"
        memory: "8000Mi"
      requests:
          cpu: "2"
          memory: "8000Mi"

修改保存后执行以下命令安装ceph集群

kubectl apply -f cluster.yaml

创建完成后,可以查看pod的状态

[root@k8s-master1 examples]# kubectl -n rook-ceph get pod
NAME                                                        READY   STATUS      RESTARTS   AGE
csi-cephfsplugin-gjmhv                                      3/3     Running     0          8m7s
csi-cephfsplugin-l2vz6                                      3/3     Running     0          8m7s
csi-cephfsplugin-provisioner-6f54f6c477-rnql9               6/6     Running     0          8m7s
csi-cephfsplugin-provisioner-6f54f6c477-vgvnj               6/6     Running     0          8m7s
csi-cephfsplugin-zplbg                                      3/3     Running     0          8m7s
csi-rbdplugin-54cgx                                         3/3     Running     0          8m7s
csi-rbdplugin-7795w                                         3/3     Running     0          8m7s
csi-rbdplugin-dtnqk                                         3/3     Running     0          8m7s
csi-rbdplugin-provisioner-6d765b47d5-g2lzc                  6/6     Running     0          8m7s
csi-rbdplugin-provisioner-6d765b47d5-klk9n                  6/6     Running     0          8m7s
rook-ceph-crashcollector-k8s-worker1-7598585c9b-49czg   1/1     Running     0          5m23s
rook-ceph-crashcollector-k8s-worker2-675d7c66f-lzw4n    1/1     Running     0          5m11s
rook-ceph-crashcollector-k8s-worker3-656f47985d-k4h96   1/1     Running     0          5m35s
rook-ceph-mgr-a-c9bf8bb54-kvgbw                             1/1     Running     0          5m40s
rook-ceph-mon-a-55b778d66d-dl8h6                            1/1     Running     0          8m1s
rook-ceph-mon-b-65f6d54689-zxblk                            1/1     Running     0          7m26s
rook-ceph-mon-c-dc947478f-2jt2r                             1/1     Running     0          5m53s
rook-ceph-operator-84985d69d4-z5bkq                         1/1     Running     0          18h
rook-ceph-osd-0-d77bf645f-mk9j7                             1/1     Running     0          5m12s
rook-ceph-osd-1-b7d7c47d-2kz5p                              1/1     Running     0          5m11s
rook-ceph-osd-2-78fbd4bdc7-zbjsz                            1/1     Running     0          5m11s
rook-ceph-osd-prepare-k8s-worker1-hzq7l                 0/1     Completed   0          5m19s
rook-ceph-osd-prepare-k8s-worker2-8pqlk                 0/1     Completed   0          5m19s
rook-ceph-osd-prepare-k8s-worker3-kb2q9                 0/1     Completed   0          5m19s

以上是所有组件的 pod 完成后的状态,以rook-ceph-osd-prepare 开头的 pod 用于自动感知集群新挂载硬盘,只不过我们前面手动指定了节点,所以这个不起作用。osd-0、osd-1、osd-2容器必须是存在且正常的,如果上述pod均正常运行成功,则视为集群安装成功。

3.4 部署ceph dashboard

Ceph Dashboard 是一个内置的基于 Web 的管理和监视应用程序,它是开源 Ceph 发行版的一部分。通过 Dashboard 可以获取 Ceph 集群的各种基本状态信息。

默认的 ceph 已经安装的 ceph-dashboard,其 SVC 地址是 service clusterIP,并不能被外部访问,需要创建 service 服务。

kubectl apply -f dashboard-external-https.yaml

创建NodePort类型就可以被外部访问了

[root@k8s-master1 ~]# kubectl get svc -n rook-ceph|grep dashboard
rook-ceph-mgr-dashboard                  ClusterIP   109.233.40.229   <none>        8443/TCP            8m28s
rook-ceph-mgr-dashboard-external-https   NodePort    109.233.34.181   <none>        8443:32234/TCP      29s

浏览器访问(master1-ip换成自己的集群ip):https://master1-ip:32234/

用户名默认是admin,至于密码可以通过以下代码获取:

kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}"|base64 --decode && echo

在这里插入图片描述
在这里插入图片描述

四、部署Rook工具箱

Rook 工具箱是一个包含用于 Rook 调试和测试的常用工具的容器,安装很简单。

cd /root/rook/deploy/examples
kubectl apply -f toolbox.yaml -n rook-ceph

待容器Running后,即可执行相关命令:

[root@k8s-master1 ~]# kubectl get po -n rook-ceph | grep tools
rook-ceph-tools-775f4f4468-dcg4x                            1/1     Running     0          2m12s
 
 
[root@k8s-master1 ~]# kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') -- bash
 
[rook@rook-ceph-tools-775f4f4468-dcg4x /]$ ceph -s
  cluster:
    id:     cea16e6d-ef51-4cfd-aa15-3a0e13075071
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum a,b,c (age 28m)
    mgr: a(active, since 27m)
    osd: 3 osds: 3 up (since 28m), 3 in (since 28m)
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   15 MiB used, 1.2 TiB / 1.2 TiB avail
    pgs:
    
[rook@rook-ceph-tools-775f4f4468-dcg4x /]$ ceph osd status
ID  HOST              USED  AVAIL  WR OPS  WR DATA  RD OPS  RD DATA  STATE
 0  dev-k8s-worker3  4976k   399G      0        0       0        0   exists,up
 1  dev-k8s-worker2  4976k   399G      0        0       0        0   exists,up
 2  dev-k8s-worker1  4976k   399G      0        0       0        0   exists,up

工具箱相关查询命令:

ceph status
ceph osd status
ceph df
rados df

五、部署RBD StorageClass

Ceph 可以同时提供对象存储 RADOSGW、块存储 RBD、文件系统存储 Ceph FS。RBD 即 RADOS Block Device 的简称,RBD 块存储是最稳定且最常用的存储类型。RBD 块设备类似磁盘可以被挂载。RBD 块设备具有快照、多副本、克隆和一致性等特性,数据以条带化的方式存储在 Ceph 集群的多个 OSD 中。注意:RBD只支持ReadWriteOnce存储类型

  1. 创建 StorageClass
cd /root/rook/deploy/examples/csi/rbd
kubectl  apply -f storageclass.yaml
  1. 校验pool安装情况
[root@k8s-master1 ~]# kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') -- bash
[root@rook-ceph-tools-775f4f4468-dcg4x /]# ceph osd lspools
1 device_health_metrics
2 replicapool
  1. 查看StorageClass
[root@k8s-master1 rbd]# kubectl get sc
NAME              PROVISIONER                  RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
rook-ceph-block   rook-ceph.rbd.csi.ceph.com   Delete          Immediate           true                   43s
  1. 将Ceph设置为默认存储卷
[root@k8s-master1 ~]# kubectl patch storageclass rook-ceph-block -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

修改完成后再查看StorageClass状态(有个default标识)

[root@k8s-master1 rbd]# kubectl get sc  
NAME                        PROVISIONER                  RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE  
rook-ceph-block (default)   rook-ceph.rbd.csi.ceph.com   Delete          Immediate           true                   108s

通过上面的步骤我们已经给Kubernetes集群安装了Ceph存储,至此我们的高可用集群就已经搭建完毕,甚至可以直接在生产环境使用了。同时也可以看到使用Rook安装Ceph还是很简单的,只需要执行对应的yaml文件即可。

不过要注意的是我们目前给集群安装的StorageClass是基于RBD的块存储,只支持ReadWriteOnce存储类型,如果你要使用ReadWriteMany存储类型,还需要安装CephFs存储。

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

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

相关文章

c++基础学习Num04

目录 基于for循环 一维数组 二维数组理解 c语言的null和c的null 基于for循环 for(ELEMTYPE val:array){}ELEMTYPE:是范围变量的类型。通常使用auto自动转换范围变量类型 val:范围变量的名称。通过迭代依次接收数组中的元素值 array:容器&#xff0c;注意这里的array必须是…

ctfshow 每周大挑战 RCE极限挑战 2

目录 题目解题步骤1.跑一下正则2.变量自增3.最终解题payload 一点多余的思考 题目 解题步骤 1.跑一下正则 本着能懒就懒的原则&#xff0c;就不写Python了&#xff08;提一下这个主要是我一开始想的是写Python呜呜呜&#xff09;&#xff0c;直接写php&#xff0c;还能复制粘…

C生万物 | 指针入门到进阶就看这篇了【十万字吐血整理,收藏学习】

文章篇幅较长&#xff0c;可前往电脑端进行学习&#x1f4bb; 之前很多粉丝私信我说C语言指针怎么这么难&#xff0c;看了很多视频都学不懂&#xff0c;于是我写了一篇有关指针从入门到进阶的教学&#xff0c;帮助那些对指针很困扰的同学有一个好的学习途径&#xff0c;下面是本…

基于JavaWeb实现的学生宿舍管理系统

【简介】 本系统是基于Java实现的学生宿舍管理系统&#xff0c;前端&#xff1a;Vue&#xff1b;后端&#xff1a;SpringBoot Mybatis Redis Mysql&#xff1b;系统环境&#xff1a;jdk1.8 | mysql | redis | nodejs14。有包含登录在内的十大功能模块&#xff0c;三个访问角…

详解事务模式和 Lua 脚本,带你吃透 Redis 事务

先说结论&#xff1a; Redis 的事务模式具备如下特点&#xff1a; 保证隔离性&#xff1b;无法保证持久性&#xff1b;具备了一定的原子性&#xff0c;但不支持回滚&#xff1b;一致性的概念有分歧&#xff0c;假设在一致性的核心是约束的语意下&#xff0c;Redis 的事务可以…

Vuex从了解到实际运用(一)彻底搞懂什么是Vuex

vuex从了解到实际运用——彻底搞懂什么是vuex 知识回调&#xff08;不懂就看这儿&#xff01;&#xff09;场景复现核心干货什么是vuex全局状态管理使用状态管理工具后的好处vuex的实现原理vuex的组件通信1.多级组件通信2.同级组件通信使用vuex进行组件通信 关于vuex的小结 知识…

总结842

学习目标&#xff1a; 5月&#xff08;张宇强化18讲&#xff0c;背诵25篇短文&#xff0c;熟词僻义300词基础词&#xff09; 每日必复习&#xff08;5分钟&#xff09; 学习内容&#xff1a; 暴力英语:背200个基础词阅读理解前两段语法 高等数学&#xff1a;强化课第一讲 小…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的Pow伽马变换算法增强(C#)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的Pow伽马变换算法增强&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI SDK联合Halcon使用Pow伽马变换增强算法1.引用合适的类文件2.BGAPI SDK在图…

gtest之断言

目录 普通断言EXPECT_THAT 布尔条件断言EXPECT_TRUEEXPECT_FALSE 二进制断言EXPECT_EQEXPECT_NEEXPECT_LTEXPECT_LEEXPECT_GTEXPECT_GE 字符串比较EXPECT_STREQEXPECT_STRNEEXPECT_STRCASEEQEXPECT_STRCASENE 浮点型比较EXPECT_FLOAT_EQEXPECT_DOUBLE_EQEXPECT_NEAR 显式成功与…

k8s基础4——deployment控制器、应用部署、升级、回滚、水平扩容缩容

文章目录 一、基本介绍二、应用程序生命周期2.1 部署应用2.2 应用升级2.2.1 修改YAML文件升级&#xff08;交互式&#xff09;2.2.2 命令指定镜像版本升级&#xff08;免交互式&#xff09;2.2.3 调用vim升级 2.3 滚动升级2.3.1 升级流程 2.4 应用回滚2.4.1 查看历史发布版本2.…

yolov5配置错误记录

这里是直接没有找到数据集&#xff0c;说明是路径错误。经过设置yaml后&#xff0c; # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..] path: ../autodl-tmp/datasets/neu # dataset root dir tr…

闲鱼/支付宝 自动收货诈骗套路分析

闲鱼/支付宝 自动收货套路分析 他人闲鱼被骗经历 最近发现闲鱼有一种“自动收货”的套路&#xff0c;就是在闲鱼下单后&#xff0c;卖家发一个二维码&#xff0c;称让你支付运费&#xff0c;该二维码以闲鱼之类的logo为诱惑&#xff0c;让你相信是真的运费支付二维码 正如上文知…

Self-Attention结构细节及计算过程

一、结构 上面那个图其实不是那么重要&#xff0c;只要知道将输入的x矩阵转换成三个矩阵进行计算即可。自注意力结构的输入为 输入矩阵的三个变形 Q&#xff08;query矩阵&#xff09;、K&#xff08;key矩阵&#xff09;、V&#xff08;value矩阵&#xff09;构成&#xff0c;…

Java企业级信息系统02—利用组件注解符精简spring配置文件

文章目录 一、学习目标二、打开01的项目三、利用组件注解符精简spring配置文件&#xff08;一&#xff09;创建新包&#xff0c;复制四个类&#xff08;二&#xff09;修改杀龙任务类&#xff08;三&#xff09;修改救美任务类&#xff08;四&#xff09;修改勇敢骑士类&#x…

Mac安装docker

一、docker是什么&#xff1f; 1、Docker的三个基本概念: Image(镜像)Container(容器)Repository(仓库) Docker的思想来自于集装箱&#xff0c;集装箱解决了什么问题&#xff1f; 在一艘大船上&#xff0c;可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了&a…

你还不知道啊,iPhone手机恢复出厂设置的那些事!

案例&#xff1a;手机恢复出厂设置 【友友们&#xff0c;苹果手机想要挂闲鱼&#xff0c;里面有很多隐私。想要恢复出厂设置来清除手机数据&#xff0c;该怎么进行&#xff1f;有什么需要注意的吗&#xff1f;】 iPhone手机想要进行二次销售&#xff0c;我们一般都会采取方法来…

[面试题] 判断二维空间中一点是否在旋转矩形内部

[面试题]&#xff1a;判断二维空间中一点是否在旋转矩形内部 参考&#xff1a; 1. 判断点是否在一个矩形内 2. 向量点乘与叉乘的概念及几何意义 3. 向量叉乘 4. 向量叉乘的正负意义 5. 本工程完整代码 题目描述 已知条件&#xff1a;旋转矩形中心center(x,y), 旋转矩形的长…

asp.net基于web的学生选课成绩管理系统86程序

系统使用Visual studio.net2010作为系统开发环境&#xff0c;并采用ASP.NET技术&#xff0c;使用C#语言&#xff0c;以SQL Server为后台数据库。 本系统主要包含了“登录模块”、“系统用户管理模块”、“课程信息管理模块”、“教师信息管理模块”、“班级信息管理模块”、“…

Word控件Spire.Doc 【打印】教程(2):保打印word文档不显示打印处理对话框

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

对标世界一流|弹性应对“供应链不确定性常态化” ——快消与重资产行业的经验互鉴

1963年&#xff0c;气象学家洛伦兹提出的“蝴蝶效应”表示&#xff1a;“一只蝴蝶在巴西扇动翅膀&#xff0c;有可能会在美国德克萨斯州引起一场龙卷风”。本文希望通过提供快消行业的先进实践&#xff0c;帮助重资产企业从“蝴蝶扇动翅膀”之前就开始行动&#xff0c;避免“龙…