kubeadm部署k8s及高可用
目录
CNI 网络组件
1、flannel的功能
2、flannel的三种模式
3、flannel的UDP模式工作原理
4、flannel的VXLAN模式工作原理
5、Calico主要组成部分
6、calico的IPIP模式工作原理
7、calico的BGP模式工作原理
8、flannel 和 calico 的区别
Kubeadm部署k8s及高可用
1、环境准备
2、所有节点安装docker
3、所有节点安装kubeadm,kubelet和kubectl
4、所有master主机部署haproxy和keepalived实现高可用
5、部署K8S集群
6、部署网络插件flannel
续上一篇文章
CNI 网络组件
网络部署插件有fannel、calico、cilium等
主要介绍flannel和calico
flannel方案
需要在每个节点上把发向容器的数据包进行封装后,再用隧道将封装后的数据包发送到运行着目标Pod的node节点上。目标node节点再负责去掉封装,将去除封装的数据包发送到目标Pod上。数据通信性能则大受影响。
calico方案
Calico不使用隧道或NAT来实现转发,而是把Host当作Internet中的路由器,使用BGP同步路由,并使用iptables来做安全访问策略,完成跨Host转发来。
1、flannel的功能
让集群中的不同节点主机创建的 Docker 容器都具有全集群唯一的虚拟 IP 地址。
2、flannel的三种模式
- UDP 出现最早的模式,但是性能较差,基于flanneld应用程序实现数据包的封装/解封
- VXLAN 默认模式,是推荐使用的模式,性能比UDP模式更好,基于内核实现数据帧的封装/解封装,配置简单使用方便
- HOST-GW 性能最好的模式,但是配置复杂,且不能跨网段
3、flannel的UDP模式工作原理
1)原始数据包从源主机的Pod容器经过cni0网桥转发到flannel0虚拟接口
2)flanneld进程负责监听flannel0接口收到的数据,并将源数据包封装到UDP报文中
3)然后flanneld进程通过查询etcd中维护的路由表,找到目标Pod所在的node节点的nodeIP,然后将nodeIP封装在UDP报文外,最后通过物理网卡发送到目标node节点
4)数据报文通过8285端口送到目标node节点的flanneld进程进行解封装,再由flannel0虚接口经过cni0网桥转发到目标Pod容器
4、flannel的VXLAN模式工作原理
1)原始数据帧从源主机的Pod容器经过cni0网桥接口转发到flannel.1虚接口
2)flannel.1虚接口收到数据帧后添加VXLAN头部,并在内核将原始数据帧封装到UDP报文中
3)flanneld进程根据etcd中维护的路由表经过物理网卡发送到目标Pod所在的node节点
4)数据报文通过8472端口发送到目标node节点的flannel.1虚接口,在由flannel.1虚接口经过cni0网桥发送到目标Pod容器
5、Calico主要组成部分
- Felix:负责维护宿主机上的路由规则、FIB转发信息库等。
- BIRD:负责分发路由规则,类似路由器。
- Confd:配置管理组件。
Calico CNI插件:主要负责与kubernetes对接,供kubelet调用使用。
6、calico的IPIP模式工作原理
1)原始数据包源主机的Pod容器发送到tunl0接口,然后在内核的IPIP驱动封装到节点网络的IP报文中
2)再由tunl0接口的路由经过物理网卡发送到目标node节点
3)IP数据报文到达目标node节点后,再通过内核的IPIP驱动解包得到原始的IP数据包
4)最后根据本地的路由规则经过veth pair设备送达目标Pod容器
7、calico的BGP模式工作原理
本质就是通过路由规则来维护Pod之间的通信,Felix负责维护路由规则和网络接口管理,BIRD负责分发路由信息给其它节点
1)源主机的Pod容器发出的原始IP数据包会通过veth pair设备送达到节点网络空间
2)然后会根据原始IP数据包中的目标IP和节点的路由规则找到目标node节点的IP,再经过物理网卡发送到目标node节点
3)IP数据包到达目标node节点后,会根据本地的路由规则经过veth pair设备送达到目标Pod容器
8、flannel 和 calico 的区别
1)flannel的网络模式有UDP、VXLAN、HOST-GW
2)calico的网络模式有IPIP、BGP、混合模式
3)flannel的默认网段是10.244.0.0/16,而calico的默认网段是192.168.0.0/16
4)flannel适合用于小型架构和架构不复杂的场合,而calico适合用于大型架构和架构复杂的场合
Kubeadm部署k8s及高可用
| master01 | 192.168.3.100 | docker、kubeadm,kubelet、kubectl、haproxy和keepalived |
| master02 | 192.168.3.101 | docker、kubeadm,kubelet、kubectl、haproxy和keepalived |
| master03 | 192.168.3.102 | docker、kubeadm,kubelet、kubectl、haproxy和keepalived |
| node01 | 192.168.3.103 | docker、kubeadm,kubelet和kubectl |
| node02 | 192.168.3.104 | docker、kubeadm,kubelet和kubectl |
1、环境准备
//所有节点,关闭防火墙规则,关闭selinux,关闭swap交换
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab

//分别修改主机名
hostnamectl set-hostname master01
hostnamectl set-hostname master02
hostnamectl set-hostname master03
hostnamectl set-hostname node01
hostnamectl set-hostname node02

//所有节点修改hosts文件
vim /etc/hosts
192.168.3.100 master01
192.168.3.101 master02
192.168.3.102 master03
192.168.3.103 node01
192.168.3.104 node02

//所有节点时间同步
yum -y install ntpdate
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' >/etc/timezone
ntpdate time2.aliyun.com
//设置周期性任务做时间同步
systemctl enable --now crond
crontab -e
*/30 * * * * /usr/sbin/ntpdate time2.aliyun.com


//所有节点实现Linux的资源限制
vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 65535
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited

//调整内核参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF#生效参数
sysctl --system


//加载 ip_vs 模块
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done

2、所有节点安装docker
//下载依赖环境
yum install -y yum-utils device-mapper-persistent-data lvm2
//下载docker的repo源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
//下载docker
yum install -y docker-ce docker-ce-cli containerd.io



//设置docker加速拉取镜像
cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://6na95ym4.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "500m", "max-file": "3"}
}
EOF
//重载systemd管理文件
systemctl daemon-reload
//设置开启自启docker服务,并立即开启docker
systemctl enable --now docker.service

3、所有节点安装kubeadm,kubelet和kubectl
//定义kubernetes源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
//下载
yum install -y kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15

//配置Kubelet使用阿里云的pause镜像
cat > /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2"
EOF//开机自启kubelet
systemctl enable --now kubelet
//此时会发现kubelet启动不成功
systemctl status kubelet

4、所有master主机部署haproxy和keepalived实现高可用
//所有 master 节点部署 Haproxy
yum -y install haproxy keepalivedcat > /etc/haproxy/haproxy.cfg << EOF
globallog 127.0.0.1 local0 infolog 127.0.0.1 local1 warningchroot /var/lib/haproxypidfile /var/run/haproxy.pidmaxconn 4000user haproxygroup haproxydaemonstats socket /var/lib/haproxy/statsdefaultsmode tcplog globaloption tcplogoption dontlognulloption redispatchretries 3timeout queue 1mtimeout connect 10stimeout client 1mtimeout server 1mtimeout check 10smaxconn 3000frontend monitor-inbind *:33305mode httpoption httplogmonitor-uri /monitorfrontend k8s-masterbind *:6444mode tcpoption tcplogdefault_backend k8s-masterbackend k8s-mastermode tcpoption tcplogoption tcp-checkbalance roundrobinserver k8s-master1 192.168.3.100:6443 check inter 10000 fall 2 rise 2 weight 1server k8s-master2 192.168.3.101:6443 check inter 10000 fall 2 rise 2 weight 1server k8s-master3 192.168.3.102:6443 check inter 10000 fall 2 rise 2 weight 1
EOF

//所有 master 节点部署 keepalived
yum -y install keepalivedcd /etc/keepalived/vim keepalived.conf
! Configuration File for keepalived
global_defs {router_id LVS_HA1 #路由标识符,每个节点配置不同
}vrrp_script chk_haproxy {script "/etc/keepalived/check_haproxy.sh"interval 2weight 2
}vrrp_instance VI_1 {state MASTER #master01上设置MASTER、master02和master03上设置BACKUPinterface ens33virtual_router_id 51priority 100 #本机初始权重,备机设置小于主机的值advert_int 1virtual_ipaddress {192.168.3.254 #设置VIP地址}track_script {chk_haproxy}
}



//编写haproxy的健康检查脚本
vim check_haproxy.sh
#!/bin/bash
if ! killall -0 haproxy; thensystemctl stop keepalived
fi//并给脚本执行权限
chmod +x chk_haproxy.sh//开机自启haproxy和keepalived
systemctl enable --now haproxy
systemctl enable --now keepalived



