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

第9章 K8s进阶篇-持久化存储入门

9.1 k8s存储Volumes介绍

Container(容器)中的磁盘文件是短暂的,当容器崩溃时,kubelet会重新启动容器,但最初的文件将丢失,Container会以最干净的状态启动。另外,当一个Pod运行多个Container时,各个容器可能需要共享一些文件。Kubernetes Volume可以解决这两个问题。eg:如一个pod里,容器A和容器B需要共享数据;不同pod间共享数据;
一些需要持久化数据的程序才会用到Volumes,或者一些需要共享数据的容器需要volumes。

不同pod间共享数据也可以通过volumes解决,比如我们nfs,jfs,ceph,公有云的nas等;

日志收集的需求:需要在应用程序的容器里面加一个sidecar,这个容器是一个收集日志的容器,比如filebeat,它通过volumes共享应用程序的日志文件目录。就是同一个pod下不同容器共享数据;
Volumes:官方文档https://kubernetes.io/docs/concepts/storage/volumes/

9.2 Volumes EmptyDir实现数据共享

 emptyDir是一个空目录,不需要提前创建相关目录,他的声明周期和Pod是完全一致的,Pod被删除时,emptyDir也会被删除。emptyDir主要是用于同一个Pod内不同的容器之间共享工作过程中产生的文件。


比较常用的volumes的使用emptydir,hostpath,NFS(configmap和secret 之前讲过)等

emptydir主要是用用作pod下不同容器间共享数据,不是持久化存储,重启后数据丢失。

和上述volume不同的是,如果删除Pod,emptyDir卷中的数据也将被删除,一般emptyDir卷用于Pod中的不同Container共享数据。它可以被挂载到相同或不同的路径上。
默认情况下,emptyDir卷支持节点上的任何介质,可能是SSD、磁盘或网络存储,具体取决于自身的环境。可以将emptyDir.medium字段设置为Memory,让Kubernetes使用tmpfs(内存支持的文件系统),虽然tmpfs非常快,但是tmpfs在节点重启时,数据同样会被清除,并且设置的大小会被计入到Container的内存限制当中。

[root@k8s-master01 ~]# vim nginx-deploy_1205_emptydir.yaml


# cat nginx-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginx
spec:replicas: 2 #副本数selector:matchLabels:app: nginxstrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:creationTimestamp: nulllabels:app: nginxspec:containers:- image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12imagePullPolicy: IfNotPresentname: nginxresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: File# ports:# - containerPort: 8080#   name: nginx-port#   protocol: TCPvolumeMounts:- mountPath: /optname: share-volume- image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12imagePullPolicy: IfNotPresentname: nginx2command:- sh- -c- sleep 3600resources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: File# ports:# - containerPort: 8090#   name: nginx2-port#   protocol: TCPvolumeMounts:- mountPath: /mntname: share-volumednsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30volumes: - name: share-volumeemptyDir: {}#medium: Memory
[root@k8s-master01 ~]# kubectl create -f nginx-deploy_1205_emptydir.yaml
deployment.apps/nginx created

副本数是2,所以创建2个pod,每个pod包含2个容器nginx、nginx2

 

验证1: 

pod   nginx-6c5778576c-4hxkj  nginx

[root@k8s-master01 ~]# kubectl exec -it nginx-6c5778576c-4hxkj -c nginx -- bash
root@nginx-6c5778576c-4hxkj:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          26G  8.2G   18G  32% /
tmpfs            64M     0   64M   0% /dev
tmpfs           1.5G     0  1.5G   0% /sys/fs/cgroup
/dev/sda3        26G  8.2G   18G  32% /opt
shm              64M     0   64M   0% /dev/shm
tmpfs           2.9G   12K  2.9G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs           1.5G     0  1.5G   0% /proc/acpi
tmpfs           1.5G     0  1.5G   0% /proc/scsi
tmpfs           1.5G     0  1.5G   0% /sys/firmware
root@nginx-6c5778576c-4hxkj:/# cd /opt
root@nginx-6c5778576c-4hxkj:/opt# ls
root@nginx-6c5778576c-4hxkj:/opt# touch test.txt
root@nginx-6c5778576c-4hxkj:/opt# echo aaaaaaaaaaaaa > test.txt 

 pod   nginx-6c5778576c-4hxkj  nginx2

