Kubernetes 多主多从集群部署完整文档
好久不见呀!今天给大家整点干货尝尝(其实是自己的总结),主打的就是全程无尿点。
Kubernetes 多主多从集群部署完整文档
1. 机器列表
PS: master,lb,nfs机器均为CentOS 7,其他为Ubuntu 22.04 LTS
机器名称 | IP地址 | 备注 |
---|---|---|
lb1 | 192.168.1.120 | 负载均衡器1 |
lb2 | 192.168.1.119 | 负载均衡器2 |
master-a | 192.168.1.74 | 主节点1 |
master-b | 192.168.1.93 | 主节点2 |
master-c | 192.168.1.107 | 主节点3 |
node01 | 192.168.1.13 | 工作节点1 |
master01 | 192.168.1.53 | 原单主集群节点(现为工作节点) |
vip | 192.168.1.150 | 虚拟IP地址 |
2. 负载均衡器配置
2.1 lb1配置
2.1.1 基础环境配置
# 备份原有yum源
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak# 设置阿里云yum源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo# 清理并重建yum缓存
yum clean all
yum makecache# 设置主机名
hostnamectl set-hostname lb1# 设置时区
timedatectl set-timezone Asia/Shanghai# 关闭并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld# 关闭SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
2.1.2 安装必要组件
# 安装基础工具
yum install -y curl socat conntrack ebtables ipset ipvsadm# 安装负载均衡组件
yum install -y keepalived haproxy psmisc
2.1.3 配置HAProxy
编辑配置文件/etc/haproxy/haproxy.cfg
:
globallog /dev/log local0 warningchroot /var/lib/haproxypidfile /var/run/haproxy.pidmaxconn 4000user haproxygroup haproxydaemonstats socket /var/lib/haproxy/statsdefaultslog globaloption httplogoption dontlognulltimeout connect 5000timeout client 50000timeout server 50000frontend kube-apiserverbind *:6443mode tcpoption tcplogdefault_backend kube-apiserverbackend kube-apiservermode tcpoption tcplogoption tcp-checkbalance roundrobindefault-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100server kube-apiserver-1 192.168.1.74:6443 checkserver kube-apiserver-2 192.168.1.93:6443 checkserver kube-apiserver-3 192.168.1.107:6443 check
启动HAProxy服务:
systemctl restart haproxy
systemctl enable haproxy
2.1.4 配置Keepalived
编辑配置文件/etc/keepalived/keepalived.conf
:
global_defs {notification_email {}router_id LVS_DEVELvrrp_skip_check_adv_addrvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_script chk_haproxy {script "killall -0 haproxy"interval 2weight 2
}vrrp_instance haproxy-vip {state BACKUPpriority 100interface ens192 # 根据实际网卡名称修改virtual_router_id 60advert_int 1authentication {auth_type PASSauth_pass 1111}unicast_src_ip 192.168.1.120 # 本机IPunicast_peer {192.168.1.119 # 对端lb2的IP}virtual_ipaddress {192.168.1.150/24 # VIP地址}track_script {chk_haproxy}
}
启动Keepalived服务:
systemctl restart keepalived
systemctl enable keepalived
2.2 lb2配置
lb2的配置与lb1基本相同,主要区别在于:
- 主机名设置为lb2
- Keepalived配置中的unicast_src_ip改为192.168.1.119
- Keepalived配置中的unicast_peer改为192.168.1.120
完整配置步骤参考lb1的配置。
详细配置
# 备份原有yum源
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak# 设置阿里云yum源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo# 清理并重建yum缓存
yum clean all
yum makecache# 设置主机名
hostnamectl set-hostname lb2# 设置时区
timedatectl set-timezone Asia/Shanghai# 关闭并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld# 关闭SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
2.2.2 安装必要组件
# 安装基础工具
yum install -y curl socat conntrack ebtables ipset ipvsadm# 安装负载均衡组件
yum install -y keepalived haproxy psmisc
2.2.3 配置HAProxy
编辑配置文件/etc/haproxy/haproxy.cfg
:
globallog /dev/log local0 warningchroot /var/lib/haproxypidfile /var/run/haproxy.pidmaxconn 4000user haproxygroup haproxydaemonstats socket /var/lib/haproxy/statsdefaultslog globaloption httplogoption dontlognulltimeout connect 5000timeout client 50000timeout server 50000frontend kube-apiserverbind *:6443mode tcpoption tcplogdefault_backend kube-apiserverbackend kube-apiservermode tcpoption tcplogoption tcp-checkbalance roundrobindefault-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100server kube-apiserver-1 192.268.1.74:6443 checkserver kube-apiserver-2 192.268.1.93:6443 checkserver kube-apiserver-3 192.268.1.107:6443 check
启动HAProxy服务:
systemctl restart haproxy
systemctl enable haproxy
2.2.4 配置Keepalived
编辑配置文件/etc/keepalived/keepalived.conf
:
global_defs {notification_email {}router_id LVS_DEVELvrrp_skip_check_adv_addrvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_script chk_haproxy {script "killall -0 haproxy"interval 2weight 2
}vrrp_instance haproxy-vip {state BACKUPpriority 100interface ens192 # 根据实际网卡名称修改virtual_router_id 60advert_int 1authentication {auth_type PASSauth_pass 1111}unicast_src_ip 192.268.1.119 # 本机IPunicast_peer {192.268.1.120 # 对端lb2的IP}virtual_ipaddress {192.268.1.150/24 # VIP地址}track_script {chk_haproxy}
}
启动Keepalived服务:
systemctl restart keepalived
systemctl enable keepalived
3. NFS服务器配置
# 解压NFS安装包
tar zxf nfs/nfs.tar.gz# 安装NFS服务
yum -y localinstall nfs-rpm/*.rpm# 配置NFS共享目录
cat > /etc/exports << EOF
/nfs-data/data *(rw,sync,no_root_squash,no_subtree_check)
EOF# 启动NFS服务
systemctl start nfs
systemctl enable nfs
systemctl restart nfs# 在其他节点安装NFS客户端工具
yum install -y nfs-utils
4. Master节点配置
4.1 master-a配置
4.1.1 基础环境配置
# 设置阿里云yum源
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache# 设置主机名
hostnamectl set-hostname master-a# 设置时区
timedatectl set-timezone Asia/Shanghai# 关闭防火墙和SELinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config# 配置hosts文件
cat >> /etc/hosts << EOF
192.168.1.53 master01
192.168.1.13 node01
192.168.1.81 ai3
192.168.1.74 master-a
192.168.1.93 master-b
192.168.1.107 master-c
EOF# 配置时间同步
yum install -y ntpdate
ntpdate cn.pool.ntp.org
echo "*/5 * * * * root /usr/sbin/ntpdate cn.pool.ntp.org &>/dev/null" >> /etc/crontab
4.1.2 安装Docker
# 解压Docker安装包
tar xf docker-20.10.23.tgz -C /usr/local# 复制Docker二进制文件
cp /usr/local/docker/* /usr/bin/# 创建Docker服务文件
cat > /usr/lib/systemd/system/docker.service <<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP \$MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s[Install]
WantedBy=multi-user.target
EOF# 配置Docker
mkdir -p /etc/docker
cat > /etc/docker/daemon.json << EOF
{ "insecure-registries":["192.168.1.13:5000"],"exec-opts": ["native.cgroupdriver=systemd"],"data-root": "/home/docker","log-opts": {"max-size": "10m","max-file": "3"}
}
EOF# 启动Docker服务
systemctl daemon-reload
systemctl start docker
systemctl enable docker
docker -v
4.1.3 安装Kubernetes组件
# 解压Kubernetes安装包
tar -xvf k8s-v1.23.16.tar# 关闭swap
swapoff -a
sed -i 's/.*swap.*/#&/g' /etc/fstab# 配置内核参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
net.ipv6.conf.all.forwarding = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf# 允许转发
iptables -P FORWARD ACCEPT# 安装Kubernetes RPM包
yum -y localinstall k8s-rpm/*.rpm安装nfs
mkdir tmp
tar zxf nfs/nfs.tar.gz -C tmp
yum -y localinstall tmp/nfs-rpm/*.rpm
systemctl start nfs
systemctl enable nfs
4.1.4 初始化Kubernetes集群
创建kubeadm配置文件kubeadm-config.yaml
:
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: 192.168.1.74bindPort: 6443
nodeRegistration:criSocket: /var/run/dockershim.sockimagePullPolicy: IfNotPresentname: master-ataints: null
---
apiServer:certSANs:- master-a- master-b- master-ctimeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.1.150:6443
controllerManager: {}
dns: {}
etcd:local:dataDir: /var/lib/etcd
imageRepository: 192.168.1.13:5000
kind: ClusterConfiguration
kubernetesVersion: 1.23.17
networking:dnsDomain: cluster.localserviceSubnet: 10.96.0.0/12podSubnet: 10.244.0.0/16
scheduler: {}
初始化集群:
kubeadm init --config kubeadm-config.yaml --upload-certs
配置kubectl:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
安装网络插件:
kubectl apply -f flannel/kube-flannel.yml
打包并分发集群配置文件:
cd /etc/kubernetes
tar zcf /root/k8s_conf.tar.gz pki/ca.crt pki/ca.key pki/sa.key pki/sa.pub pki/front-proxy-ca.crt pki/front-proxy-ca.key pki/etcd/ca.crt pki/etcd/ca.key admin.conf
scp /root/k8s_conf.tar.gz root@192.168.1.93:~/
scp /root/k8s_conf.tar.gz root@192.168.1.107:~/
生成加入集群命令:
kubeadm token create --print-join-command
4.2 master-b配置
master-b的配置与master-a类似,主要区别在于:
- 主机名设置为master-b
- 初始化时使用从master-a获取的配置文件
- 使用加入命令而非初始化命令
具体步骤:
# 设置阿里云yum源
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache# 设置主机名
hostnamectl set-hostname master-a# 设置时区
timedatectl set-timezone Asia/Shanghai# 关闭防火墙和SELinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config# 配置hosts文件
cat >> /etc/hosts << EOF
192.168.1.53 master01
192.168.1.13 node01
192.168.1.81 ai3
192.168.1.74 master-a
192.168.1.93 master-b
192.168.1.107 master-c
EOF# 配置时间同步
yum install -y ntpdate
ntpdate time.windows.com
4.2.2 安装Docker
# 解压Docker安装包
tar xf docker-20.10.23.tgz -C /usr/local# 复制Docker二进制文件
cp /usr/local/docker/* /usr/bin/# 创建Docker服务文件
cat > /usr/lib/systemd/system/docker.service <<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP \$MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s[Install]
WantedBy=multi-user.target
EOF# 配置Docker
mkdir -p /etc/docker
cat > /etc/docker/daemon.json << EOF
{ "insecure-registries":["192.168.1.13:5000"],"exec-opts": ["native.cgroupdriver=systemd"],"data-root": "/home/docker","log-opts": {"max-size": "10m","max-file": "3"}
}
EOF# 启动Docker服务
systemctl daemon-reload
systemctl start docker
systemctl enable docker
docker -v
4.2.3 安装Kubernetes组件
# 解压Kubernetes安装包
tar -xvf k8s-v1.23.16.tar# master-a配置解压到k8s目录
mkdir -p /etc/kubernetes
tar zxf /root/k8s_conf.tar.gz -C /etc/kubernetes/# 关闭swap
swapoff -a
sed -i 's/.*swap.*/#&/g' /etc/fstab# 配置内核参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
net.ipv6.conf.all.forwarding = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf# 允许转发
iptables -P FORWARD ACCEPT# 安装Kubernetes RPM包
yum -y localinstall k8s-rpm/*.rpmkubeadm join 192.168.1.150:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:8e13ce8a9e6ce68c4ba9b6b01ca98cff62a61d4d6c9b6063bd6b37aca19f7890 --control-plane
systemctl restart kubelet
systemctl status kubelet
查看端口占用
lsof -i:10250mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config安装nfs
mkdir tmp
tar zxf nfs/nfs.tar.gz -C tmp
yum -y localinstall tmp/nfs-rpm/*.rpm
systemctl start nfs
systemctl enable nfs外网安装
yum install nfs-utils
4.3 master-c配置
master-c的配置与master-b完全相同。
5. 工作节点配置
5.1 Ubuntu节点配置
# 更新系统并安装必要工具
apt-get update && apt-get install -y apt-transport-https ca-certificates curl software-properties-common# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -# 添加Docker仓库
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"# 安装Docker
apt-get update && apt-get install -y docker-ce=5:20.10.23~3-0~ubuntu-$(lsb_release -cs) docker-ce-cli=5:20.10.23~3-0~ubuntu-$(lsb_release -cs) containerd.io# 配置Docker
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}
EOF# 重启Docker
systemctl daemon-reload
systemctl restart docker
systemctl enable docker# 安装kubeadm、kubelet和kubectl
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet=1.23.16-00 kubeadm=1.23.16-00 kubectl=1.23.16-00# 关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab# 关闭防火墙
ufw disable# 加入集群
kubeadm join 192.168.1.150:6443 --token 661ic1.vgfsbtnxte96nldg \--discovery-token-ca-cert-hash sha256:8e13ce8a9e6ce68c4ba9b6b01ca98cff62a61d4d6c9b6063bd6b37aca19f7890安装nfs
apt-get install nfs-common
6. 常见问题解决方案
6.1 kubelet启动超时
error execution phase kubelet-start: error uploading crisocket: timed out waiting for the condition To see the stack trace of this error execute with --v=5 or higher
kubeadm reset -f
docker rm -f $(docker ps -a -q)
rm -rf /var/lib/cni/
systemctl daemon-reload
systemctl restart kubelet
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
6.2 CNI网络插件问题
~~
(combined from similar events): Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container “f4aac82f1a810b98057c8bb838deec809eb0750d703abcfb4a505ddcfb8406cd” network for pod “eip-nfs-nfs-client-6478c978c9-tqxld”: networkPlugin cni failed to set up pod “eip-nfs-nfs-client-6478c978c9-tqxld_kube-system” network: failed to delegate add: failed to set bridge addr: “cni0” already has an IP address different from 10.244.4.1/24
~~
rm -rf /etc/cni
ip link set cni0 down
ip link delete cni0
6.3 HAProxy端口绑定失败
高可用集群安装haproxy启动报告“Starting frontend api: cannot bind socket [0.0.0.0:6443]”的错误,可以执行以下命令
setsebool -P haproxy_connect_any=1
systemctl restart haproxy
6.4 Kubernetes证书过期
6.4.1 检查证书过期情况
kubeadm certs check-expiration
6.4.2 更新所有证书
kubeadm certs renew all
6.4.3 更新kubeconfig文件
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
6.4.4 重启相关服务
systemctl restart kubelet
docker ps | grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd' | awk '{print $1}' | xargs docker restart
7. 验证集群状态
在所有master节点上执行:
kubectl get nodes
kubectl get pods --all-namespaces
kubectl get cs
预期输出应显示所有节点状态为Ready,所有系统Pod运行正常,组件状态均为Healthy。
8. H3C路由器配置VIP
配置路径
高级选项 --->> 策略路由
详细配置参数
配置项 | 参数值 | 说明 |
---|---|---|
接口 | VLAN1 | 指定策略应用的VLAN接口 |
协议类型 | IP | 选择IP协议 |
源IP地址段 | 192.168.1.150-192.168.1.150 | 精确匹配单个源IP |
目的IP地址段 | 192.168.1.119-192.168.1.120 | 匹配目标IP范围 |
源端口 | 空 | 不限制源端口 |
目的端口 | 空 | 不限制目的端口 |
生效时间 | 空 | 全天生效 |
优先级 | 自动 | 由系统自动分配优先级 |
出接口 | WAN1 | 指定流量出口 |
是否启用 | 启用 | 启用该策略 |
描述 | LB-VIP,代理的是kube-api:6443端口 | 策略用途说明 |
配置说明
- 此策略将来自
192.168.1.150
访问192.168.1.119-120
的流量强制从WAN1接口转发 - 适用于k8s API Server(6443端口)的VIP代理场景
- 保持源/目的端口为空表示匹配所有端口流量
- 优先级自动分配可确保策略正常排序
注意事项
- 确保WAN1接口已正确配置
- 检查VLAN1接口状态是否UP
- 配置后建议测试连通性
相关文章:
Kubernetes 多主多从集群部署完整文档
好久不见呀!今天给大家整点干货尝尝(其实是自己的总结),主打的就是全程无尿点。 Kubernetes 多主多从集群部署完整文档 1. 机器列表 PS: master,lb,nfs机器均为CentOS 7,其他为Ubuntu 22.04 L…...
使用Spring Validation实现参数校验
引入Spring Validation 起步依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>参数校验失败异常处理 所有的http请求异常都会被拦截处理 exception…...
用思维导图解锁计算机科学导论的知识宝库
引言 在计算机科学的浩瀚海洋中,“计算机科学导论” 如同开启宝藏的钥匙,是众多学习者踏入这片领域的第一步。今天,我将借助思维导图这一强大工具,带大家梳理计算机科学导论的关键知识点,同时也希望能为大家在学习的道…...
软件架构分层策略对比及Go项目实践
一、水平分层 vs 功能划分 vs 组件划分 维度水平分层功能划分组件划分核心思想按垂直层次划分职责(如表示层、业务层、数据层)按业务功能模块划分(如用户管理、订单服务、支付模块)按技术或业务能力划分独立组件(如数…...
Python学习之Seaborn
Python学习之Seaborn 如果说Matplotlib试图让简单的事情变得容易,让困难的事情成为可能,那么Seaborn试图让一组定义明确的复杂的事情变得简单. Seaborn是在Matplotlib的基础上开发的高级可视化库, 它更专注于数据可视化的美学设计和统计图形的绘制. Matplotlib需要大量的代码创…...
【树莓派Pico FreeRTOS】-中断服务与二值信号量
中断服务与二值信号量 RP2040 由 Raspberry Pi 设计,具有双核 Arm Cortex-M0+ 处理器和 264KB 内部 RAM,并支持高达 16MB 的片外闪存。 广泛的灵活 I/O 选项包括 I2C、SPI 和独特的可编程 I/O (PIO)。 FreeRTOS 由 Real Time Engineers Ltd. 独家拥有、开发和维护。FreeRTO…...
QT采用cmake编译时文件解析
CMakeLists.txt # 设置版本要求 cmake_minimum_required(VERSION 3.16) # 设置项目名 project(QtWidgetsApplication3 LANGUAGES CXX)#设置C版本 set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON)find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core) fi…...
代码随想录背包问题完结
322. 零钱兑换 视频讲解:动态规划之完全背包,装满背包最少的物品件数是多少?| LeetCode:322.零钱兑换_哔哩哔哩_bilibili 代码随想录 该题在递推公式部分和474.一和零一样,求装多少个 不同在于 该题是完全背包&a…...
Java 内存优化:如何避免内存泄漏?
Java 内存优化:如何避免内存泄漏? 在 Java 开发中,内存管理是一个至关重要的主题。尽管 Java 拥有自动垃圾回收机制,但这并不意味着开发人员可以忽视内存管理。内存泄漏是一个常见的问题,如果不加以控制,可…...
数量关系 多级数列1
机械划分 真看不出来 无明显关系 后减前作差 分数数列 无规律 作乘 作积 太复杂啦 太复杂啦...
【AI提示词】物理学家
提示说明 物理学家是为那些希望深入了解物理学原理、探索宇宙奥秘或进行科学实验的用户设计的。这个专家能够提供精确的物理学概念解释、复杂的理论分析以及实验设计建议。 提示词 # 角色 物理学家## 注意 1. 物理学家专家应具备深厚的物理学知识和对科学探究的热情。 2. 专…...
黑马点评秒杀优化
异步优化秒杀业务 回顾之前的内容黑马点评 秒杀优惠券集群下一人一单超卖问题-CSDN博客,为了处理并发情况下的线程安全和数据一致性的问题,我们已经完成了查询优惠券信息、判断秒杀是否开始和结束、检查库存、用户ID加锁、创建订单和扣减库存。 尽管之前…...
宇树机器狗go2—slam建图(1)点云格式
0.前言 上一篇番外文章教大家如何在宇树机器狗go2的gazebo仿真环境中实现简单的导航运动,本期文章会教大家如何让宇树的机器狗go2在仿真环境中进行slam建图时经常会遇到的一些点云格式,在后续的slam建图和slam算法解析的时候会经常与这些点云信息打交道…...
支持中文对齐的命令行表格打印python库——tableprint
文章目录 快速入门 还在为表格中含有中文,命令行打印无法对齐而苦恼吗? 还在为冗长的数据添加代码而抓狂吗? tableprint来了!!!,它完美的解决了上述两个问题,快来试试吧!…...
力扣-hot100(无重复字符的最长子串)
3. 无重复字符的最长子串 中等 给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。暴力直观解法一࿱…...
javaNIO详解
Java NIO(Non-blocking I/O)详解 Java NIO(New I/O)是 Java 1.4 引入的高性能 I/O 框架,相比传统的 BIO(Blocking I/O),它提供了非阻塞、多路复用、零拷贝等能力,适用于…...
高精度算法(加、减、乘、除、阶乘和)
归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言📝 唯有主动付出,才有丰富的果…...
在复杂性的迷宫里寻找路标 —— 读《人月神话》有感
初读《人月神话》时,正值参与的第一个大型项目陷入泥潭:需求像不断膨胀的气球,团队规模从 10 人扩充到 30 人,进度却像被灌了铅的钟表,指针越来越沉重。布鲁克斯在书中写下的 "向进度落后的项目增加人力ÿ…...
OpenFeign终极指南:超时控制、重试策略、拦截器与自定义Starter
目录 前言 使用 引入依赖 开启feign 编写feign客户端 效果 日志 超时配置 重试机制 拦截器 Fallback兜底返回 引入依赖 编写兜底实现 连接池 引入依赖 开启连接池 制作OpenFeign Starter 编写配置类 自动装配 前言 在RPC框架中,有openFeign和Du…...
如何使用flatten函数在Terraform 中迭代嵌套map
简介 flatten 接受一个列表,并用列表内容的扁平序列替换列表中的任何元素。 > flatten([["a", "b"], [], ["c"]]) ["a", "b", "c"] > flatten([[["a", "b"], []], [&quo…...
数字电子技术基础(五十)——硬件描述语言简介
目录 1 硬件描述语言简介 1.1 硬件描述语言简介 1.2 硬件编程语言的发展历史 1.3 两种硬件描述的比较 1.4 硬件描述语言的应用场景 1.5 基本程序结构 1.5.1 基本程序结构 1.5.2 基本语句和描述方法 1.5.3 仿真 1 硬件描述语言简介 1.1 硬件描述语言简介 硬件描述语…...
【PCIE配置空间】
1 PCIE配置空间 1.1 软件如何知道PCIE设备是Swith,RC还是EP? –软件通过读取寄存器信息。 PCIE配置空间• PCIE寄存器;--PCIE配置协议规定必须实现的空间。--PCIE存在两种配置空间Type0/Type1;--Type0配置空间EP设备必须实现;-…...
Python爬虫实战:获取网易新闻数据
一、引言 随着互联网的飞速发展,网络上蕴含着海量的信息资源。新闻数据作为其中的重要组成部分,对于舆情分析、市场研究、信息传播等多个领域具有重要价值。网易新闻作为国内知名的新闻平台,拥有丰富多样的新闻内容。使用 Python 的 Scrapy 框架进行网易新闻数据的爬取,可…...
哲学家就餐问题(避免死锁)
解决方案: 策略:奇偶哲学家拿筷子顺序不同,破坏循环等待。 流程: 偶数哲学家先左后右。 奇数哲学家先右后左。 分析: 无死锁,哲学家交替进餐,不同拿筷顺序避免循环等待。 实验总结 遇到的…...
下采样(Downsampling)
目录 1. 下采样的定义与作用 2. 常见下采样方法 (1) 池化(Pooling) (2) 跨步卷积(Strided Convolution) (3) 空间金字塔池化(SPP) 3. PyTorch 实现示例 …...
OrbisGIS:基于Java开发的开源GIS软件
大家好,今天为大家介绍的软件是OrbisGIS:一款基于JAVA开发的开源的地理信息系统软件。下面,我们将从软件的主要功能、支持的系统、软件官网等方面对其进行简单的介绍。 OrbisGIS官网网址为:http://orbisgis.org/,Orbis…...
linux socket编程之udp(实现客户端和服务端消息的发送和接收)
目录 一.创建socket套接字(服务器端) 二.bind将prot与端口号进行绑定(服务器端) 2.1填充sockaddr_in结构 2.2bind绑定端口 三.直接通信(服务器端) 3.1接收客户端发送的消息 3.2给客户端发送消息 四.客户端通信 4.1创建socket套接字 4.2客户端bind问题 4.3直接通信即可…...
八大排序之直接插入排序
今天我们来学习八大排序中的直接插入排序。话不多说,直接上动图。 直接插入排序的主要思想是:当数组只有一个元素的时候,我们可以认为该数组是有序的。所以我们可以选择一个元素放进数组(一般为待排数据的第一个元素)…...
二级评论列表-Java实现
二级评论列表是很常见的功能,文章记录了新手用Java实现的具体逻辑。 整体实现逻辑是先用2个sql,分别查出两层数据。然后用java在service中实现数据组装,返给前端。这种实现思路好处是SQL简洁,逻辑分明,便于维护。 一…...
如何基于区块链进行虚拟电厂运营平台建设?
本项目旨在基于区块链技术建设虚拟电厂运营平台,以提升省内大用户及工业企业和工业园区的需求响应能力,优化能源结构配置,并推动能源交易、需求响应和现货交易等新型业态的发展。通过建设虚拟电厂,项目将实现工业企业及园区各供用…...
大学英语四级选词填空练习题解析
一、引言 大学英语四级考试中的选词填空部分,一直是不少同学的 “拦路虎”。它不仅要求我们有扎实的词汇基础,还需要具备良好的语境分析能力。今天,我们就通过一道练习题来深入剖析这类题型的解题思路。 二、题目内容 Leisure activities …...
基于控制台的小车导航游戏开发详解(C++实现)
本文将详细讲解一个基于C控制台的小车导航游戏项目。通过该项目可以学习二维数组操作、队列数据结构应用以及游戏循环控制等核心编程概念,特别适合刚接触游戏开发的初学者学习。 一、项目概述 1.1 游戏规则 玩家可创建多辆具有不同初始位置和移动速度的小车 每辆…...
详讲Linux下进程等待
3.进程等待 引言:什么是进程等待 想象有两个小伙伴,一个是 “大强”(父进程 ),一个是 “小强”(子进程 )。大强给小强安排了任务,比如去收集一些石头。 …...
数字孪生火星探测车,星际探索可视化
运用图扑构建数字孪生火星探测车,高精度还原外观与内部构造。实时映射探测车在火星表面的移动、探测作业及设备状态,助力科研人员远程监测、分析数据,为火星探索任务提供可视化决策支持。...
《JVM考古现场(二十三):归零者·重启奇点的终极奥义》
目录 楔子:归零者文明觉醒 上卷十维弦理论破译 第一章:JVM弦论代码考古 第二章:超膜引用解析算法 第三章:量子真空涨落监控 中卷归零者心法实战 第四章:宇宙重启倒计时引擎 第五章:内存奇点锻造术 第…...
设计测试用例模板
面试时问你一个场景,要你设计测试用例,你会怎么回答? 面试官让你设计一个功能的测试用例,比如“上传文件功能”,其实就是想考你: 思维是否全面能不能抓住重点会不会分类和使用测试方法有没有考虑异常情况…...
java怎么找bug?Arthas原理与实战指南
Arthas原理与实战指南 1. Arthas简介 Arthas是阿里巴巴开源的Java诊断工具,其名字取自《魔兽世界》的人物阿尔萨斯。它面向线上问题定位,被广泛应用于性能分析、定位问题、安全审计等场景。Arthas的核心价值在于它能够在不修改应用代码、不重启Java进程…...
2024年国考
数学 一,逻辑符号表示(3 分) 1,只有获得奥运会资格的运动员才可以参加奥运会,参加奥运会的云动员不一定获奖。 设: ( Q(x) ):运动员 ( x ) 获得奥运会资格( P(x) ):运动员 ( x )…...
fastlio用mid360录制的bag包离线建图,提示消息类型错误
我用mid360录制的bag包,激光雷达的数据类型是sensor_msgs::PointCloud2,但是运行fast_lio中的mid360 launch文件,会报错(没截图),显示无法从livox_ros_driver2::CustomMsg转换到sensor_msgs::PointCloud2。…...
015-C语言字符函数和字符串函数
C语言字符函数和字符串函数 文章目录 C语言字符函数和字符串函数1. 字符分类函数2. 字符转换函数3. strlen4. strcpy5. strcat6. strcmp7. strncpy8. strncat9. strncmp10. strstr11. strtok12. strerror 1. 字符分类函数 C语言中有一系列函数是专门做字符分类的,也…...
docker 搭建nacos 2.2.1版本单机版
通过docker-compose搭建 services:nacos:image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nacos/nacos-server:v2.2.1container_name: nacosenvironment:- PREFER_HOST_MODEhostname- MODEstandalone- NACOS_AUTH_ENABLEtrue- NACOS_AUTH_IDENTITY_KEYxiaogang- N…...
stack,queue和priority_queue
1. stack 1.1 stack 的介绍 栈是一种容器适配器,专门设计用于LIFO环境(后进先出),其中元素仅从容器的一端插入和提取。 容器适配器,也就是使用特定容器类的封装对象作为其底层容器,提供一组特定的成员函…...
服务治理-搭建Nacos注册中心
运行nacos.sql文件。 将准备好的nacos目录和nacos.tar包上传。 192.168.59.101是我的虚拟机ip,8848是我们设置的访问端口号。...
《Operating System Concepts》阅读笔记:p738-p747
《Operating System Concepts》学习第 63 天,p738-p747 总结,总计 10 页。 一、技术总结 1.network structure local-area networks (LAN)、wide-area networks (WAN). 2.communication structure naming and name resolution、communication proto…...
【Datawhale AI春训营】Java选手初探数据竞赛
自然语言处理基础: 自然语言处理(Natural Language Processing,NLP) 是计算机科学与人工智能领域中的一个极具挑战性和应用前景的研究方向。 它旨在使计算机能够理解、生成和处理人类的自然语言,从而实现人机高效交互。 NLP技术在搜索引擎、…...
React-useRef
如果我们想在hooks里面获同步取最新的值,那么则可以使用useRef, 关键源码如下: function mountRef<T>(initialValue: T): {|current: T|} {const hook mountWorkInProgressHook();const ref {current: initialValue};hook.memoizedState ref;re…...
得物官网sign签名逆向分析
打开得物官网,点击鞋类,可以看到请求 直接搜sign function p(e) {return f()("".concat(e ? s()(e).sort().reduce(function(t, n) {return "".concat(t).concat(n).concat(e[n])}, "") : "", "048a9…...
网络爬虫和前端相关知识
一 爬虫发展历史,概念与反爬机制 (一)爬虫发展历史 早期爬虫(1990s)起源 :早期的爬虫主要是为了构建搜索引擎。典型案例: Yahoo!人工目录 → 谷歌PageRank算法驱动的自动化爬虫。功能特点 :这些爬虫的功能比较单一,主要以抓取网页的文本内容为主,采用简单的广度优先…...
山东科技大学人工智能原理考试回忆复习资料
全部资料:https://mbd.pub/o/around_01 考试回忆版 简答题 人工智能定义 图灵测试基本思想 人工智能主要研究领域写八个以上 专家系统是什么及其特点 遗传算法流程图 综合题 语义网络表示 书上习题 证明S不满足性 用归结原理求问题 谁说真话假话的 书上例题…...
单元测试的一般步骤
Qt Test Qt Test 是 Qt 开发人员发布的一个单元测试框架,用于测试基于 Qt 框架的应用程序或库。它提供了单元测试框架中常见的所有功能以及用于测试图形用户界面的扩展。 1.自动化测试包络ui测试>接口测试>单元测试;现问如何使用Qt进行单元测试&…...