5、部署K8S集群
//在 master01 节点上设置集群初始化配置文件
kubeadm config print init-defaults > /opt/kubeadm-config.yamlcd /opt/
vim kubeadm-config.yaml
......
11 localAPIEndpoint:
12 advertiseAddress: 192.168.3.100 #指定当前master节点的IP地址
13 bindPort: 644321 apiServer:
22 certSANs: #在apiServer属性下面添加一个certsSANs的列表,添加所有master节点的IP地址和集群VIP地址
23 - 192.168.3.254
24 - 192.168.3.100
25 - 192.168.3.101
26 - 192.168.3.10230 clusterName: kubernetes
31 controlPlaneEndpoint: "192.168.3.100:6444" #指定集群VIP地址
32 controllerManager: {}38 imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #指定镜像下载地址
39 kind: ClusterConfiguration
40 kubernetesVersion: v1.20.15 #指定kubernetes版本号
41 networking:
42 dnsDomain: cluster.local
43 podSubnet: "10.244.0.0/16" #指定pod网段,10.244.0.0/16用于匹配flannel默认网段
44 serviceSubnet: 10.96.0.0/16 #指定service网段
45 scheduler: {}
#末尾再添加以下内容
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs #把默认的kube-proxy调度方式改为ipvs模式

#更新集群初始化配置文件
kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml

#拷贝yaml配置文件给其他主机,通过配置文件进行拉取镜像
for i in master02 master03 node01 node02; do scp /opt/new.yaml $i:/opt/; done

//拉取镜像
kubeadm config images pull --config /opt/new.yaml

//master01 节点进行初始化
kubeadm init --config new.yaml --upload-certs | tee kubeadm-init.log


//master01 节点进行环境配置
#配置 kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config//然后重启kubelet服务
systemctl restart kubelet

//所有节点加入集群
#master 节点加入集群
kubeadm join 192.168.3.254:6444 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:e1434974e3b947739e650c13b94f9a2e864f6c444b9a6e891efb4d8e1c4a05b7 \--control-plane --certificate-key fff2215a35a1b54f9b39882a36644b19300b7053429c43a1a713e4ed791076c4//然后在每个master节点也会提示接下来需要做什么
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config


//node 节点加入集群
kubeadm join 192.168.3.254:6444 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:e1434974e3b947739e650c13b94f9a2e864f6c444b9a6e891efb4d8e1c4a05b7


//在 master01 查看集群信息
kubectl get nodes

6、部署网络插件flannel
所有节点上传 flannel 镜像 flannel.tar 和网络插件 cni-plugins-linux-amd64-v0.8.6.tgz 到 /opt 目录,master节点上传 kube-flannel.yml 文件
cd /opt
docker load < flannel.tarmv /opt/cni /opt/cni_bak
mkdir -p /opt/cni/bin
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/binkubectl apply -f kube-flannel.yml



再次查看集群信息
//在 master01 查看集群信息
kubectl get nodes

最后验证一下
kubectl get pod -n kube-system