[root@k8s-master01 ~]# kubectl exec -it nginx-6c5778576c-4hxkj -c nginx2 -- bash
root@nginx-6c5778576c-4hxkj:/# 
root@nginx-6c5778576c-4hxkj:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          26G  8.2G   18G  32% /
tmpfs            64M     0   64M   0% /dev
tmpfs           1.5G     0  1.5G   0% /sys/fs/cgroup
/dev/sda3        26G  8.2G   18G  32% /mnt
shm              64M     0   64M   0% /dev/shm
tmpfs           2.9G   12K  2.9G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs           1.5G     0  1.5G   0% /proc/acpi
tmpfs           1.5G     0  1.5G   0% /proc/scsi
tmpfs           1.5G     0  1.5G   0% /sys/firmware
root@nginx-6c5778576c-4hxkj:/# cd /mnt
root@nginx-6c5778576c-4hxkj:/mnt# ls
test.txt
root@nginx-6c5778576c-4hxkj:/mnt# cat test.txt 
aaaaaaaaaaaaa

在容器nginx的/opt目录中写入文件test.txt

在容器nginx2的/mnt目录中看到写入的test.txt文件

验证2:

容器nginx2追加内容

root@nginx-6c5778576c-4hxkj:/mnt# echo "bbbbbbbbbbbbbbbbbbbbbbbb" >>test.txt 

容器nginx查看内容

root@nginx-6c5778576c-4hxkj:/opt# cat test.txt 
aaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbb

 9.3  Volumes HostPath挂载宿主机路径

Kubernetes是一种用于管理容器化应用程序的开源平台。在Kubernetes中,Pod是最小的可部署单元,可以包含一个或多个容器。每个Pod都有自己的IP地址,可以使用它来与其他Pod进行通信。Pod可以挂载一个或多个卷来存储应用程序数据。其中一个卷类型是HostPath,它允许Pod将宿主机上的文件或目录挂载到其容器中。

HostPath卷类型对于需要直接访问宿主机上的文件或目录的应用程序非常有用。例如,如果需要访问宿主机上的日志文件或配置文件,可以使用HostPath挂载这些文件。但是,使用HostPath也存在一些安全风险,因为它允许Pod访问宿主机上的文件系统。

警告:HostPath 卷存在许多安全风险,最佳做法是尽可能避免使用 HostPath。 当必须使用 HostPath 卷时,它的范围应仅限于所需的文件或目录,并以只读方式挂载。如果通过 AdmissionPolicy 限制 HostPath 对特定目录的访问,则必须要求 volumeMounts 使用 readOnly 挂载以使策略生效。

一般不推荐使用。

vim  nginx-deploy_1205_emptydir.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginx
spec:replicas: 2 #副本数selector:matchLabels:app: nginxstrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:creationTimestamp: nulllabels:app: nginxspec:containers:- image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12imagePullPolicy: IfNotPresentname: nginxresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: File# ports:# - containerPort: 8080#   name: nginx-port#   protocol: TCPvolumeMounts:- mountPath: /optname: share-volume- mountPath: /etc/timezonename: timezone - mountPath: /tmp/name: tmp- image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12imagePullPolicy: IfNotPresentname: nginx2command:- sh- -c- sleep 1200resources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: File# ports:# - containerPort: 8090#   name: nginx2-port#   protocol: TCPvolumeMounts:- mountPath: /mntname: share-volume- mountPath: /etc/timezonename: timezone dnsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30volumes: - name: share-volumeemptyDir: {}#medium: Memory- name: timezonehostPath:path: /etc/timezonetype: File- name: tmphostPath:path: /tmptype: Directory

增加如下部分配置:挂载文件、挂载目录

验证:

kubectl replace -f nginx-deploy_1205_emptydir.yaml 

