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

(高可用版本)Kubeadm+Containerd+keepalived部署高可用k8s(v1.28.2)集群

Kubeadm+Containerd+keepalived部署高可用k8s(v1.28.2)集群

一.环境准备,二.容器运行时Containerd安装请参照前文。Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)-CSDN博客

文章目录

  • Kubeadm+Containerd+keepalived部署高可用k8s(v1.28.2)集群
      • 一.环境准备,二.容器运行时Containerd安装请参照前文。[Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)-CSDN博客](https://blog.csdn.net/qq_43479188/article/details/144567672)
      • 服务器准备
      • 三.安装`Keepalived`+`Nginx`配置`k8s apiserver`高可用
        • 1.安装`Keepalived`
        • 2.安装`Nginx`
        • 3.安装`msmtp`邮箱
        • 4.修改`Nginx`配置
        • 5.`keepalived`配置
        • 6.测试`Keepalived`是否配置成功
      • 四.K8S集群部署
        • 1.集群软件的apt源准备
        • 2.K8S集群软件的安装
        • 3.进行`kubectl`命令补全
        • 4.K8S集群初始化
        • 5.K8S集群网络插件Calico部署
        • 6.`Msater`节点设置Worker角色
      • 五.部署应用测试集群是否安装成功

服务器准备

服务器信息(此处为同一内网上的服务器,各个运营商的云服务器Keepalived功能是收费的)如本地搭建的服务器则需要保证在同一内网中,且最好关闭防火墙。

systemctl disable ufw
角色主机名称IPKubernetes版本
masterk8s-master1192.168.6.132v1.28.2
master2k8s-master2192.168.6.131v1.28.2
VIP192.168.6.139

三.安装Keepalived+Nginx配置k8s apiserver高可用

1.安装Keepalived

在两个master节点分别执行

apt update
#安装keepalived
apt install -y keepalived
2.安装Nginx

因为默认的Ubuntu源安装的Nginx,是简版,不包括--with-stream等模块,所以这里选择安装Nginx官方源的版本

#更新源
apt-get update
#下载必须组件
apt-get install -y gnupg2 curl lsb-release ca-certificates
#添加密钥
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo tee /etc/apt/trusted.gpg.d/nginx.asc
#添加镜像源地址
sh -c "echo 'deb http://nginx.org/packages/mainline/ubuntu/ $(lsb_release -cs) nginx' > /etc/apt/sources.list.d/nginx.list"
#再次更新镜像源
apt-get update
#下载安装Nginx
apt-get install nginx

检测Nginx是否安装成功,可以看到有我们需要的模块。

nginx -V

image-20241223151306032

3.安装msmtp邮箱
#执行命令安装邮箱功能
apt install  -y msmtp msmtp-mta ca-certificates bsd-mailx
#编辑配置文件
vi ~/.msmtprc
# QQ SMTP 服务器设置
account default
host smtp.qq.com
port 465
auth on
user your_email@qq.com
password your_password(授权码)
from your_email@qq.com
tls on
tls_starttls off
tls_certcheck off
logfile ~/.msmtp.log
#测试是否能够发送邮件
echo "Test email body" | msmtp -a default recipient@example.com
4.修改Nginx配置

修改Nginx配置,两个节点相同:

#这一步避免修改配置后重启包报错
mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.back
#修改配置文件
cat > /etc/nginx/nginx.conf << -'EOF'user  nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;include /etc/nginx/conf.d/*.conf;events {worker_connections 1024;
}# 四层负载均衡,为两台Master apiserver组件提供负载均衡
stream {log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';access_log  /var/log/nginx/k8s-access.log  main;upstream k8s-apiserver {server 192.168.6.131:6443;   # xianchaomaster2 APISERVER IP:PORTserver 192.168.6.132:6443;   # xianchaomaster3 APISERVER IP:PORT}server {listen 16443; # 由于nginx与master节点复用,这个监听端口不能是6443,否则会冲突proxy_pass k8s-apiserver;}
}http {log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile            on;tcp_nopush          on;tcp_nodelay         on;keepalive_timeout   65;types_hash_max_size 2048;include             /etc/nginx/mime.types;default_type        application/octet-stream;server {listen       80 default_server;server_name  _;location / {}}
}-EOF
5.keepalived配置
  • keepalived配置:
cat > /etc/keepalived/keepalived.conf << -'EOF'
global_defs {notification_email { #指定keepalived在发生事件时(比如切换)发送通知邮件的邮箱,2*****0@qq.com  #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务}notification_email_from 1*****05@qq.com  #keepalived在发生诸如切换操作时需要发送email通知地址smtp_server smtp.qq.com   #指定发送email的smtp服务器smtp_connect_timeout 30 #设置连接smtp server的超时时间router_id NGINX_MASTER  #运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。
}vrrp_script chk_nginx {script "/etc/keepalived/nginx_check.sh"interval 2   #脚本执行间隔,每2s检测一次timeout 2weight -5   #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5rise 2      #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)fall 2      #检测2次成功就算成功。但不修改优先级}
vrrp_instance VI_1 {state MASTERinterface ens34 #换成自己服务器的网卡名ifconfig查看virtual_router_id 51priority 100  #MASTER的优先级必须大于BACKUP的优先级,slave设置的值不能超过weight设置倍数,非常重要advert_int 1  #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒authentication {auth_type PASSauth_pass 20210825}virtual_ipaddress {192.168.6.139/32  dev ens34 label ens34:1}notify_master "/etc/keepalived/mail_notify.sh master" #当前节点成为主节点时触发的脚本notify_backup "/etc/keepalived/mail_notify.sh backup" #当前节点转为备节点时触发的脚本notify_fault "/etc/keepalived/mail_notify.sh  fault"  #当前节点转为失败状态时触发的脚本track_script {                         chk_nginx}
}-EOF

注意此处#后面的注释为解释用,修改的时候请删除##后面的内容。

  • 配置脚本(两个节点都需要)
#新增Nginx检查脚本
cat > /etc/keepalived/check_nginx.sh  << -'EOF'
#!/bin/bash
if [ "${nginx_pid}" = "0" ]; thensystemctl start nginxsleep 2nginx_pidd=$(ps -C nginx --no-heading|wc -l)if [ "${nginx_pidd}" = "0" ]; thensystemctl stop keepalivedsystemctl stop nginxfi
fi-EOF#给脚本赋权
chmod +x  /etc/keepalived/check_nginx.sh
#新增主节点keepalived漂移后告警脚mail_notify.sh
cat > /etc/keepalived/mail_notify.sh  << -'EOF'
#!/bin/bash
IPADDR=$(/usr/sbin/ifconfig eth0 | grep "inet" | awk '{ print $2}')
contact='2*****80@qq.com'function notify() {mailsubject="nginx服务器${IPADDR},keepalived-master $1 状态被激活,查看nginx服务运行状态"mailbody="$(date +'%F %T'): 服务器${IPADDR} keepalived vip发生漂移, 当前服务器keepalived状态为 $1,节点为msater"echo "$mailbody" | mail -s "$mailsubject" $contact
}case $1 inmaster)notify master;;backup)notify backup;;fault)notify fault;;*)echo "Usage: $(basename$0) {master|backup|fault}"exit 100;;
esac-EOF#给脚本赋权
chmod +x  /etc/keepalived/mail_notify.sh
#新增备节点keepalived漂移后告警脚mail_notify.sh
cat > /etc/keepalived/mail_notify.sh  << -'EOF'
#!/bin/bashIPADDR=$(/usr/sbin/ifconfig eth0 | grep "inet" | awk '{ print $2}')
contact='2*****80@qq.com'function notify() {mailsubject="nginx服务器${IPADDR},keepalived-backup 状态被激活,查看nginx服务运行状态"mailbody="$(date +'%F %T'): 服务器${IPADDR} keepalived vip发生漂移, 当前服务器keepalived状态为 $1,节点为Backup"echo "$mailbody" | mail -s "$mailsubject" $contact
}case $1 inmaster)notify master;;backup)notify backup;;fault)notify fault;;*)echo "Usage: $(basename$0) {master|backup|fault}"exit 100;;
esac-EOF#给脚本赋权
chmod +x  /etc/keepalived/mail_notify.sh
  • Keepalived配置
cat > /etc/keepalived/keepalived.conf << -'EOF'
global_defs {notification_email {2*****80@qq.com}notification_email_from 19*****05@qq.comsmtp_server smtp.qq.comsmtp_connect_timeout 30router_id NGINX_SLAVE
}vrrp_script chk_nginx {script "/etc/keepalived/check_nginx.sh"interval 2timeout 2weight -5rise 2fall 2}
vrrp_instance VI_1 {state BACKUP #此处需修改为BACKUPinterface ens34virtual_router_id 51priority 95 #注意此处设置的值不能比msater节点高advert_int 1authentication {auth_type PASSauth_pass 20210825}virtual_ipaddress {192.168.6.139/32  dev ens34 label ens34:1}notify_master "/etc/keepalived/mail_notify.sh master"notify_backup "/etc/keepalived/mail_notify.sh backup"notify_fault "/etc/keepalived/mail_notify.sh  fault"track_script {chk_nginx}
}-EOF

注意此处#后面的注释为解释用,修改的时候请删除##后面的内容。

  • 启动服务(两个节点都执行)
systemctl daemon-reload
systemctl restart nginx
systemctl start keepalived
systemctl enable nginx keepalived
6.测试Keepalived是否配置成功
  • 主节点检查是否绑定VIP
ip addr show | grep ens34

image-20241223155621018

  • 备节点检查是否绑定VIP

image-20241223155726242

可以看到此时的VIP已经绑定到主节点,现在测试主备节点和其他处于统一网络环境的内网服务器是否能够Ping通这个VIP节点。

主节点:image-20241223155905258

备节点:image-20241223155919410

其他内网服务器:image-20241223160002474

如果都测试通过则代表VIP地址是可用的。

  • 测试VIP是否能够漂移
#停止keepalived服务
systemctl stop keepalived.service

可以看到停止之后就收到了邮件,然后可以在backup节点看到,VIP已经漂移过去了。

image-20241223181059272

image-20241223170703011

然后我们在master节点启动keepalived

systemctl start keepalived.service

可以看到VIP已经漂移回msater

image-20241223182307892

image-20241223182429327

同时会收到三个邮件。

至此k8s apiserver高可用就配置完成。

四.K8S集群部署

1.集群软件的apt源准备

此处使用使用阿里云镜像源:

#添加镜像源
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
#添加密钥
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
#更新源
apt-get update
2.K8S集群软件的安装

查看可以安装的软件列表

apt-cache madison kubeadm

image-20241218184305800

可以看到最新的版本是1.28.2,此处选择安装的版本是1.28.2,可自行选择。

apt-get install -y kubelet=1.28.2-00 kubeadm=1.28.2-00 kubectl=1.28.2-00

node节点上可以不用安装kubectl

apt-get install -y kubelet=1.28.2-00 kubeadm=1.28.2-00

启动kueblet,并设置开机自启动。

systemctl enable --now kubelet

为求稳定,通过以下命令进行锁定定版本。

apt-mark hold kubelet kubeadm kubectl 
3.进行kubectl命令补全
#安装命令补全工具
apt install bash-completion
kubectl completion bash > /etc/bash_completion.d/kubectlls /etc/bash_completion.d/kubectl
source /etc/bash_completion.d/kubectl
source ~/.bashrc
4.K8S集群初始化
#创建文件夹
mkdir -p /home/k8s/init/
#生成默认配置文件
kubeadm config print init-defaults > /home/k8s/init/kubeadm-init.yaml

image-20241218184654259

修改文件的一些参数:

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: 192.168.6.139 #此处配置VIP地址bindPort: 6443 #端口地址不变,因为Nginx配置的还是6443
nodeRegistration:criSocket: unix:///var/run/containerd/containerd.sockimagePullPolicy: IfNotPresentname: k8s-mastertaints: null
---
apiServer:certSANs: #此处配置VIP地址和其他两个主节点的地址- 192.168.6.131- 192.168.6.132- 192.168.6.139timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:local:dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.28.2
controlPlaneEndpoint: 192.168.6.139:16443 #此处配置VIP地址加Nginx代理后的端口
networking:dnsDomain: cluster.localserviceSubnet: 10.244.0.0/12podSubnet: 10.96.0.0/16
scheduler: {}

注意此处#后面的注释为解释用,修改的时候请删除##后面的内容。

通过以下命令列举出需要拉取的镜像:

kubeadm config images list --config  /home/k8s/init/kubeadm-init.yaml

image-20241218185014902

通过下面命令进行拉取:

kubeadm config images pull --config  /home/k8s/init/kubeadm-init.yaml

然后通过以下命令进行初始化:

kubeadm init --config=/home/k8s/init/kubeadm-init.yaml --upload-certs --v=6

可以看到此处和非高可用版有点不一样:

--v=6 是日志级别参数,表示将日志详细度设置为 6(范围是 0 到 10,数字越高日志越详细)。

--upload-certs 参数用于将集群的控制平面节点所需的证书上传到 kubeadm 的配置存储(存储在 etcd 中),以便其他控制平面节点(通过 kubeadm join 命令)可以拉取这些证书并加入集群。

在配置高可用的 Kubernetes 集群(即包含多个控制平面节点)的时候,需要使用 --upload-certs。没有这个参数,后续添加控制平面节点时需要手动提供证书。

出现如下信息则证明初始化成功:

image-20241223183722233

然后按照上述的提示,进行如下的操作:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

执行完上述的命令,就可以通过kubectl进行查看k8s集群的状态信息。如下图:

image-20241223183818105

因为一开始没有安装Calico等网络插件,所以节点状态是STATUS: NotReady

新节msater点加入到集群中,复制输出中的包含--control-plane的命令:

kubeadm join 192.168.6.139:16443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:8f7971ee2f7a2baefbcde6ca28afb77107df09a96caa2a8e39fed876574a40a2 \--control-plane --certificate-key a5607ce95a056f7a9510830860706c35174f46195f31009c98a67b28b833243a

在另一个msater节点执行。子节点则是下面的:

kubeadm join 192.168.6.139:16443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:8f7971ee2f7a2baefbcde6ca28afb77107df09a96caa2a8e39fed876574a40a2

执行后如图:
image-20241223184028976

然后按照上述的提示,进行如下的操作:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

再次查看节点:

image-20241223184204241

同样是STATUS: NotReady

在安装途中可以通过如下命令来排查节点插件的安装进程:

kubectl get pod -n kube-system -o wide | grep k8s-master2

image-20241218190226229

image-20241218190256750

如果一直未启动成功可以用如下命令来排查:

kubectl describe pod -n kube-system <PodID>
#或者
kubectl logs -f -n kube-system <PodID>

在节点上还可以通过crictl ps -a命令来排查是否有pod启动。同理,在初始化的时候也可以这样排查。

image-20241218190620121

crictlContainerd的命令行工具。

5.K8S集群网络插件Calico部署

​ 此处选用科学部署方式,拉取的镜像到自己的阿里云仓库。镜像地址如下:

registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/calico-cni:v3.27.5
registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/calico-node:v3.27.5
registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/calico-kube-controllers:v3.27.5

分别替换name: upgrade-ipamname: install-cniname: "mount-bpffs"name: calico-nodename: calico-kube-controllers这几处的镜像地址,然后执行以下命令安装:

kubectl create -f calico.yml

calico文件地址如下calico/manifests/calico.yaml at release-v3.27 · projectcalico/calico

执行完上述的命令后,即可完成calico的部署。如下:

image-20241218191234111

可以看到每个节点都有Calico的插件,然后稍等一会,node节点就会变成Ready:

image-20241218191359047

6.Msater节点设置Worker角色

默认情况下Kubernetes Control Plane Master Node被设置为不能部署pod,因为Control Plane节点默认设置了以下NoSchedule标签:

如图:

kubectl describe node k8s-master | grep Taint

image-20241223184703561

所以去掉NoSchedule标签,即可在Control Plane调度Pod

#执行命令删除该节点的标签
kubectl taint node k8s-master2 node-role.kubernetes.io/control-plane:NoSchedule-

image-20241223184910432

#再次查看
kubectl describe node k8s-master2 | grep Taint

image-20241223184947223

可以发现标签已经删除。

五.部署应用测试集群是否安装成功

以部署一个Nginx应用为例,以下是一个简单的Nginx部署的yaml文件:

apiVersion: apps/v1     #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment        #该配置的类型,我们使用的是 Deployment
metadata:               #译名为元数据,即 Deployment 的一些基本属性和信息name: nginx-deployment        #Deployment 的名称labels:           #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解app: nginx  #为该Deployment设置key为app,value为nginx的标签
spec:           #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用replicas: 1   #使用该Deployment创建一个应用程序实例selector:         #标签选择器,与上面的标签共同作用,目前不需要理解matchLabels: #选择包含标签app:nginx的资源app: nginxtemplate:         #这是选择或创建的Pod的模板metadata:   #Pod的元数据labels:   #Pod的标签,上面的selector即选择包含标签app:nginx的Podapp: nginxspec:           #期望Pod实现的功能(即在pod中部署)containers:       #生成container,与docker中的container是同一种- name: nginx     #container的名称image: registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/nginx:1.26.0  #使用镜像nginx:1.26.0创建container,该container默认80端口可访问
---
apiVersion: v1
kind: Service
metadata:name: nginx-service #Service 的名称labels:       #Service 自己的标签app: nginx  #为该 Service 设置 key 为 app,value 为 nginx 的标签
spec:     #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问selector:     #标签选择器app: nginx  #选择包含标签 app:nginx 的 Podports:- name: nginx-port  #端口的名字protocol: TCP     #协议类型 TCP/UDPport: 80          #集群内的其他容器组可通过 80 端口访问 ServicenodePort: 32600   #通过任意节点的 32600 端口访问 ServicetargetPort: 80  #将请求转发到匹配 Pod 的 80 端口type: NodePort  #Serive的类型,ClusterIP/NodePort/LoaderBalancer

上述的资源清单创建了两种类型一个Deployment,一个Service,然后执行命令部署:

kubectl apply -f nginx.yaml

执行成功后,如下图:

image-20241223185153003

可以看到这个pod是部署在那个删除标签的Control Plane节点的。

然后通过node节点IP+32600的方式进行访问:

image-20241218191914871

相关文章:

(高可用版本)Kubeadm+Containerd+keepalived部署高可用k8s(v1.28.2)集群

KubeadmContainerdkeepalived部署高可用k8s(v1.28.2)集群 一.环境准备&#xff0c;二.容器运行时Containerd安装请参照前文。KubeadmContainerd部署k8s(v1.28.2)集群&#xff08;非高可用版&#xff09;-CSDN博客 文章目录 KubeadmContainerdkeepalived部署高可用k8s(v1.28.2)集…...

单片机:实现自动关机电路(附带源码)

单片机实现自动关机电路 在许多嵌入式系统或便携式设备中&#xff0c;自动关机功能非常重要&#xff0c;尤其是在电池供电的设备中&#xff0c;防止设备长时间开启以节省电能。自动关机电路的基本功能是检测设备是否处于待机状态&#xff0c;若一定时间内未收到用户操作信号或…...

【YashanDB知识库】ycm-YashanDB列表有数据库显示故障排除步骤

本文内容来自YashanDB官网&#xff0c;原文内容请见 https://www.yashandb.com/newsinfo/7802959.html?templateId1718516 数据库状态 正常 异常 1、查看告警列表 例如&#xff1a;告警显示实例无法连接&#xff0c;一般是数据库实例服务掉了&#xff0c;需要尽快联系系统…...

高级的SQL查询技巧有哪些?

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于高级SQL查询技巧方面的相关内容&#xf…...

使用 UniApp 在微信小程序中实现 SSE 流式响应

概述 服务端发送事件&#xff08;Server-Sent Events, SSE&#xff09;是一种允许服务器向客户端推送实时更新的技术。SSE 提供了一种单向的通信通道&#xff0c;服务器可以持续地向客户端发送数据&#xff0c;而不需要客户端频繁发起请求。这对于需要实时更新的应用场景非常有…...

transformer用作分类任务

系列博客目录 文章目录 系列博客目录1、在手写数字图像这个数据集上进行分类1. 数据准备2. 将图像转化为适合Transformer的输入3. 位置编码4. Transformer编码器5. 池化操作6. 分类头7. 训练8. 评估总结流程&#xff1a;相关模型&#xff1a; 1、在手写数字图像这个数据集上进行…...

【枚举】假币问题

题目描述&#xff1a; 有12枚硬币。其中有11枚真币和1枚假币。假币和真币重量不同&#xff0c;但不知道假币比真币轻还是重。现在&#xff0c;用一架天平称了这些币三次&#xff0c;告诉你称的结果&#xff0c;请你找出假币并且确定假币是轻是重&#xff08;数据保证一定能找出…...

easyExcel导出大数据量EXCEL文件,前端实现进度条或者遮罩层

需求&#xff1a;页面点击导出&#xff0c;先按照页面条件去数据库查询&#xff0c;然后将查询到的数据导出。 问题&#xff1a;由于查询特别耗时&#xff0c;所以点击之后页面会看上去没有反应 方案1&#xff1a;就在点击之后在页面增加了一个进度条&#xff0c;等待后端查询…...

Java模拟Mqtt客户端连接Mqtt Broker

Java模拟Mqtt客户端基本流程 引入Paho MQTT客户端库 <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.mqttv5.client</artifactId><version>1.2.5</version> </dependency>设置mqtt配置数据 …...

【电商搜索】文档的信息论生成聚类

【电商搜索】文档的信息论生成聚类 目录 文章目录 【电商搜索】文档的信息论生成聚类目录文章信息概览研究背景技术挑战如何破局技术应用主要相关工作与参考文献后续优化方向 后记 文章信息 https://arxiv.org/pdf/2412.13534 概览 本文提出了一种基于信息论的生成聚类&#…...

在福昕(pdf)阅读器中导航到上次阅读页面的方法

文章目录 在福昕(pdf)阅读器中导航到上次阅读页面的方法概述笔记用书签的方法来导航用导航按钮的方法来导航 备注END 在福昕(pdf)阅读器中导航到上次阅读页面的方法 概述 喜欢用福昕(pdf)阅读器来看pdf文件。 但是有个小问题困扰了我好久。 e.g. 300页的pdf看了一半&#xff…...

基于Springboot的数字科技风险报告管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…...

【最后203篇系列】001 - 2024回顾

说明 最早在CSDN上写文章有两个目的&#xff1a; 1 自己梳理知识&#xff0c;以备日后查用2 曾经从别人的文章中得到过帮助&#xff0c;所以也希望能给人帮助 所以在这个过程中&#xff0c;我的文章基本上完全是原创&#xff0c;也非常强调落地与工程化。在不断写作的过程中…...

量子退火与机器学习(1):少量数据求解未知QUBO矩阵,以少见多

文章目录 前言ー、复习QUBO&#xff1a;中药配伍的复杂性1.QUBO 的介入&#xff1a;寻找最佳药材组合 二、难题&#xff1a;QUBO矩阵未知的问题1.为什么这么难&#xff1f; 三、稀疏建模(Sparse Modeling)1. 欠定系统中的稀疏解2. L1和L2的选择&#xff1a; 三、压缩感知算法(C…...

矩阵:Input-Output Interpretation of Matrices (中英双语)

矩阵的输入-输出解释&#xff1a;深入理解与应用 在线性代数中&#xff0c;矩阵与向量的乘积 ( y A x y Ax yAx ) 是一个极为重要的关系。通过这一公式&#xff0c;我们可以将矩阵 ( A A A ) 看作一个将输入向量 ( x x x ) 映射到输出向量 ( y y y ) 的线性变换。在这种…...

excel 使用vlook up找出两列中不同的内容

当使用 VLOOKUP 函数时&#xff0c;您可以将其用于比较两列的内容。假设您要比较 A 列和 B 列的内容&#xff0c;并将结果显示在 C 列&#xff0c;您可以在 C1 单元格中输入以下公式&#xff1a; 这个公式将在 B 列中的每个单元格中查找是否存在于 A 列中。如果在 A 列中找不到…...

YoloV8改进策略:Head改进|DynamicHead,利用注意力机制统一目标检测头部|即插即用

摘要 论文介绍 本文介绍了一种名为DynamicHead的模块,该模块旨在通过注意力机制统一目标检测头部,以提升目标检测的性能。论文详细阐述了DynamicHead的工作原理,并通过实验证明了其在COCO基准测试上的有效性和效率。 创新点 DynamicHead模块的创新之处在于它首次尝试在一…...

两地的日出日落时间差为啥不相等

悟空去延吉玩耍&#xff0c;在下午4点多的时候发来一张照片&#xff0c;说&#xff0c;天已经黑了&#xff01;我赶紧地图上看了看&#xff0c;延吉居然和北京差了大约15度的经度差&#xff0c;那就是大约一小时的时差哦。次日我随便查了一下两地的日出日落时间&#xff0c;结果…...

Android Https和WebView

系统会提示说不安全&#xff0c;因为网站通过js就能调用你的android代码&#xff0c;如果你确认你的网站没用到JS的话就不要打开这个开关&#xff0c;如果用到了&#xff0c;就添加一个注解忽略它就行了。 后来就使用我们公司的网站了&#xff0c;发现也出不来&#xff0c;后来…...

2.5.1 文件管理基本概念

文章目录 文件文件系统文件分类 文件 文件&#xff1a;具有符号名&#xff0c;逻辑上有完整意义的一组相关信息的集合。 文件包含文件体、文件说明两部分。文件体存储文件的真实内容&#xff0c;文件说明存放操作系统管理文件所用的信息。 文件说明包含文件名、内部标识、类型、…...

在 PowerShell 中优雅地显示 Python 虚拟环境

在使用 Python 进行开发时&#xff0c;虚拟环境管理是一个非常重要的部分。无论是使用 venv 还是 conda&#xff0c;我们都希望能够清晰地看到当前所处的虚拟环境。本文将介绍如何在 PowerShell 中配置提示符&#xff0c;使其能够优雅地显示不同类型的 Python 虚拟环境。 问题…...

K8S Ingress 服务配置步骤说明

部署Pod服务 分别使用kubectl run和kubectl apply 部署nginx和tomcat服务 # 快速启动一个nginx服务 kubectl run my-nginx --imagenginx --port80# 使用yaml创建tomcat服务 kubectl apply -f my-tomcat.yamlmy-tomcat.yaml apiVersion: apps/v1 kind: Deployment metadata:n…...

观察者模式(sigslot in C++)

大家&#xff0c;我是东风&#xff0c;今天抽点时间整理一下我很久前关注的一个不错的库&#xff0c;可以支持我们在使用标准C的时候使用信号槽机制进行观察者模式设计&#xff0c;sigslot 官网&#xff1a; http://sigslot.sourceforge.net/ 本文较为详尽探讨了一种观察者模…...

python使用pip进行库的下载

前言 现如今有太多的python编译软件&#xff0c;其库的下载也是五花八门&#xff0c;但在作者看来&#xff0c;无论是哪种方法都是万变不离其宗&#xff0c;即pip下载。 pip是python的包管理工具&#xff0c;无论你是用的什么python软件&#xff0c;都可以用pip进行库的下载。 …...

C#(委托)

一、基本定义 在C#中&#xff0c;委托&#xff08;Delegate&#xff09;是一种引用类型&#xff0c;它用于封装一个方法&#xff08;具有特定的参数列表和返回类型&#xff09;。可以把委托想象成一个能存储方法的变量&#xff0c;这个变量能够像调用普通方法一样来调用它所存…...

《点点之歌》“意外”诞生记

世界是“点点”的&#xff0c;“点点”是世界的。 (笔记模板由python脚本于2024年12月23日 19:28:25创建&#xff0c;本篇笔记适合喜欢诗文的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 …...

ue5 pcg(程序内容生成)真的简单方便,就5个节点

总结&#xff1a; 前情提示 鼠标单击右键平移节点 1.编辑-》插件-》procedural->勾选两个插件 2.右键-》pcg图表-》拖拽进入场景 3.先看点point 右键-》调试(快捷键d)->右侧设置粒子数 3.1调整粒子数 可以在右侧输入框&#xff0c;使用加减乘除 4.1 表面采样器 …...

32岁前端干了8年,是继续做前端开发,还是转其它工作

前端发展有瓶颈&#xff0c;变来变去都是那一套&#xff0c;只是换了框架换了环境。换了框架后又得去学习&#xff0c;虽然很快上手&#xff0c;但是那些刚毕业的也很快上手了&#xff0c;入门门槛越来越低&#xff0c;想转行或继续卷&#xff0c;该如何破圈 这是一位网友的自述…...

【演化博弈】期望收益函数公式、复制动态方程——化简功能技巧

期望化简 在演化博弈论的研究中&#xff0c;期望收益函数和复制动态方程是核心工具。化简这些公式的功能技巧具有以下几个重要作用&#xff1a; 提高公式的可读性和理解度 复杂的数学表达式可能让人感到困惑。通过化简&#xff0c;公式变得更加简单和易读&#xff0c;使研究者…...

opencv中的各种滤波器简介

在 OpenCV 中&#xff0c;滤波器是图像处理中的重要工具&#xff0c;用于对图像进行平滑、去噪、边缘检测等操作。以下是几种常见滤波器的简单介绍。 1. 均值滤波 (Mean Filter) 功能&#xff1a; 对图像进行平滑处理&#xff0c;减少噪声。 应用场景&#xff1a; 去除图像…...