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

K8s简介及环境搭建

一、Kubernetes简介

kubernetes 的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
  • 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
  • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
  • 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
  • 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
  • 存储编排:可以根据容器自身的需求自动创建存储卷

1.1 K8s组件及其用途

k8s集群包括2种角色:master管理节点和node工作节点,至少要有一个node工作节点。

kubectl 是一个客户端的管理工具,直接管理API server,提供一个请求到一个api server,中间有一个auth认证(判断是否有权限访问)。

1、Master 节点包含4大组件,分别是:kube-api  server、kube-controller-master、kube-scheduler、etcd,备注:etcd可以单独部署集群,不必在master节点上
组件名称

作用

kube-apiservermaster核心组件,k8s集群的统一访问入口,各组件的协调者,以RESTful API提供接口方式,所有的对象资源的增删改查和监听操作都交给APIServer处理后再提交给etcd数据库做持久化存储
kube-controller-manager 处理集群中常规后台任务,一个资源对应一个控制器,而controller-Manager就是负责处理这些控制器的,例如 deployment-controller、endpoint-controller(负责维护集群的状态,比如程序部署安排,故障检测,自动扩展,滚动更新等)
kube-schedulerscheduler根据调度算法为新创建的pod选择一个node节点(负责集群资源调度,按照调度策略将pod绑定到某个node节点上,即给pod分配一个家)
etcd分布式键值存储数据库,用于保存集群状态数据,比如Pod,Service等对象信息,etcd可以有多个(etcd数据库集群),也可以不与master节点在一起,只要master能通过网络连接etcd数据库即可

2、Node节点包含2大组件,分别是:kubelet、kube-proxy  

组件名称