[root@k8s-master01 ~]# kubectl get pod
NAME                                READY   STATUS        RESTARTS      AGE
busybox                             0/1     Unknown       0             105d
nginx-5b95587595-m2fl9              2/2     Running       0             12s
nginx-5b95587595-x4zhm              2/2     Running       0             14s
nginx-6c5778576c-4hxkj              2/2     Terminating   1 (30m ago)   90m
nginx-6c5778576c-b64sf              2/2     Terminating   1 (30m ago)   90m
nginx-deployment-7f65cbfc84-2npk5   1/1     Running       1 (35d ago)   93d
nginx-deployment-7f65cbfc84-4hlpt   1/1     Running       1 (35d ago)   93d
nginx-deployment-7f65cbfc84-dmgfx   1/1     Running       1 (35d ago)   93d
nginx-deployment-7f65cbfc84-p2dfr   1/1     Running       1 (35d ago)   93d
nginx-deployment-7f65cbfc84-zkld4   1/1     Running       1 (35d ago)   93d[root@k8s-master01 ~]# kubectl exec -it nginx-5b95587595-m2fl9 -c nginx -- bashroot@nginx-5b95587595-m2fl9:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          26G   10G   17G  39% /
tmpfs            64M     0   64M   0% /dev
tmpfs           1.5G     0  1.5G   0% /sys/fs/cgroup
/dev/sda3        26G   10G   17G  39% /opt
shm              64M     0   64M   0% /dev/shm
tmpfs           2.9G   12K  2.9G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs           1.5G     0  1.5G   0% /proc/acpi
tmpfs           1.5G     0  1.5G   0% /proc/scsi
tmpfs           1.5G     0  1.5G   0% /sys/firmwareroot@nginx-5b95587595-m2fl9:/# cd tmp
root@nginx-5b95587595-m2fl9:/tmp# ls 
sys.log
#宿主机增加sys2.log文件
root@nginx-5b95587595-m2fl9:/tmp# ls
runc-process2653599717	sys.log  sys2.log
#查看/etc/timezone文件
root@nginx-5b95587595-m2fl9:/tmp# cat /etc/timezone 
Asia/Shanghai

 

9.4 挂载NFS至容器

 master01 安装nfs软件

yum -y install nfs-utils rpcbind

宿主机node01(ip:192.168.42.244)安装nfs服务器

yum -y install nfs-utils rpcbindsystemctl restart nfs-server[root@k8s-node01 ~]# vim /etc/exports/mnt/ 192.168.0.0/16(rw,sync,no_subtree_check,no_root_squash)
/opt/ 192.168.0.0/16(rw,sync,no_subtree_check,no_root_squash)#重新加载配置文件
[root@k8s-node01 ~]# exportfs -rv
exporting 192.168.0.0/16:/opt
exporting 192.168.0.0/16:/mnt[root@k8s-node01 ~]# systemctl reload nfs-server#查看共享目录
[root@k8s-node01 ~]# showmount -e localhost
Export list for localhost:
/opt 192.168.0.0/16
/mnt 192.168.0.0/16

master01验证node01 nfs server是否正常

[root@k8s-master01 mnt]# mkdir data
[root@k8s-master01 mnt]# mount -t nfs 192.168.42.244:/mnt /mnt/data/
[root@k8s-master01 mnt]# df -h
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             1.5G     0  1.5G   0% /dev
tmpfs                1.5G     0  1.5G   0% /dev/shm
tmpfs                1.5G  153M  1.4G  11% /run
tmpfs                1.5G     0  1.5G   0% /sys/fs/cgroup
/dev/sda3             26G   10G   17G  39% /
/dev/sda1           1014M  171M  844M  17% /boot
。。。
192.168.42.244:/mnt   26G  7.8G   19G  30% /mnt/data
[root@k8s-master01 mnt]# ls /mnt/data/
node01.txt
[root@k8s-master01 mnt]# umount data
[root@k8s-master01 mnt]# 

开始测试:

在yaml文件增加如下2部分

