【2024】k8s集群 图文详细 部署安装使用(两万字)
目录💻
- 一、前言
- 二、下载依赖配置环境
- 1、配置系统环境
- 1.1、配置桥接网络
- 1.1.1、parallels desktop配置
- 1.1.2、VMware配置
- 1.2、配置root用户登陆
- 2、环境配置安装下载
- 2.1、安装ipset和ipvsadm
- 2.2、关闭SWAP分区
- 3、配置Containerd容器
- 3.1、下载安装Containerd
- 3.2、创建&修改配置文件
- 3.3、启动Containerd&开机自启
- 4、添加K8S集群组件
- 4.1、修改下载源
- 4.2、安装组件
- 5、克隆服务器
- 5.1、通过parallels desktop克隆
- 5.2、通过VMware克隆
- 6、主机配置
- 6.1、设置静态ip
- 6.2、修改主机名
- 6.3、主机名解析ip
- 6.4、时间同步
- 6.5、配置内核转发、网桥过滤配置
- 三、部署集群
- 1、配置部署k8s集群
- 1.1、集群初始化
- 1.2、准备kubectl配置文件
- 1.2、添加从节点
- 2、安装k8s网络插件Calico
- 2.1、执行安装tigera-operator
- 2.2、配置custom-resources
- 2.3、错误解达。
- 四、测试使用
- 1、安装可视化Web工具:Kuboard v3
- 1.1、使用kubectl安装(master01节点执行)
- 1.1.2、常见错误
- 1.2、web配置
- 2、部署Nginx服务
- 2.1、使用Kuboard部署
- 2.2、使用yaml方式创建
一、前言
因为我只有一台服务器,我使用的是,所有我采用的是通过安装虚拟机的方式实现集群搭建,先把需要的配置环境拉取下来,然后再通过虚拟机的克隆的方式直接把配置克隆到新的服务器上,减少重复下载。
通过在ubuntu服务器上安装VMware和在MAC上安装parallels desktop都有部署成功,安装虚拟机的实体机配置内存需要够,并且需要可以连接🛜,因为需要下载一些配置依赖,因为是安装k8s集群需要安装三台ubuntu容器。当然如果是有多台服务器的话直接把安装命令都执行一遍就行
下面是我使用的配置:
信息 | 配置 |
---|---|
节点主机 | Ubuntu20.4 / 22.4 |
K8S版本 | 1.28.1 |
配置 | 三台集群(内存:2G、磁盘:30G) |
SSH连接工具 | WindTerm / Tabby |
宿主机 | Ubuntu24.4 / M2 |
虚拟机工具 | VMWaer / parallels desktop |
ubuntu镜像(注意看后缀arm是 苹果的Apple M,Intel 的用amd): https://pan.baidu.com/s/16f1lzIqFOHlsyfzVV3lv9A?pwd=5p8a 提取码: 5p8a
WindTerm(ssh连接工具下载地址):https://github.com/kingToolbox/WindTerm/releases
二、下载依赖配置环境
1、配置系统环境
1.1、配置桥接网络
因为我们实际开发中肯定是把k8s部署在服务器上的嘛,所以需要把虚拟机内服务器的网络改为同物理机在同一网段的。所以需要在 “桥接网络”选项下的列表中选择虚拟机将要桥接的物理适配器。否则同一局域网的其他物理机都没法范围到这些虚拟机的ip
1.1.1、parallels desktop配置
- 右击对应的虚拟机,点击配置,选择硬件中的网络,修改源为桥接网络中的默认适配器,如果有多个网络,则直接选择你想要用于外部连接的那个网络就行
- 通过ifconfig命令查看ip是否改为了外表局域网同一网段了
1.1.2、VMware配置
-
先点击网络适配器
-
选择第一个,然后保存退出
-
再右击每个主机服务器,点击设置(Settings)
-
选择网络,选择桥接网络,点击确认保存,然后就可以到对应的主机查看IP了
1.2、配置root用户登陆
在创建虚拟机的时候需要先添加ssh连接,但我们创建后,是不能直接用root用户直接登陆的,虽然可以通过sudo su
转为root,但每次都要转,也麻烦,可以通过修改配置,让直接通过root用户进行ssh登陆。
-
首先通过ssh工具连接上虚拟机,账号密码就是我们创建的时候设置的那个账号,然后通过
sudo su
切换为root管理员用户
-
修改/etc/ssh/sshd_config文件配置
修改下面ssh的配置文件的,34行左右的位置(右下角可以看行数),把标注的三行的注释打开,并且把第34行改为 yesvim /etc/ssh/sshd_config
·
-
重制root用户的密码
把root用户的密码改为自己需要的sudo passwd root
-
重启ssh服务
service ssh restart
-
其他
如果是没有安装ssh命令,可以通过#更新软件包 sudo apt update #安装ssh sudo apt install openssh-server #安装ifconfig命令包(刚创建的虚拟机可能会没有) sudo apt install net-tools
2、环境配置安装下载
下面的步骤,如果是使用的下面的WindTerm的截图代表是集群的每个容器都需要执行的,如果是使用的上面的tabby的截图代表是只有master节点需要执行就行。
因为他们的配置一样,我免得都下载一遍,所以我直接一个下载好,然后通过克隆的方式直接克隆到其他的节点去,这样也避免出现一些不一样的东西
2.1、安装ipset和ipvsadm
它们在 Kubernetes (k8s) 中用于网络管理和负载均衡。
-
首先执行安装
apt-get install ipset ipvsadm
执行的时候需要你输入
y
确认,确认就行
-
然后执行配置 ipvsadm 模块,用于开机自启动的,可以使用
vi /etc/modules-load.d/ipvs.conf
查看是否配置成功cat << EOF | tee /etc/modules-load.d/ipvs.conf ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack EOF
-
因为本次也需要启动,所以需要在配置一个脚本用于本次启动的
配置脚本文件cat << EOF | tee ipvs.sh #!/bin/sh modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack EOF
执行刚刚创建的脚本
sh ipvs.sh
-
通过下面的命令查看是否配置成功
lsmod | grep ip_vs
如下图,就表示加载成功了
2.2、关闭SWAP分区
直接通过修改/etc/fstab
文件,永久关闭SWAP分区,避免重启时打开
-
永久关闭
vim /etc/fstab
打开后,把最后一行
/swap.img
开头的注释调就行
修改swap需要重启才能使得配置文件生效,因为现在就需要用,可以直接重启,也可以先临时关闭掉 -
临时关闭
swapoff -a
-
查看是否关闭成功
free -m
变0了表示关闭了
3、配置Containerd容器
Containerd 在 Kubernetes 中扮演了容器运行时的角色,负责创建、管理和运行容器,提供了一个标准的容器运行时环境和安全特性。
3.1、下载安装Containerd
-
下载Containerd,因为是在github上所以如果没有外网可能会下载不成功,我上面的百度网盘有放下载好的(注意看后缀arm是 苹果的Apple M,Intel 的用amd),直接导入到服务器里面去就行,如果自己下载也是,别下载错了
wget https://github.com/containerd/containerd/releases/download/v1.7.5/cri-containerd-1.7.5-linux-amd64.tar.gz
-
安装 Containerd
解压后会自动安装到指定位置去#解压文件 tar xf cri-containerd-1.7.5-linux-amd64.tar.gz -C / #查看安装 containerd --version
3.2、创建&修改配置文件
-
创建配置文件
#创建配置文件目录 mkdir /etc/containerd #生成默认的配置文件 containerd config default > /etc/containerd/config.toml #查看是否生成成功 ls /etc/containerd
-
修改配置文件
vim /etc/containerd/config.toml
-
修改第65行sanbox_image的值改为
registry.aliyuncs.com/google_containers/pause:3.9
,改为阿里的镜像地址和版本号。(镜像地址也可以不修改,只需要修改版本号也行,需要和后面–>8.1、集群初始化介绍的kubeadm-config.yaml
文件的一致就行)
-
需要137行的
false
改为true
修改好后保存退出
3.3、启动Containerd&开机自启
-
执行开机启动,并且现在就启动
systemctl enable --now containerd
-
验证是否启动成功
systemctl status containerd
4、添加K8S集群组件
4.1、修改下载源
-
添加阿里的软件源
echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
-
验证是否添加成功
ls /etc/apt/sources.list.d
-
更新软件源
apt-get update
这个时候会失败,因为没有公钥,缺少 GPG 的key导致的
-
把公钥添加到服务器
上面图片箭头的B53DC80D13EDEF05
就是你的公钥,需要添加自己的apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B53DC80D13EDEF05
导入之后就会更新成功
apt-get update
4.2、安装组件
下面三个是k8s必要的组件,
kubeadm
:创建、升级和管理 Kubernetes 集群kubelet
:管理节点上的容器生命周期kubectl
:管理和调试 Kubernetes 应用程序
- 执行安装
安装的时候需要y,y就行apt-get install kubeadm=1.28.1-00 kubelet=1.28.1-00 kubectl=1.28.1-00
上面是我安装的版本,如果想安装其他版本可以用下面的命令查看,如果不加版本号,会下载最新的
-
查看版本
apt-cache madison kubeadm apt-cache madison kubelet apt-cache madison kubectl
-
查看是否安装成功
kubeadm version kubelet --version kubectl version
-
锁定版本
安装好后需要需要锁定版本,避免自动更新造成的一些问题apt-mark hold kubeadm kubelet kubectl
5、克隆服务器
因为我们是要建立k8s集群嘛,所以需要有三台服务器用做搭建集群,
如果是本身有多台服务器的,并且前面的命令都在全部服务器执行过了的,就可以跳过这一步。
克隆服务器在VMware和parallels desktop执行都比较简单
5.1、通过parallels desktop克隆
- 先把服务器关闭
- 右击你刚刚下载的好配置依赖的容器,点击克隆
- 定义名称,点击确认
重复两次克隆两台从服务器出来
5.2、通过VMware克隆
-
克隆
先关闭虚拟机,然后右击点击
-
然后一路next确认
然后等待克隆完成,启动
6、主机配置
6.1、设置静态ip
-
复制配置文件
避免配置错了无法恢复。可能有些版本的配置文件不是叫00-installer-config.yaml
这个名字,反正修改/etc/netplan
下的那个文件就行cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak
-
修改配置文件
vim /etc/netplan/00-installer-config.yaml
-
配置文件(三台虚拟机服务器都需要配置本虚拟机的ip)
需要修改下面文件的addresses: [192.168.5.55/24]
和via: 192.168.5.1
,!!!注意不要有多余空格- addresses需要把ip改为本服务器的
- via:网段改为自己的,网段通过
route -n
命令查看
-
安装的arm架构的
# This is the network config written by 'subiquity' network:version: 2ethernets:enp0s5:dhcp4: noaddresses: [192.168.5.55/24]routes:- to: defaultvia: 192.168.5.1nameservers:addresses: [119.29.29.29,114.114.114.114,8.8.8.8]
-
安装的amd架构的
network:version: 2renderer: networkdethernets:ens33:dhcp4: noaddresses:- 192.168.3.170/24routes:- to: defaultvia: 192.168.3.1nameservers:addresses: [119.29.29.29,114.114.114.114,8.8.8.8]
-
配置生效
netplan apply
配置好之后可以ping一下局域网的其他物理机的网络,看是否可以ping通
6.2、修改主机名
三台服务器分别执行
-
master01执行
hostnamectl set-hostname master01
-
worker01执行
hostnamectl set-hostname worker01
-
worker02执行
hostnamectl set-hostname worker02
然后
exit
退出当前用户,在重新登陆一下就可以了,可以看名字都一句以及已经改为了对应的名字
6.3、主机名解析ip
全部都需要执行(!!!!这个要改为自己集群的主机ip)
cat >> /etc/hosts << EOF
192.168.5.53 mater01
192.168.5.54 worker01
192.168.5.55 worker02
EOF
通过WindTerm的频道功能,可以实现同频道中,只要一个页面输入,其他的都会同步输入
再执行查看是否写入
cat /etc/hosts
6.4、时间同步
-
更改时区为上海时区
timedatectl set-timezone Asia/Shanghai
-
安装ntpdate
ntpdate是一个用于同步系统时钟与NTP服务器的工具apt-get install ntpdate
-
通过ntpdate命令同步时间
ntpdate time1.aliyun.com
-
通过定时任务去实现定时同步
crontab -e
中间会让你选择输入
2
:
把下面这行加入进去0 */1 * * * ntpdate time1.aliyun.com
6.5、配置内核转发、网桥过滤配置
- 配置依赖模块到 /etc/modules-load.d/k8s.conf,用于实现开启自动加载
-
overlay: 这是 OverlayFS 的内核模块,用于支持 Docker 和 Kubernetes 等容器化技术。
-
br_netfilter: 这是 Linux 内核中的网桥过滤器模块,用于支持 Kubernetes 的网络功能。
cat << EOF | tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF
配置完成之后,本次启动这两个配置,因为配置上配置后期开机启动的,当下也需要先启动
modprobe overlay
modprobe br_netfilter
2. 查看是否启动成功lsmod | egrep "overlay"
lsmod | egrep "br_netfilter"
-
转发配置到k8s.conf文件中
cat << EOF | tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF
-
加载内核参数:
sysctl --system
-
然后在查看是否加载成功
sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
和net.ipv4.ip_forward_update_priority = 1
都变为1了表示加载成功
三、部署集群
1、配置部署k8s集群
1.1、集群初始化
下面的只需要master节点
的主机执行,其他的两个从机不用执行
- 创建kubeadm-config配置文件
把配置文件打印到本地,用于编辑kubeadm config print init-defaults > kubeadm-config.yaml
- 修改文件
修改拉下来的配置文件vim kubeadm-config.yaml
-
修改
advertiseAddress
的ip为mater01节点的ip -
修改
name
为mater01节点的主机名 -
修改
imageRepository
仓库地址为阿里云的镜像仓库registry.aliyuncs.com/google_containers
。因为前面/etc/containerd/config.toml
文件修改了,如果前面的文件镜像仓库地址没修改,这个地方也可以不修改 -
修改
kubernetesVersion
版本号,前面下载的是什么版本就写什么版本 -
dnsDomain
表示DNS域名,可以不修改,但一个局域网内只能有一个相同的,如果有两个k8s集群用的一样的DNS名字就会冲突,一般推荐修改为公司的域名 -
在
networking
中的 serviceSubnet 后面添加podSubnet: 10.244.0.0/16
-
在最后面在添加下面的配置
--- kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 cgroupDriver: systemd
红色的是修改,绿色的是添加
-
重启服务
修改完,分别重启containerd 和 kubeletsystemctl restart containerd systemctl restart kubelet
-
下载镜像
下载k8s所需要的镜像到主节点
--image-repository
:指定镜像仓库--kubernetes-version
:版本号,改为你的k8s版本kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version v1.28.1
-
执行初始化
kubeadm init --config kubeadm-config.yaml
出现下面的,就表示初始化成功了
1.2、准备kubectl配置文件
-
添加配置文件
把上面输出的内容在master
节点执行一遍mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
-
查看节点
kubectl get nodes
1.2、添加从节点
复制刚刚自己初始化的地址,到从节点执行,也就是另外两个worker02节点
(!!!这个是我的,需要复制自己的)
-
复制token
kubeadm join 192.168.5.53:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:55917a9c22cb444e83ce19517b8b9f1856401cf3ca11df4e661978fd9eed222e
-
查看
在到主节点进行查看kubectl get nodes
在查看,就可以看到刚刚加入的worker节点了
2、安装k8s网络插件Calico
k8s常用的网络插件主要有
- Flannel:Flannel是Kubernetes官方推荐的网络插件之一。它提供了一种基于UDP的网络通信方式,支持多租户和多网段。
- Calico:Calico是另一个流行的K8S网络插件。它提供了一种基于BGP的网络通信方式,支持多租户和多网段。
- Weave:Weave是一种基于 Overlay 网络的K8S网络插件。它提供了一种简单易用的方式来管理集群中的网络通信。
- Cilium:Cilium是一种基于 Linux 内核的K8S网络插件。它提供了一种高性能的网络通信方式,支持多租户和多网段。
- OpenVSwitch:OpenVSwitch是一种基于开源的K8S网络插件。它提供了一种高性能的网络通信方式,支持多租户和多网段。
2.1、执行安装tigera-operator
-
下载
我这安装的是3.26.1,如果需要安装其他版本,直接改版本号就行,其他目录都是一样的kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
-
查看是否安装成功
tigera-operator
kubectl get ns
-
查看pod状态
如果是Runing
状态就代表成功了,如果不是就代表有问题kubectl get pods -n tigera-operator
2.2、配置custom-resources
custom-resources.yaml 是一个用于配置 Kubernetes 的自定义资源定义(CRD)文件
-
先拉取下来
wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
-
修改配置
修改配置网段,这个网段是前面初始化时设置的podSubnet
的网段cidr: 10.244.0.0/16
vim custom-resources.yaml
-
拉取镜像
因为一些原因,选择不能下载,需要通过一些大佬弄的映射加速仓库去拉。
!!!全部节点都要拉取。
如果下面的地址不行,可以到里面去找最新的
https://github.com/DaoCloud/public-image-mirror/issues/2328ctr image pull docker.1panel.live/calico/cni:v3.26.1 ctr image pull docker.1panel.live/calico/pod2daemon-flexvol:v3.26.1 ctr image pull docker.1panel.live/calico/node:v3.26.1 ctr image pull docker.1panel.live/calico/kube-controllers:v3.26.1 ctr image pull docker.1panel.live/calico/typha:v3.26.1 ctr image pull docker.1panel.live/calico/node-driver-registrar:v3.26.1 ctr image pull docker.1panel.live/calico/csi:v3.26.1
-
查看是否下次完成
ctr image list
要确保全部都是
application/vnd.docker.distribution.manifest.list.v2+json
没有出现 Init:ErrImagePull
-
应用配置
下载完成之后执行下面命令,应用配置kubectl create -f custom-resources.yaml
-
查看命名空间
kubectl get ns
看到
calico-system
代表ok了
-
查看pod
kubectl get pods -n calico-system
大概等个几分钟,都是
Runing
,代表成功 -
再查看节点信息,就会发现状态已经变成 Ready 状态
kubectl get nodes
到这一步,说明就是全部安装完成了
2.3、错误解达。
如果哪个节点有问题
执行下面命令直接删除掉k8s相关的东西,然后重新安装三个组件,在去重新通过链接加入就行。
#重置 Kubernetes 集群,它会删除所有与 Kubernetes 相关的配置文件、数据和组件。
sudo kubeadm reset
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/*
rm -rf /root/.kube
rm -rf /etc/kubernetes/*ipvsadm -C
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
四、测试使用
1、安装可视化Web工具:Kuboard v3
1.1、使用kubectl安装(master01节点执行)
发生错误可以查看kuboard官网
https://press.demo.kuboard.cn/install/v3/install-in-k8s.html
-
下载配置文件
wget https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml
-
执行创建
kubectl apply -f vim kuboard-v3-swr.yaml
如果镜像拉取不下来可以修改下镜像仓库地址改为我的阿里云的进行仓库地址
vim kuboard-v3-swr.yaml
# 地址: registry.cn-hangzhou.aliyuncs.com/zhengfp_images/kuboard-agent registry.cn-hangzhou.aliyuncs.com/zhengfp_images/etcd-host:3.4.16-1 registry.cn-hangzhou.aliyuncs.com/zhengfp_images/kuboard:v3 registry.cn-hangzhou.aliyuncs.com/zhengfp_images/questdb:6.0.4
分别把地址放入下面对应的地方
继续执行部署kubectl apply -f vim kuboard-v3-swr.yaml
-
查看部署
kubectl get pods -n kuboard
都是
Running
即可 -
web测试
-
在浏览器打开链接
http://节点IP:30080
-
输入初始用户名和密码,并登录
- 用户名:
admin
- 密码:
Kuboard123
- 用户名:
1.1.2、常见错误
通过kubectl get pods -n kuboard
查看pod,看哪个pod不成功
查看对应的错误
powershell kubectl logs kuboard-v3-7979bc788f-hln74 -n kuboard
desc = "transport: Error while dialing dial tcp: missing address"
错误表明 Kuboard 无法连接到 etcd。
kuboard-v3-xxxxx
的容器出现CrashLoopBackOff
的状态,可能的原因有
需要执行
前面两个错误都是执行下面的命令
kubectl label nodes mater01 k8s.kuboard.cn/role=etcd
1.2、web配置
-
刚进去会有一个错误的集群,删除掉,点击添加集群
-
输入集群名称和描述
-
复制kubeConfig
在master01节点执行cat ~/.kube/config
命令,把全部内容复制到kubeConfig框内,点击确认
如图显示,代表成功
2、部署Nginx服务
2.1、使用Kuboard部署
-
在首页点击集群,选择命名空间
-
填写信息
左边选择,名称空间>常用操作>创建工作负载,然后再填写基本信息
-
填写容器信息
阿里云镜像地址registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
填写好之后点击上面的保存>应用>确认>
-
查看
5.访问对应的节点进行测试
2.2、使用yaml方式创建
-
创建yaml
vim nginx-deployment.yaml
-
编写配置
--- apiVersion: apps/v1 kind: Deployment metadata:name: nginxweb # 部署的名称 spec:replicas: 2 # 设置副本数量为2selector:matchLabels:app: nginxweb1 # 用于选择匹配的Pod标签template:metadata:labels:app: nginxweb1 # Pod的标签spec:containers:- name: nginxwebc # 容器名称image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest # 镜像拉取地址,换成阿里云的,不然会拉取失败imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地没有就拉取ports:- containerPort: 80 # 容器内部监听的端口 --- apiVersion: v1 kind: Service metadata:name: nginxweb-service # 服务的名称 spec:externalTrafficPolicy: Cluster # 外部流量策略设置为集群selector:app: nginxweb1 # 用于选择匹配的Pod标签ports:- protocol: TCP # 使用TCP协议port: 80 # 服务暴露的端口targetPort: 80 # Pod中容器的端口nodePort: 30080 # 在每个Node上分配的端口,用于外部访问type: NodePort # 服务类型,使用NodePort
-
应用配置
kubectl apply -f nginx-deployment.yaml
-
检查是否成功
-
查看
pod
kubectl get pods
-
查看
service
service 可以查看到对应pod的名称还有端口映射
kubectl get service
-
查看访问ip
curl http://10.244.5.3 curl http://10.244.30.69
- 通过对应的节点IP进行测试
⌨️码字不易,觉得可以的话可以一键三连一下!!!
相关文章:
【2024】k8s集群 图文详细 部署安装使用(两万字)
目录💻 一、前言二、下载依赖配置环境1、配置系统环境1.1、配置桥接网络1.1.1、parallels desktop配置1.1.2、VMware配置 1.2、配置root用户登陆 2、环境配置安装下载2.1、安装ipset和ipvsadm2.2、关闭SWAP分区 3、配置Containerd容器3.1、下载安装Containerd3.2、创…...
CSS 伪类和伪元素
也是选择器的一种,被称为伪类和伪元素。这一类选择器的数量众多,通常用于很明确的目的。 伪类 什么是伪类 伪类是选择器的一种,它用于选择处于特定状态的元素。 比如当它们是这一类型的第一个元素时(:first-child)&…...
某动一面——算法题
function restoreIpAddresses(s) {const result = [];function backtrack(start, path) {// 如果剩余的字符数不符合IP地址的要求,则剪枝if (s.length - start > (4 - path.length) * 3) return;if (s.length - start < (4 - path.length)) return;// 当找到了四段IP地址…...
kubernetes中共享内存和内存区别
计算机科学中的内存与共享内存 在计算机科学中,“内存”和“共享内存”是两个不同的概念,但它们之间有着密切的关系。为了更好地理解这两个概念及其相互关系,我们可以分别解释一下: 内存 (Memory) 内存通常指的是计算机系统的主…...
JavaWeb04-MyBatis与Spring结合
目录 前言 一、MyBatis入门(MyBatis官网) 1.1 创建mybatis项目(使用spring项目整合式方法) 1.2 JDBC 1.3 数据库连接池 1.4 实用工具:Lombok 二、MyBatis基础操作 2.1 准备工作 2.2 导入项目并实现操作 2.3 具…...
Mybatis-springBoot
MyBatis 是一个流行的 Java 持久层框架,它简化了与关系型数据库的交互。通过将 SQL 语句与 Java 代码进行映射,MyBatis 提供了一种方便、灵活的方式来执行数据库操作。它支持动态SQL、缓存机制和插件扩展,使得开发人员能够更高效地编写和管理…...
【中国数据库前世今生】数据存储管理的起源与现代数据库发展启蒙
记录开启本篇的目的: 作为1名练习时长2年半的DBA,工作大部分时间都在和数据库打交道,包括Oracle,Mysql,Postgresql,Opengauss等国内外数据库。但是对数据库的发展史却知之甚少。 正好腾讯云开发者社区正在热播:【纪录片】中国数据库前世今生,借此机会了解…...
拉卡拉上半年营收29.82亿元 外卡、数字化服务提升业绩增长空间
8月9日晚,拉卡拉(300773.SZ)发布2024年半年业绩报告。在国内经济延续恢复向好态势、国内消费市场规模持续增长的背景下,拉卡拉积极推进“推广数字支付、共享数字科技、兑现数据价值”的经营战略,上半年公司实现营业收入29.82亿元,…...
数学建模——启发式算法(蚁群算法)
算法原理 蚁群算法来自于蚂蚁寻找食物过程中发现路径的行为。蚂蚁并没有视觉却可以寻找到食物,这得益于蚂蚁分泌的信息素,蚂蚁之间相互独立,彼此之间通过信息素进行交流, 从而实现群体行为。 蚁群算法的基本原理就是蚂蚁觅食的过程…...
【Pytorch实用教程】在做模型融合时非常关键的代码:nn.Identity()详解
文章目录 nn.Identity()基础介绍主要用途示例代码以ResNet为例介绍 self.resnet.fc = nn.Identity() 的作用1. **背景:ResNet 模型结构**2. **代码 `self.resnet.fc = nn.Identity()` 的作用**3. **为什么使用 `nn.Identity()`**4. **示例代码**nn.Identity()基础介绍 nn.Ide…...
【开源力荐】一款基于web的可视化视频剪辑工具
嗨, 大家好, 我是徐小夕. 之前一直在社区分享零代码&低代码的技术实践,也陆陆续续设计并开发了多款可视化搭建产品,比如: H5-Dooring(页面可视化搭建平台)V6.Dooring(可视化大屏搭建平台)橙…...
鸿萌数据恢复服务: 如何修复 SQL Server 数据库错误 829?
天津鸿萌科贸发展有限公司从事数据安全服务二十余年,致力于为各领域客户提供专业的数据恢复、数据备份、网络及终端数据安全等解决方案与服务。 同时,鸿萌是众多国际主流数据恢复软件(Stellar、UFS、R-Studio、ReclaiMe Pro 等)的授权代理商,…...
OpenCV图像处理——按最小外接矩形剪切图像
引言 在图像处理过程中,提取感兴趣区域(ROI)并在其上进行处理后,往往需要将处理后的结果映射回原图像。这一步通常涉及以下几个步骤: 找到最小外接矩形:使用 cv::boundingRect 或 cv::minAreaRect 提取感兴…...
《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(4)-再识Wireshark
1.简介 按照以前的讲解和分享路数,宏哥今天就应该从外观上来讲解WireShark的界面功能了。 2.软件界面 由上到下依次是标题栏、主菜单栏、主菜单工具栏、显示过滤文本框、打开区、最近捕获并保存的文件、捕获区、捕获过滤文本框、本机所有网络接口、学习区及用户指…...
调用yolov3模型进行目标检测
要调用已经训练好的YOLOv3模型对图片进行检测,需要完成以下几个步骤: 加载预训练模型:从预训练的权重文件中加载模型。准备输入图片:将图片转换为模型所需的格式。进行推理:使用模型对图片进行推理,得到检…...
linux文件——重定向原理——dup、重定向与execl、VFS
前言:本篇讲解linux下的重定向相关内容。 在本篇中, 博主将会带着友友们一边实验, 一边探索底层原理。 通过本篇的学习, 友友们将会了解到重定向是如何实现的, 重定向的本质是什么, 重定向和进程替换之间的…...
【STM32 FreeRTOS】任务
使用 RTOS 的实时应用程序可以被构建为一组独立的任务。每个任务在自己的上下文中执行,不依赖于系统内的其他任务或 RTOS 调度器本身。在任何时间点,应用程序中只能执行一个任务,实时 RTOS 调度器负责决定所要执行的任务。因此, R…...
Java面试--框架--Spring MVC
Spring MVC 目录 Spring MVC1.spring mvc简介2.spring mvc实现原理2.1核心组件2.2工作流程 3.RESTful 风格4.Cookie,Session4.1 会话4.2 保存会话的两种技术 5.拦截器5.1过滤器、监听器、拦截器的对比5.2 过滤器的实现5.3 拦截器基本概念5.4 拦截器的实现 1.spring …...
土壤水分监测系统的工作原理
TH-TS200土壤水分监测系统是一种在地球科学、农学等领域广泛应用的分析仪器,它主要用于监测土壤中的水分含量,为农业生产、水资源管理、环境保护等提供重要数据支持。通常包括数据采集器、土壤水分传感器、土壤温度传感器(部分系统配备)、计算机软件以及…...
k8s学习--如何控制pod调度的位置
文章目录 一、Pod 调度基础二、通过节点选择器 (Node Selector) 控制调度三、使用节点亲和性 (Node Affinity)四、使用污点和容忍 (Taints and Tolerations)五、Pod 反亲和性 (Pod Anti-Affinity) 总结 在 Kubernetes (K8s)中,Pod 是应用运行的最小单位࿰…...
基于mysqldump的MySQL数据库异地备份方案(含完整脚本和解释)
MySQL数据库异地备份方案 0 文档描述 本文描述了一个数据库异地备份方案,以下脚本代码都是在线上应用的本文以CentOS7为例,其他系统请自行查询安装命令如果评论有需求,我就对应系统做一下文档 1 基本原理 1.1 流程 原理本身很简单&#…...
C语言中10个字符串函数详解
目录 1.strlen 2.strcpy 3.strcat 4.strcmp 5.strncpy 6.strncat 7.strncmp 8.strstr 9.strtok 10.strerror 1.strlen 基本结构:size_t strlen(const char *str);功能:用于计算字符串的长度;字符串已经 0作为结束标志…...
flume系列之:查询多个flume agent组是否有topic重复接入情况
flume系列之:查询多个flume agent组是否有topic重复接入情况 一、查询zk节点下的flume agent组二、获取采集的topic三、获取重复接入的topic,支持设置重复接入白名单四、执行流程五、完整代码一、查询zk节点下的flume agent组 def get_flumeAgent_zkPath(zkRootPaths):for z…...
Windows自动化1️⃣环境搭建WinAppDriver
对于技术选型: 我尝试了, pywinauto, WinAppDriver,CukeTest 担心CukeTest可能会收费, 尝试pywinauto,在元素点击,搜索时, 遇到不可用情况; WinAppDriver是微软家的,大厂开源, 就它了! 步骤一:安装WinAppDriver 进入WinAppDriver下载页面(https://githu…...
云服务器Docker内部署服务后,端口无法访问?
云服务器Docker内部署服务后,端口无法访问,可以按照以下思路进行排查: 以【docker run --name my-nginx -d -p 9395:80 nginx】举例: 查看Docker映射是否正确,可使用docker ps命令查看。Docker是否设置端口映射&#…...
Unity将摄像机视角保存成Json文件方便读取使用
系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、设置环境👉二、代码如下👉三、使用方法 👉四、下次外部调用json里面的摄像机位置的时候如下代码方法👉壁纸分享👉总结 👉…...
git是什么/基本指令
git作用 去中心化, 分布式版本控制器 新增术语:仓库区, 工作区, 暂存区 具体见下板书 常用git命令 git clone 仓库网址 git status 查看仓库状态 git add newfile 临时添加到git仓库 git commit -m 正式添加git仓库 g…...
Linux 中的同步机制
代码基于:Kernel 6.6 临界资源:指哪些在同一时刻只允许被一个线程访问的软件或硬件资源。这种资源的特点是,如果有线程正在使用,其他进程必须等待直到该线程释放资源。 临界区:指在每个线程中访问临界资源的那段代码。…...
Day17 枚举、typedef、位运算、堆空间的学习
目录 枚举 typedef 位运算 堆上的空间 枚举 一个一个列举出来,是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。 作用: 1、为了提高代码的可读性 2、提高代码的安全性 枚举类型 基本语法: enum 枚举名 { …...
Python爬虫与数据分析:中国大学排名的深度挖掘
前言 👉 小编已经为大家准备好了完整的代码和完整的Python学习资料,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取【保证100%免费】 一、选题背景 高考作为中国学生生涯中最为重要的事,在高考之后,选择一所…...
建设网站开发的语言有哪些/网络推广竞价外包
1、替换屏幕dts文件 替换arch/arm64/boot/dts/rockchip/rk3399pro-evb-v11.dts 此文件由屏幕厂商提供 2、修改driver文件 由于替换后出现一个问题:第一次上电后,屏幕正常显示无异常;当进入休眠后再唤醒起来,屏幕有背光无显示&…...
开通网站必须做域名空间/seo培训中心
1.FastDFS介绍 FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载…...
网站多久需要维护/免费的域名和网站
网上有大哥总结了一张图,完整地囊括了整个NLP处理企业文本数据的整个流程。挺好的,贴出来给大家看一下。在此也搜藏下。...
不更新网站如何做排名/人力资源短期培训班
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这是自己打的,为什么这个能显示出来,有什么区别package uio;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JTextField;public class Text1 {public…...
昆明商城网站开发/热搜榜百度
介绍 Python 作为一门相当简洁的计算机语言,目前已经拥有诸多用户。而英文的帮助文件或多或少给英语水平不太好的用户带来了一定的不便。事实上,官网就有中文手册,为了大家的方便,这里下载下来中英两种格式的PDF文件,并…...
广西玉林网站建设正规公司/推广手段和渠道有哪些
分布式应用系统中,经常会用到zk,比如dubbo注册中心,kafka分布式集群等都用到zk这一工具。除了这些用来做分布式集群外,zk还有那西应用场景事我们可以使用到该工具的呢?所以接下来就是我们要了解的重点了。 首先在使用z…...