(高可用版本)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:PORT
       server 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 2
     weight -5   #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
     rise 2      #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
     fall 2      #检测2次成功就算成功。但不修改优先级
    }
vrrp_instance VI_1 {
    state MASTER
    interface ens34 #换成自己服务器的网卡名ifconfig查看
    virtual_router_id 51
    priority 100  #MASTER的优先级必须大于BACKUP的优先级,slave设置的值不能超过weight设置倍数,非常重要
    advert_int 1  #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
    authentication {
        auth_type PASS
        auth_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" ]; then
    systemctl start nginx
    sleep 2
    nginx_pidd=$(ps -C nginx --no-heading|wc -l)
    if [ "${nginx_pidd}" = "0" ]; then
        systemctl stop keepalived
        systemctl stop nginx
    fi
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 in
    master)
        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/bash

IPADDR=$(/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 in
    master)
        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.com
   smtp_server smtp.qq.com
   smtp_connect_timeout 30
   router_id NGINX_SLAVE
}

vrrp_script chk_nginx {
     script "/etc/keepalived/check_nginx.sh"
     interval 2
     timeout 2
     weight -5
     rise 2
     fall 2
   }
vrrp_instance VI_1 {
    state BACKUP #此处需修改为BACKUP
    interface ens34
    virtual_router_id 51
    priority 95 #注意此处设置的值不能比msater节点高
    advert_int 1
    authentication {
        auth_type PASS
        auth_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-20241224180319122

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/kubectl

ls /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-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.6.139 #此处配置VIP地址
  bindPort: 6443 #端口地址不变,因为Nginx配置的还是6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: k8s-master
  taints: null
---
apiServer:
  certSANs: #此处配置VIP地址和其他两个主节点的地址
    - 192.168.6.131
    - 192.168.6.132
    - 192.168.6.139
  timeoutForControlPlane: 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.local
  serviceSubnet: 10.244.0.0/12
  podSubnet: 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: nginx
  template:         #这是选择或创建的Pod的模板
    metadata:   #Pod的元数据
      labels:   #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
        app: nginx
    spec:           #期望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 的 Pod
  ports:
  - name: nginx-port  #端口的名字
    protocol: TCP     #协议类型 TCP/UDP
    port: 80          #集群内的其他容器组可通过 80 端口访问 Service
    nodePort: 32600   #通过任意节点的 32600 端口访问 Service
    targetPort: 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

联合目标检测与图像分类提升数据不平衡场景下的准确率

联合目标检测与图像分类提升数据不平衡场景下的准确率 在一些数据不平衡的场景下&#xff0c;使用单一的目标检测模型很难达到99%的准确率。为了优化这一问题&#xff0c;适当将其拆解为目标检测模型和图像分类模型的组合&#xff0c;可以更有效地控制最终效果&#xff0c;尤其…

C++之红黑树模拟实现

目录 红黑树的概念 红黑树的性质 红黑树的查找效率 红黑树的实现 红黑树的定义 红黑树节点的插入 红黑树的平衡调整 判断红黑树是否平衡 红黑树整体代码 测试代码 上期我们学习了AVL树的模拟实现&#xff0c;在此基础上&#xff0c;我们本期将学习另一个数据结构-…

机器学习常用术语

目录 概要 机器学习常用术语 1、模型 2、数据集 3、样本与特征 4、向量 5、矩阵 6、假设函数与损失函数 7、拟合、过拟合与欠拟合 8、激活函数(Activation Function) 9、反向传播(Backpropagation) 10、基线(Baseline) 11、批量(Batch) 12、批量大小(Batch Size)…

nest 学习3

学习小册(nest通关秘籍) 邮箱验证码登陆 流程图&#xff1a; 邮箱作为key&#xff0c;生成随机验证码&#xff0c;然后放到redis中。调用邮箱api发送邮箱。 前端获取到code后&#xff0c;将验证码输入传给后端&#xff0c;后端根据邮箱取出redis数据&#xff0c;比对验证码&…

原点安全再次入选信通院 2024 大数据“星河”案例

近日&#xff0c;中国信息通信研究院和中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;共同组织开展的 2024 大数据“星河&#xff08;Galaxy&#xff09;”案例征集活动结果正式公布。由工银瑞信基金管理有限公司、北京原点数安科技有限公司联…

RabbitMQ 的7种工作模式

RabbitMQ 共提供了7种⼯作模式,进⾏消息传递,. 官⽅⽂档:RabbitMQ Tutorials | RabbitMQ 1.Simple(简单模式) P:⽣产者,也就是要发送消息的程序 C:消费者,消息的接收者 Queue:消息队列,图中⻩⾊背景部分.类似⼀个邮箱,可以缓存消息;⽣产者向其中投递消息,消费者从其中取出消息…

Restaurants WebAPI(四)——Identity

文章目录 项目地址一、Authentication&#xff08;身份认证&#xff09;1.1 配置环境(解决类库包无法引用)1.2 使用Authentication控制Controller的访问1.3 获取User的Context1.3.1 在Application下创建User文件夹1. 创建User.cs record类封装角色信息2. 创建UserContext.cs提供…

010 Qt_输入类控件(LineEdit、TextEdit、ComboBox、SpinBox、DateTimeEdit、Dial、Slider)

文章目录 前言一、QLineEdit1.简介2.常见属性及说明3.重要信号及说明4.示例一&#xff1a;用户登录界面5.示例二&#xff1a;验证两次输入的密码是否一致显示密码 二、TextEdit1.简介2.常见属性及说明3.重要信号及说明4.示例一&#xff1a;获取多行输入框的内容5.示例二&#x…

Vue3:uv-upload图片上传

效果图&#xff1a; 参考文档&#xff1a; Upload 上传 | 我的资料管理-uv-ui 是全面兼容vue32、nvue、app、h5、小程序等多端的uni-app生态框架 (uvui.cn) 代码&#xff1a; <view class"greenBtn_zw2" click"handleAddGroup">添加班级群</vie…

通过Docker Compose来实现项目可以指定读取不同环境的yml包

通过Docker Compose来实现项目可以指定读取不同环境的yml包 1. 配置文件2. 启动命令 切换不同环境注意挂载的文件权限要777 1. 配置文件 version: 3.8 services:docker-test:image: openjdk:8-jdk-alpineports:- "${APP_PORT}:${CONTAINER_PORT}"volumes:- "${J…

华为实训课笔记 2024 1223-1224

华为实训 12/2312/24 12/23 [Huawei]stp enable --开启STP display stp brief --查询STP MSTID Port Role STP State Protection 实例ID 端口 端口角色 端口状态 是否开启保护[Huawei]display stp vlan xxxx --查询制定vlan的生成树计算结…

GitCode 光引计划投稿 | GoIoT:开源分布式物联网开发平台

GoIoT 是基于Gin 的开源分布式物联网&#xff08;IoT&#xff09;开发平台&#xff0c;用于快速开发&#xff0c;部署物联设备接入项目&#xff0c;是一套涵盖数据生产、数据使用和数据展示的解决方案。 GoIoT 开发平台&#xff0c;它是一个企业级物联网平台解决方案&#xff…

EasyGBS国标GB28181公网平台P2P远程访问故障诊断:云端服务端排查指南

随着信息技术的飞速发展&#xff0c;视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。EasyGBS平台&#xff0c;作为基于国标GB28181协议的视频流媒体平台&#xff0c;为用户提供了强大的视频监控直播功能。然而&#xff0c;在实际应用中&#xff0c;P2P远程访问可…

Vnlhun靶场Log4j2漏洞

相关概念 log4j2是Apache的⼀个java日志框架&#xff0c;我们借助它进行日志相关操作管理&#xff0c;然而在2021年末log4j2爆出了远程代码执行漏洞&#xff0c;属于严重等级的漏洞 漏洞原理 简单说就是当你使⽤log4j2中提供的⽅法去输出⽇志信息时&#xff0c;⽐如说最常⻅…

千兆网中的gmii与rgmii

物理链路上是千兆网。1 Gbps1000 Mb/s1000/8 MB/s125 MB/s&#xff0c;这是和你的测试设备相连的1 Gbps物理带宽下的极速。关键点是1 B&#xff08;byte&#xff09;8 b&#xff08;bit&#xff09;。实际下载速度还取决于下载源的限制、出口的物理链路和运营商的限制。

2024-12-24 NO1. XR Interaction ToolKit 环境配置

文章目录 1 软件配置2 安装 XRToolKit3 配置 OpenXR4 安装示例场景5 运行测试 1 软件配置 Unity 版本&#xff1a;Unity6000.0.26 ​ 2 安装 XRToolKit 创建新项目&#xff08;URP 3D&#xff09;&#xff0c;点击进入 Asset Store。 进入“Unity Registry”页签&#xff0…

重温设计模式--外观模式

文章目录 外观模式&#xff08;Facade Pattern&#xff09;概述定义 外观模式UML图作用 外观模式的结构C 代码示例1C代码示例2总结 外观模式&#xff08;Facade Pattern&#xff09;概述 定义 外观模式是一种结构型设计模式&#xff0c;它为子系统中的一组接口提供了一个统一…

【恶意软件检测】一种基于API语义提取的Android恶意软件检测方法(期刊等级:CCF-B、Q2)

一种基于API语义提取的Android恶意软件检测方法 A novel Android malware detection method with API semantics extraction 摘要 由于Android框架和恶意软件的持续演变&#xff0c;使用过时应用程序训练的传统恶意软件检测方法在有效识别复杂演化的恶意软件方面已显不足。为…

【微信小程序】2|轮播图 | 我的咖啡店-综合实训

轮播图 引言 在微信小程序中&#xff0c;轮播图是一种常见的用户界面元素&#xff0c;用于展示广告、产品图片等。本文将通过“我的咖啡店”小程序的轮播图实现&#xff0c;详细介绍如何在微信小程序中创建和管理轮播图。 轮播图数据准备 首先&#xff0c;在home.js文件中&a…

RT-DETR学习笔记(2)

七、IOU-aware query selection 下图是原始DETR。content query 是初始化为0的label embedding, position query 是通过nn.Embedding初始化的一个嵌入矩阵&#xff0c;这两部分没有任何的先验信息&#xff0c;导致DETR的收敛慢。 RT-DETR则提出要给这两部分&#xff08;conten…