作用

 kubelet kubelet 是Master在Node节点上的Agent,管理node节点主机运行容器的生命周期,比如创建容器,Pod挂载数据卷,下载secret,获取容器和节点状态等工作,kubelet 将每个Pod转换成一组容器(负责维护容器的生命周期,即通过控制docker来创建、更新、销毁容器
kube-proxy在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作,实现让Pod节点(一个或者多个容器)对外提供服务(负责提供集群内部的服务发现和负载均衡)

1.2 K8s常用名词概念

名词概念
Master
集群控制节点,每个集群需要至少一个 master 节点负责集群的管控
Node
工作负载节点,由 master 分配容器到这些 node 工作节点上,然后 node 节点上的
Pod
kubernetes 的最小控制单元,容器都是运行在 pod 中的,一个 pod 中可以有 1 个或者多个容器
Controller
控制器,通过它来实现对 pod 的管理,比如启动 pod 、停止 pod 、伸缩 pod 的数量等
Service
pod 对外服务的统一入口,下面可以维护者同一类的多个 pod
Label
标签,用于对 pod 进行分类,同一类 pod 会拥有相同的标签
NameSpace命名空间,用来隔离pod的运行环境

二、K8s环境部署

2.1 docker仓库环境部署

[root@docker-hub ~]# hostname
docker-hub# 修改配置文件
[root@docker-hub ~]# cd /etc/yum.repos.d/
[root@docker-hub yum.repos.d]# vim docker.repo
[root@docker-hub yum.repos.d]# cat docker.repo
[docker]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable/
gpgcheck=0# 安装docker镜像
[root@docker-hub yum.repos.d]# yum install docker-ce -y已安装:containerd.io-1.7.22-3.1.el9.x86_64docker-buildx-plugin-0.17.1-1.el9.x86_64docker-ce-3:27.3.1-1.el9.x86_64docker-ce-cli-1:27.3.1-1.el9.x86_64docker-ce-rootless-extras-27.3.1-1.el9.x86_64docker-compose-plugin-2.29.7-1.el9.x86_64[root@docker-hub yum.repos.d]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock-
-iptables=true# 启动docker
[root@docker-hub yum.repos.d]# systemctl enable --now docker.service
[root@docker-hub yum.repos.d]# docker info# 从本地上传registry并导入
[root@docker-hub ~]# ls
公共  视频  文档  音乐  anaconda-ks.cfg  registry.tag.gz
模板  图片  下载  桌面  
[root@docker-hub ~]# docker load -i registry.tag.gz
ce7f800efff9: Loading layer  7.644MB/7.644MB
30609d4f10dd: Loading layer  792.6kB/792.6kB
3b6a51496c9d: Loading layer  17.55MB/17.55MB
e704e9e3e9dc: Loading layer  3.584kB/3.584kB
f019f591461d: Loading layer  2.048kB/2.048kB
Loaded image: registry:latest
[root@docker-hub ~]# mkdir certs# 做解析
[root@docker-hub ~]# vim /etc/hosts
[root@docker-hub ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.250  harbor.yee.org  reg.yee.org[root@docker-hub ~]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/yee.org.key -subjectAltName = DNS:reg.yee.org" -x509 -days 365 -out certs/yee.org.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shanxi
Locality Name (eg, city) [Default City]:XI'an
Organization Name (eg, company) [Default Company Ltd]:docker
Organizational Unit Name (eg, section) []:registry
Common Name (eg, your name or your server's hostname) []:reg.yee.org
Email Address []:admin@yee.org# 上传本地harbor包并解压缩
[root@docker-hub ~]# tar zxf harbor-offline-installer-v2.5.4.tgz
[root@docker-hub ~]# ls
公共  文档  anaconda-ks.cfg                      registry.tag.gz
模板  下载  certs
视频  音乐  harbor
图片  桌面  harbor-offline-installer-v2.5.4.tgz# 修改配置文件
[root@docker-hub ~]# cd harbor/
[root@docker-hub harbor]# cp harbor.yml.tmpl harbor.yml
[root@docker-hub harbor]# vim harbor.yml
hostname: reg.yee.org
certificate: /data/certs/yee.org.crt
private_key: /data/certs/yee.org.key
harbor_admin_password: 123[root@docker-hub ~]# docker load -i nginx-latest.tar.gz
9853575bc4f9: Loading layer  77.83MB/77.83MB
72db5db515fd: Loading layer    114MB/114MB
8b87c0c66524: Loading layer  3.584kB/3.584kB
ec1a2ca4ac87: Loading layer  4.608kB/4.608kB
55e54df86207: Loading layer   2.56kB/2.56kB
f4f00eaedec7: Loading layer   5.12kB/5.12kB
5f0272c6e96d: Loading layer  7.168kB/7.168kB
Loaded image: nginx:latest
[root@docker-hub ~]# mkdir /data/
[root@docker-hub ~]# cd /data/
[root@docker-hub data]# cp /root/certs/ /data/ -r
[root@docker-hub data]# cd
[root@docker-hub ~]# cd harbor/
[root@docker-hub harbor]# ./install.sh --with-chartmuseum[root@docker-hub harbor]# cd /root/certs/
[root@docker-hub certs]# ls
yee.org.crt  yee.org.key
[root@docker-hub certs]# cp /root/certs/yee.org.crt /etc/docker/certs.d/reg.yee.org/ca.crt  

做本地解析,路径:C:\Windows\System32\drivers\etc

测试harbor环境

上传镜像:

在docker界面创建文件夹yee

至此,harbor仓库搭建完成。

2.2 K8s集群部署

2.1.1 K8s环境部署说明

K8S 中文官网: https://kubernetes.io/zh-cn/
在本次实验中,我们采用一主多从集群结构类型,一台master节点,两台node节点。其中,maser结点命名为,node结点命名为node1、node2
主机名ip扮演的角色
k8s-master172.25.254.200

K8s集群控制节点

k8s-node1172.25.254.10K8s集群工作节点
k8s-node2172.25.254.20K8s集群工作节点

2.1.2 K8s集群实验环境搭建

注意:

  • 所有节点禁用selinux和防火墙
  • 所有节点同步时间和解析
  • 所有节点安装docker-ce
  • 所有节点禁用swap,注意注释掉/etc/fstab文件中的定义
1、本地解析

[root@k8s-node1 ~]# scp /etc/hosts root@172.25.254.20:/etc/hosts
[root@k8s-node1 ~]# scp /etc/hosts root@172.25.254.100:/etc/hosts
[root@k8s-node1 ~]# scp /etc/hosts root@172.25.254.250:/etc/hosts

2、检测软件仓库
3、安装docker镜像

1、配置私有仓库,使其支持认证

2、创建目录,目录与域名相同

3、在docker中将hub拷贝给主机master,并将其命名为ca.crt

重启

4、检测

5、在node1、node2中拉取镜像:

# 将master中的后缀为rpm的所有文件全部拷贝到node1、node2中
[root@k8s-master ~]# scp *.rpm root@172.25.254.10:/mnt
[root@k8s-master ~]# scp *.rpm root@172.25.254.20:/mnt# 在node1、node2中查看
[root@k8s-node1 ~]# cd /mnt/
[root@k8s-node1 mnt]# ls
containerd.io-1.7.20-3.1.el9.x86_64.rpm
docker-buildx-plugin-0.16.2-1.el9.x86_64.rpm
docker-ce-27.1.2-1.el9.x86_64.rpm
docker-ce-cli-27.1.2-1.el9.x86_64.rpm
docker-ce-rootless-extras-27.1.2-1.el9.x86_64.rpm
docker-compose-plugin-2.29.1-1.el9.x86_64.rpm
hgfs[root@k8s-node2 ~]# cd /mnt/
[root@k8s-node2 mnt]# ls
containerd.io-1.7.20-3.1.el9.x86_64.rpm
docker-buildx-plugin-0.16.2-1.el9.x86_64.rpm
docker-ce-27.1.2-1.el9.x86_64.rpm
docker-ce-cli-27.1.2-1.el9.x86_64.rpm
docker-ce-rootless-extras-27.1.2-1.el9.x86_64.rpm
docker-compose-plugin-2.29.1-1.el9.x86_64.rpm
hgfs# 在node1、node2安装
[root@k8s-node2 mnt]# dnf install *.rpm -y

2.3 K8s 安装

2.3.1 所有禁用swap和本地解析

[root@k8s-master mnt]# swapon -s
Filename                                Type            Size            Used            Priority
/dev/nvme0n1p2                          partition       5242876         0               -2
[root@k8s-node1 ~]# systemctl  mask dev-nvme0n1p3.device
Created symlink /etc/systemd/system/dev-nvme0n1p3.device → /dev/null.
[root@k8s-node2 ~]# systemctl  mask dev-nvme0n1p3.device
Created symlink /etc/systemd/system/dev-nvme0n1p3.device → /dev/null.

[root@k8s-node2 ~]# swapoff /dev/dm-1
[root@k8s-node2 ~]# swapon -s
[root@k8s-node1 dev]# systemctl status dev-dm\\x2d1.swap
● dev-dm\x2d1.swap - /dev/dm-1Follows: unit currently follows state of dev-mapper-rhel\x2dswap.swapLoaded: loadedActive: active since Thu 2024-09-26 17:59:08 CST; 2 days agoUntil: Thu 2024-09-26 17:59:08 CST; 2 days agoWhat: /dev/dm-1
[root@k8s-node1 dev]# systemctl mask dev-dm\\x2d1.swap
Created symlink /etc/systemd/system/dev-dm\x2d1.swap → /dev/null.
[root@k8s-node1 dev]# vim /etc/fstab
[root@k8s-node1 dev]# swapoff /dev/dm-1
[root@k8s-node1 dev]# swapon -s

2.3.2 依赖的安装

[root@k8s-master mnt]# scp cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm  root@172.25.254.10:/opt/
root@172.25.254.10's password:
cri-dockerd-0.3.14-3.el8.x86_64.rpm           100%   11MB 182.8MB/s   00:00
libcgroup-0.41-19.el8.x86_64.rpm              100%   69KB  45.6MB/s   00:00
[root@k8s-master mnt]#  scp cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm  root@172.25.254.20:/opt/
root@172.25.254.20's password:
cri-dockerd-0.3.14-3.el8.x86_64.rpm           100%   11MB 214.2MB/s   00:00
libcgroup-0.41-19.el8.x86_64.rpm              100%   69KB  69.3MB/s   00:00[root@k8s-node1 ~]# dnf install /opt/*.rpm -y
[root@k8s-node2 ~]# dnf install /opt/*.rpm -y
[root@k8s-node1 ~]# systemctl enable --now cri-docker.service
Created symlink /etc/systemd/system/multi-user.target.wants/cri-docker.service → /usr/lib/systemd/system/cri-docker.service.[root@k8s-node2 ~]# systemctl enable --now cri-docker.service
Created symlink /etc/systemd/system/multi-user.target.wants/cri-docker.service → /usr/lib/systemd/system/cri-docker.service.

[root@k8s-master yum.repos.d]# dnf install kubelet-1.30.0 kubeadm-1.30.0 --downloadonly --downloaddir=/mnt[root@k8s-master yum.repos.d]# scp /etc/yum.repos.d/k8s.repo  root@172.25.254.20:/etc/yum.repos.d/
root@172.25.254.20's password:
k8s.repo                                      100%   98   198.4KB/s   00:00
[root@k8s-master yum.repos.d]# scp /etc/yum.repos.d/k8s.repo  root@172.25.254.10:/etc/yum.repos.d/
root@172.25.254.10's password:
k8s.repo 

[root@k8s-node1 mnt]# dnf install kubelet-1.30.0 kubeadm-1.30.0 --downloadonly --downloaddir=/mnt -y
[root@k8s-node1 mnt]# dnf install kubectl-1.30.0 -y

2.3.3 设置kubectl命令补齐

[root@k8s-master ~]# dnf install bash-completion -y
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master ~]# source ~/.bashrc

2.3.4 在节点安装cri-docker及其master节点拉取K8S所需镜像

[root@k8s-master ~]# kubeadm config images pull \--image-repository  registry.aliyuncs.com/google_containers \
> --kubernetes-version v1.30.0 \
> --cri-socket=unix:///var/run/cri-dockerd.sock
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:v1.11.1
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.9
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.5.12-0
[root@k8s-master ~]# kubeadm config images pull \--image-repository  registry.aliyuncs.com/google_containers \
> --kubernetes-version v1.30.0 \
> --cri-socket=unix:///var/run/cri-dockerd.sock
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:v1.11.1
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.9
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.5.12-0

2.3.5 集群初始化

[root@k8s-master ~]# systemctl status kubelet.service
[root@k8s-master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 \
--image-repository reg.timinglee.org/k8s \
--kubernetes-version v1.30.0 \
--cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >>
~/.bash_profile
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master.timinglee.org NotReady control-plane 4m25s v1.30.0
root@k8s-master ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS
RESTARTS AGE
kube-system coredns-647dc95897-2sgn8 0/1 Pending
0 6m13s
kube-system coredns-647dc95897-bvtxb 0/1 Pending
0 6m13s
kube-system etcd-k8s-master.timinglee.org 1/1 Running
0 6m29s
kube-system kube-apiserver-k8s-master.timinglee.org 1/1 Running
0 6m30s
kube-system kube-controller-manager-k8s-master.timinglee.org 1/1 Running
0 6m29s

2.3.6 节点扩容

# node1与node2相同操作
[root@k8s-node1 ~]# kubeadm join 172.25.254.100:6443 --token
5hwptm.zwn7epa6pvatbpwf --discovery-token-ca-cert-hash
sha256:52f1a83b70ffc8744db5570288ab51987ef2b563bf906ba4244a300f61e9db23 --crisocket=unix:///var/run/cri-dockerd.sock[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master.yee.org Ready control-plane 98m v1.30.0
k8s-node1.yee.org Ready <none> 21m v1.30.0
k8s-node2.yee.org Ready <none> 21m v1.30.0# 建立
[root@k8s-master ~]# kubectl run test --image nginx# 查看状态
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
test 1/1 Running 0 6m29s# 删除
root@k8s-master ~]# kubectl delete pod

相关文章:

K8s简介及环境搭建

一、Kubernetes简介 kubernetes 的本质是一组服务器集群&#xff0c;它可以在集群的每个节点上运行特定的程序&#xff0c;来对节点中的容器进行管理。目的是实现资源管理的自动化&#xff0c;主要提供了如下的主要功能&#xff1a; 自我修复&#xff1a;一旦某一个容器崩溃&a…...

Python对PDF文件页面的旋转和切割

Python对PDF文件页面的旋转和切割 利用Python的.rotate()方法和.mediabox属性对PDF页面进行旋转和切割&#xff0c;最终生成一个PDF。下面结合案例进行说明&#xff0c;本示例中的名为split_and_rotate.pdf文件在practice_files文件夹中&#xff0c; 示例&#xff08;1&#…...

Android 10.0 修改Systemui三键导航栏虚拟按键颜色功能实现

1.前言 在10.0的系统ROM定制化开发中,在对systemui的相关定制化开发中,在某些产品中,需要修改相关的 导航栏三键导航的虚拟按键的颜色,修改掉原来默认的虚拟按键的黑白色,接下来就来实现相关的功能 2.修改Systemui三键导航栏虚拟按键颜色功能实现的核心类 frameworks\ba…...

『网络游戏』客户端使用PESorket发送消息到服务器【14】

上一章服务器已经完成使用PESorket 现在我们将其导出在客户端中使用 生成成功后复制 粘贴到Unity项目中 进入Assets文件夹 粘贴两个.dll 创建脚本:ClientSession.cs 编写脚本: ClientSession.cs 编写脚本:GameStart.cs 将GameStart.cs脚本绑定在摄像机上 运行服务器 运行客户端…...

JVM(学习预热 - 走进Java)(持续更新迭代)

目录 一、彻底认识Java虚拟机 开创世纪&#xff1a;Sun Classic 开创世纪&#xff1a;Exact VM 武林霸主&#xff1a;HotSpot VM 移动端虚拟机&#xff1a;Mobile/Embedded VM “三大”其二&#xff1a;BEA JRockit/IBM J9 VM 软硬结合&#xff1a;BEA Liquid VM/Azul VM…...

43 C 程序动态内存分配:内存区域划分、void 指针、内存分配相关函数(malloc、calloc、realloc、_msize、free)、内存泄漏

目录 1 C 程序内存区域划分 1.1 代码区 (Code Section) 1.2 全局/静态区 (Global/Static Section) 1.3 栈区 (Stack Section) 1.4 堆区 (Heap Section) 1.5 动态内存分配 2 void 指针&#xff08;无类型指针&#xff09; 2.1 void 指针介绍 2.2 void 指针的作用 2.3 …...

编译链接的过程发生了什么?

一&#xff1a;程序的翻译环境和执行环境 在 ANSI C 的任何一种实现中&#xff0c;存在两个不同的环境。 第 1 种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。 第 2 种是执行环境&#xff0c;它用于实际执行代码 也就是说&#xff1a;↓ 1&#xff1…...

【D3.js in Action 3 精译_028】3.4 小节 DIY 实战:使用 Observable 在线绘制 D3 条形图

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…...

【Linux】 TCP短服务编写和守护进程

文章目录 TCP 短服务编写流程进程组和会话和守护进程 TCP 短服务编写流程 TCP服务器是面向连接的&#xff0c;客户端在发送数据之前需要先与服务器建立连接。 因此&#xff0c;TCP服务器需要能够监听客户端的连接请求。为了实现这一功能&#xff0c;需要将TCP服务器创建的套接字…...

自学数据库-MYSQL

自学数据库-MYSQL 一.表和视图1.表1.1 表创建1.2 索引1.2.1 这里是废话,不感兴趣的可以直接更具目录的跳过这里的内容1.2.1.1 索引是什么1.2.1.2 相关数据结构&#xff1a;二叉树、红黑树、B-Tree、BTree、Hash…①普通索引②唯一索引③全文索引④组合索引 1.3 表数据操作(更新…...

机器学习——多模态学习

多模态学习&#xff1a;机器学习领域的新视野 引言 多模态学习&#xff08;Multimodal Learning&#xff09;是机器学习中的一个前沿领域&#xff0c;它涉及处理和整合来自多个数据模式&#xff08;如图像、文本、音频等&#xff09;的信息。随着深度学习的蓬勃发展&#xff0…...

​ceph掉电后无法启动osd,pgs unknown

处理办法&#xff1a; 只有1个osd,单副本&#xff0c;掉电损坏osd&#xff0c;只能考虑重建pg&#xff0c;丢失部分数据了。生产环境务必考虑2&#xff0c;3副本设计。避免掉电故障风险。 掉电后osdmap丢失无法启动osd的解决方案 - 武汉-磨渣 - 博客园 https://zhuanlan.zhih…...

HTML5实现古典音乐网站源码模板1

文章目录 1.设计来源1.1 网站首页1.2 古典音乐界面1.3 著名人物界面1.4 古典乐器界面1.5 历史起源界面2.效果和源码2.1 动态效果2.2 源代码源码下载万套模板,程序开发,在线开发,在线沟通作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/142…...

快速生成单元测试

1. Squaretest插件 2. 依赖 <dependency><groupId>junit</groupId>...

WebGL系列教程十一(光照原理及Blinn Phong着色模型)

快速导航&#xff08;持续更新中&#xff09; WebGL系列教程一&#xff08;开篇&#xff09; WebGL系列教程二&#xff08;环境搭建及着色器初始化&#xff09; WebGL系列教程三&#xff08;使用缓冲区绘制三角形&#xff09; WebGL系列教程四&#xff08;绘制彩色三角形&…...

《ASP.NET Web Forms 实现短视频点赞功能的完整示例》

在现代Web开发中&#xff0c;实现一个动态的点赞功能是非常常见的需求。本文将详细介绍如何在ASP.NET Web Forms中实现一个视频点赞功能&#xff0c;包括前端页面的展示和后端的处理逻辑。我们将确保点赞数量能够实时更新&#xff0c;而无需刷新整个页面。 技术栈 ASP.NET We…...

Linux SSH服务

Linux SSH&#xff08;Secure Shell&#xff09;服务是一种安全的远程登录协议&#xff0c;用于在Linux操作系统上远程登录和执行命令。它提供了加密的通信通道&#xff0c;可以在不安全的网络环境中安全地进行远程访问。 SSH服务在Linux系统中通常使用OpenSSH软件包来实现。它…...

MySQL--视图(详解)

目录 一、前言二、视图2.1概念2.2语法2.3创建视图2.3.1目的 2.4查看视图2.5修改数据2.5.1通过真实表修改数据&#xff0c;会影响视图2.5.2通过修改视图&#xff0c;会影响基表 2.6注意2.7 删除视图2.8 视图的优点 一、前言 欢迎大家来到权权的博客~欢迎大家对我的博客进行指导&…...

Javascript 普通非async函数调用async函数

假设我们有一个异步函数 async function asyncFunction() {console.log("开始执行异步函数");await new Promise(resolve > setTimeout(resolve, 1000)); // 模拟异步操作console.log("异步函数执行完毕"); } 我们在调用这个异步函数时&#xff0c;比…...

【LeetCode】修炼之路-0004-Median of Two Sorted Arrays【python】

题目 Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays. The overall run time complexity should be O(log (mn)). Example 1: Input: nums1 [1,3], nums2 [2] Output: 2.00000 Explanation: merged…...

C++面试速通宝典——10

177. #include <filename> 和 #include "filname.h" 有什么区别&#xff1f; ‌‌‌‌  对于 #include <filename> &#xff0c; 编译器从标准库路径开始搜索 filename.h。 ‌‌‌‌  对于 #include "filename.h&#xff0c;编译器从用户的工作…...

肺腺癌预后新指标:全切片图像中三级淋巴结构密度的自动化量化|文献精析·24-10-09

小罗碎碎念 本期这篇文章&#xff0c;我去年分享过一次。当时发表在知乎上&#xff0c;没有标记参考文献&#xff0c;配图的清晰度也不够&#xff0c;并且分析的还不透彻&#xff0c;所以趁着国庆假期重新分析一下。 这篇文章的标题为《Computerized tertiary lymphoid structu…...

基于jmeter+perfmon的稳定性测试记录

1. 引子 最近承接了项目中一些性能测试的任务&#xff0c;因此决定记录一下&#xff0c;将测试的过程和一些心得收录下来。 说起来性能测试算是软件测试行业内&#xff0c;有些特殊的部分。这部分的测试活动&#xff0c;与传统的测试任务差别是比较大的&#xff0c;也比较依赖…...

前沿论文 M5Product 组会 PPT

对比学习&#xff08;Contrast learning&#xff09;&#xff1a;对比学习是一种自监督学习方法&#xff0c;用于在没有标签的情况下&#xff0c;通过让模型学习哪些数据点相似或不同来学习数据集的一般特征。假设一个试图理解世界的新生婴儿。在家里&#xff0c;假设有两只猫和…...

navicat~导出数据库密码

当我们mysql密码忘记了&#xff0c;而在navicat里有记录&#xff0c;我们应该如何导出这个密码呢&#xff1f; 第一步:文件菜单&#xff0c;导出链接&#xff0c;导出连接获取到 connections.ncx 文件 这里需要勾选 导出密码&#xff01;&#xff01;&#xff01; 不然导出的文…...

【Java】 —— 数据结构与集合源码:Vector、LinkedList在JDK8中的源码剖析

目录 7.2.4 Vector部分源码分析 7.3 链表LinkedList 7.3.1 链表与动态数组的区别 7.3.2 LinkedList源码分析 启示与开发建议 7.2.4 Vector部分源码分析 jdk1.8.0_271中&#xff1a; //属性 protected Object[] elementData; protected int elementCount;//构造器 public …...

YOLOv5改进——添加SimAM注意力机制

目录 一、SimAM注意力机制核心代码 二、修改common.py 三、修改yolo.py ​三、建立yaml文件 四、验证 一、SimAM注意力机制核心代码 在models文件夹下新建modules文件夹&#xff0c;在modules文件夹下新建一个py文件。这里为simam.py。复制以下代码到文件里面。 import…...

SQL 自学:表别名的运用与对被联结表使用聚集函数

一、表别名的概念与作用 &#xff08;一&#xff09;表别名的定义 表别名是为表指定的临时名称&#xff0c;在 SQL 查询中使用别名可以简化表名&#xff0c;提高代码的可读性和可维护性。当表名较长或在复杂的查询中多次引用表时&#xff0c;使用表别名可以避免重复输入冗长的…...

jmeter学习(2)变量

1&#xff09;用户定义的变量 路径&#xff1a;添加-》配置元件-》用户定义的变量 用户定义的变量是全局变量&#xff0c;可以跨线程组被调用&#xff0c;但在启动运行时获取一次值&#xff0c;在运行过程中不再动态获取值。 注意的是&#xff0c;如果在某个线程组定义了全…...

【C#生态园】C#文件压缩库全面比较:选择最适合你的库

从核心功能到API概览&#xff1a;深度解析六大C#文件压缩库 前言 在软件开发过程中&#xff0c;文件的压缩和解压缩是一个常见的需求。针对C#开发者而言&#xff0c;选择合适的文件压缩库可以极大地简化开发工作。本文将介绍几个常用的C#文件压缩库&#xff0c;包括其核心功能…...