vim nginx-deploy_1205_emptydir.yaml

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginx
spec:replicas: 2 #副本数selector:matchLabels:app: nginxstrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:creationTimestamp: nulllabels:app: nginxspec:containers:- image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12imagePullPolicy: IfNotPresentname: nginxresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: File# ports:# - containerPort: 8080#   name: nginx-port#   protocol: TCPvolumeMounts:- mountPath: /optname: share-volume- mountPath: /etc/timezonename: timezone - mountPath: /tmp/name: tmp- image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12imagePullPolicy: IfNotPresentname: nginx2command:- sh- -c- sleep 1200resources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: File# ports:# - containerPort: 8090#   name: nginx2-port#   protocol: TCPvolumeMounts:- mountPath: /mntname: share-volume- mountPath: /etc/timezonename: timezone - mountPath: /tmpname: nfsdnsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30volumes: - name: share-volumeemptyDir: {}#medium: Memory- name: timezonehostPath:path: /etc/timezonetype: File- name: tmphostPath:path: /tmptype: Directory- name: nfsnfs: server: 192.168.42.244path: /mnt
[root@k8s-master01 ~]# kubectl replace -f nginx-deploy_1205_emptydir.yaml 
deployment.apps/nginx replaced[root@k8s-master01 ~]# kubectl exec -it nginx-679784694b-g45v7 -c nginx2 -- bash
root@nginx-679784694b-g45v7:/# df -h
Filesystem           Size  Used Avail Use% Mounted on
overlay               26G  7.8G   19G  30% /
tmpfs                 64M     0   64M   0% /dev
tmpfs                1.5G     0  1.5G   0% /sys/fs/cgroup
/dev/sda3             26G  7.8G   19G  30% /mnt
192.168.42.244:/mnt   26G  7.8G   19G  30% /tmp
shm                   64M     0   64M   0% /dev/shm
tmpfs                2.9G   12K  2.9G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                1.5G     0  1.5G   0% /proc/acpi
tmpfs                1.5G     0  1.5G   0% /proc/scsi
tmpfs                1.5G     0  1.5G   0% /sys/firmware

相关文章:

第9章 K8s进阶篇-持久化存储入门

9.1 k8s存储Volumes介绍 Container(容器)中的磁盘文件是短暂的,当容器崩溃时,kubelet会重新启动容器,但最初的文件将丢失,Container会以最干净的状态启动。另外,当一个Pod运行多个Container时&…...

MathType2024最新word公式编辑器

使用word进行论文编写时,常需要使用公式编辑器,但有些word中并没有公式编辑器,这时应该怎么办呢?本文将围绕word里没有公式编辑器怎么办,word中的公式编辑器怎么用的内容进行介绍。 一、word里没有公式编辑器怎么办 …...

英语语法 - 主语从句

[ 主语从句 ] 没有时态要求 | 三单 1. 从属连词 that 引导的主语从句 | 不做句子成分 | 没有意义 That a monster attacked a ship last week shocked the world. That I bought a house in Beijing shocks many people. That Oscar is rich makes us upset. That he didnt wa…...

千梦网创:实现自动化“挂机躺盈”的三种方法

在互联网众多行业中,有很多人一直在寻找所谓的“挂机躺盈”的项目,在理财领域这种收入被称为“被动收入”。 天上不会掉馅饼这是一句讲烂掉的话了,躺在家里吃白食等着钱进账是一件不可能的事情。 然而如果你看到身边有“被动收入”的例子&a…...

微信小程序页面传递参数方法

说明 页面跳转方法有很多中,但经常会通过一个页面传递参数给另一个页面,非常的常见。但数据量大的时候,通常用字符串传递,但会显得过于臃肿,下面介绍页面传递参数的各种方式。 一、页面跳转链接携带参数 例如&#xf…...

出行类app如何提升广告变现收益?

出行类APP已经成为越来越多人们出行的首选,出行类app在变现方式上存在以下痛点:APP功能单一、使用场景单一;用户使用时间集中,粘性低...这些痛点使得开发者获取收益的提升面临极大的挑战。 https://www.shenshiads.com 如何让出…...

万能在线答题考试小程序源码系统 既能刷题 又能考试 带完整的搭建教程

现如今,线上学习和考试已经成为一种趋势。近年来,移动端的普及以及微信小程序的兴起,使得在线答题考试系统变得更加便捷和高效。今天罗峰就来给大家介绍一款万能在线答题考试小程序源码系统,既能刷题,又能考试&#xf…...

《Linux从练气到飞升》No.30 深入理解 POSIX 信号量与生产消费模型

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…...

高防IP可以抵御哪些恶意攻击