相关文章:
kubeadm部署k8s及高可用
目录 CNI 网络组件 1、flannel的功能 2、flannel的三种模式 3、flannel的UDP模式工作原理 4、flannel的VXLAN模式工作原理 5、Calico主要组成部分 6、calico的IPIP模式工作原理 7、calico的BGP模式工作原理 8、flannel 和 calico 的区别 Kubeadm部署k8s及高可用 1、…...
GEE:将鼠标变成十字指针,点击获取影像值,显示值到UI中
作者:CSDN @ _养乐多_ 本文记录了在 Google Earth Engine(GEE)开发中,将鼠标变成十字指针,点击获取影像值,显示值到UI中的代码片段。这段代码复制过去修改变量名就可以用了。 效果如下图所示, 文章目录 一、代码片段一、代码片段 使用的时候将 YLDImage 变量换成你屏…...
SpringBoot 项目公共字段填充
[公共字段自动填充] 核心:在切面类中捕获需要填充公共字段的 Mapper 方法,方法上使用注解加以标识,通过反射拿到需要填充的字段赋值方法,进行赋值操作 1、自定义注解 AutoFill Target(ElementType.METHOD) Retention(RetentionPo…...
分布式搜索引擎ES
文章目录 初识elasticsearch了解ES倒排索引正向索引倒排索引正向和倒排 es的一些概念文档和字段索引和映射mysql与elasticsearch 安装ES部署kibana安装IK分词器扩展词词典停用词词典 索引库操作mapping映射属性索引库的CRUD创建索引库和映射查询索引库修改索引库删除索引库 文档…...
2023年05月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 下列程序段的运行结果是?( ) def s(n):if n==0:return 1else:...
@KafkaListener注解详解(一)| 常用参数详解
KafkaListener 注解提供了许多可配置的参数,以便更灵活地定制 Kafka 消息监听器的行为。 topics: 描述: 指定监听的 Kafka 主题,可以是一个字符串数组。这是最基本的参数,它定义了监听器将从哪个或哪些主题接收消息。…...
蓝桥杯算法双周赛心得——被替换的身份证(分类讨论)
大家好,我是晴天学长,分类讨论一定要细节啊,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪 1) .被替换的身份证 2) .算法思路 假设一方获胜 1.接受数据 2.假设潜梦醒 无非就是&am…...
实验一:人工智能之启发式搜索算法(含源码+实验报告)
✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :hfut实验课设 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远是个观众。平台再好,你不参与,永远是局外人。能力再大,你不行动,只能看别人成功!没有人会关心你付出过多少…...
C++学习 --类和对象之封装
目录 1, 什么是封装 2, 创建类 3, 权限控制 3-1, public权限 3-2, private权限 3-3, protected权限 3-4, 类外访问私有属性 4, 构造函数 4-2,创建构造函数 4-2…...
在Spring Boot中使用JTA实现对多数据源的事务管理
了解事务的都知道,在我们日常开发中单单靠事务管理就可以解决绝大多数问题了,但是为啥还要提出JTA这个玩意呢,到底JTA是什么呢?他又是具体来解决啥问题的呢? JTA JTA(Java Transaction API)是…...
介绍YOLO-NAS Pose:姿势估计的技术
YOLO-NAS 姿势 YOLO-NAS Pose models是对 Pose Estimation 领域的最新贡献。今年早些时候,Deci 因其突破性的目标检测基础模型 YOLO-NAS 获得了广泛认可。在 YOLO-NAS 成功的基础上,该公司现在推出了 YOLO-NAS Pose 作为其姿势估计的对应产品。该姿势模型在延迟和准确性之间…...
计算机毕业设计 基于SpringBoot的实训管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
Python开发运维:Python3.7使用QQ邮箱发送不同类型邮件
目录 一、理论 1.邮件发送 二、实验 1.Python3.7使用QQ邮箱发送普通邮件 2.Python3.7使用QQ邮箱发送包含图片与附件的邮件 三、问题 1.Pycharm中如何放大和缩小代码界面 一、理论 1.邮件发送 (1)概念 SMTP(Simple Mail Transfer Pro…...
二十三种设计模式全面解析-解密迭代器模式:探索遍历之道
在软件开发中,遍历数据集合是一个非常常见的需求。但是,如何以一种优雅、灵活的方式遍历集合,并且能够适应各种不同的数据结构和迭代方式,一直是开发者们面临的挑战。今天,我将带你深入探索迭代器模式(Iter…...
kubernetes istio
目录 一、部署 二、部署示例应用 三、部署遥测组件 四、流量管理 五、熔断 官网:https://istio.io/latest/zh/about/service-mesh/ 一、部署 提前准备好文件 tar zxf 15t10-1.19.3-linux-amd64.tar.gz cd 15t10-1.19.3/ export PATH$PWD/bin:$PATHistioctl install …...
25期代码随想录算法训练营第十四天 | 二叉树 | 递归遍历、迭代遍历
目录 递归遍历前序遍历中序遍历后序遍历 迭代遍历前序遍历中序遍历后序遍历 递归遍历 前序遍历 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # …...
常用布局以及其优缺点
当涉及到设计和排版时,有许多不同的布局方式可供选择。以下是几种常见的布局方式以及它们的优缺点: 流式布局(Fluid Layout): 优点:能够根据屏幕大小自动调整内容,适应不同设备。灵活性高&#…...
海康工业相机如何提高相机帧率
影响帧率的因素 相机参数 帧率限制使能 像素格式 曝光时间 数据包大小(网口) 相机默认参数 ADC位深 系统环境设置...
Linux之IPC通信共享内存(一次拷贝)与消息队列、管道、信号量、socket(两次拷贝)总结(六十二)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...
【多线程 - 01、概述】
进程 几乎所有的操作系统都支持进程概念,进程是处于运行过程中的程序,进程是操作系统中进行资源分配的基本单位。 三个基本特征 独立性:指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。而对于未建立任何进程的程序&…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
深度解析:etcd 在 Milvus 向量数据库中的关键作用
目录 🚀 深度解析:etcd 在 Milvus 向量数据库中的关键作用 💡 什么是 etcd? 🧠 Milvus 架构简介 📦 etcd 在 Milvus 中的核心作用 🔧 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...
【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法
使用 ROS1-Noetic 和 mavros v1.20.1, 携带经纬度海拔的话题主要有三个: /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码,来分析他们的发布过程。发现前两个话题都对应了同一…...
【Qt】控件 QWidget
控件 QWidget 一. 控件概述二. QWidget 的核心属性可用状态:enabled几何:geometrywindows frame 窗口框架的影响 窗口标题:windowTitle窗口图标:windowIconqrc 机制 窗口不透明度:windowOpacity光标:cursor…...