高防IP协议可以隐藏用户的站点,使得攻击者无法发现恶意攻击的目标网络资源,从而提高了源站的安全性。能够有效抵御常见的恶意攻击类型ICMPFlood、UDPFlood、 TCPFlood、SYNFlood、ACKFlood等,帮助游戏、金 融、电子商务、互联网、政企等行业抵…...

vivado产生报告阅读分析6-时序报告2

1、复查时序路径详情 单击“ OK ”运行报告命令后 , 将打开一个新窗口。这样您即可复查其中内容。在其中可查看执行选定的每种类型 (min/max/min_max ) 的分析之后所报告的 N 条最差路径。 下图显示的“Report Timing ” ( 时序报告 ) 窗口…...

电脑怎么备份文件?简单几步,轻松备份!

电脑中存储着大量的个人和工作文件,包括照片、文档、音乐和视频等。但突发状况,如硬件故障、病毒感染或误删文件,可能会导致数据丢失。因此,备份文件至关重要。在本文中,我们将介绍三种电脑怎么备份文件的方法&#xf…...

获得不同干扰程度的模糊图像

同时对一共父级文件夹遍历。获得对应不同干扰程度的模糊图像 # This isimport cv2 import numpy as npdef reduce_resolution(image, factor):height, width, _ image.shape # 获取原始图像的宽度和高度new_width int(width / factor) # 计算新的宽度和高度new_height i…...

spring为什么要使用三级缓存来解决循环依赖

出现循环依赖的原因 AService依赖BService Service("aService") public class AService {AutowiredBService bService; } BService依赖AService Service("bService") public class BService {AutowiredAService aService; } 此时就出现了循环依赖 想…...

【自留地】前端 - uniapp - Vue - React - Flutter

uniapp uniapp自用速查表 - 我的常用组件 uniapp自用速查表 - 我的常用组件_uniapp static/customicons.css-CSDN博客文章浏览阅读1.8k次。uniapp项目登录退出、全局变量与状态、本地存储、Tabbar标签栏、顶部导航栏、下拉刷新、触底刷新、Ajax交互、内置组件样式修改、自定义…...

深度学习损失函数

Loss 是深度学习算法中重要的一部分,它的主要功能是评价网络预测的准确性和指导权重更新。合适 Loss 可以让网络收敛更快,预测更准。这个项目介绍了损失函数的基本概念以及7种常用损失函数的形式,性质,参数,使用场景及…...

百度智能云正式上线Python SDK版本并全面开源

文章目录 前言一、SDK的优势二、千帆SDK:快速落地LLM应用三、如何快速上手千帆SDK3.1、SDK快速启动3.2. SDK进阶指引 3.3. 通过Langchain接入千帆SDK4、开源社区 前言 百度智能云千帆大模型平台再次升级!在原有API基础上,百度智能云正式上线…...

Elasticsearch的配置学习笔记

文/朱季谦 Elasticsearch是一个基于Lucene的搜索服务器。它提供一个分布式多用户能力的全文搜索引擎,基于RESTful web接口,Elasticsearch是用Java语言开发的。 关于Elasticsearch系列笔记,主要从Elasticsearch的配置、核心组件、架构设计、使…...

LeetCode(25)验证回文串【双指针】【简单】

目录 1.题目2.答案3.提交结果截图 链接: 验证回文串 1.题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&…...

Android设计模式--工厂模式

一,定义 工厂模式与Android 设计模式--单例模式-CSDN博客,Android设计模式--Builder建造者模式-CSDN博客,Android设计模式--原型模式-CSDN博客 一样,都是创建型设计模式。 工厂模式就是定义一个用于创建对象的接口,让…...

EasyExcel入门使用教程

文章目录 简介一、工程创建🎑二、读操作🎊二、写操作🎄总结 简介 数据导入导出意义 后台管理系统是管理、处理企业业务数据的重要工具,在这样的系统中,数据的导入和导出功能是非常重要的,其主要意义包括以下…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

如何配置一个sql server使得其它用户可以通过excel odbc获取数据

要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据&#xff0c;你需要完成以下配置步骤&#xff1a; ✅ 一、在 SQL Server 端配置&#xff08;服务器设置&#xff09; 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到&#xff1a;SQL Server 网络配…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...

第22节 Node.js JXcore 打包

Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本&#xff0c;基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...