CKA认证 | 使用kubeadm部署K8s集群(v1.26)

news2024/12/25 10:17:56

一、前置知识点

1.1 生产环境可部署Kubernetes集群的两种方式

目前生产部署Kubernetes集群主要有两种方式:

① kubeadm

Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。

② 二进制包

从github下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。

这里采用kubeadm搭建集群

kubeadm工具功能:

  • kubeadm init:初始化一个Master节点
  • kubeadm join:将工作节点加入集群
  • kubeadm upgrade:升级K8s版本
  • kubeadm token:管理 kubeadm join 使用的令牌
  • kubeadm reset:清空 kubeadm init 或者 kubeadm join 对主机所做的任何更改
  • kubeadm version:打印 kubeadm 版本
  • kubeadm alpha:预览可用的新功能

1.2 准备环境

服务器要求:

  • 建议最小硬件配置:2核CPU、2G内存、20G硬盘
  • 服务器最好可以访问外网,会有从网上拉取镜像需求,如果服务器不能上网,需要提前下载对应镜像并导入节点

软件环境:

软件

版本

操作系统

CentOS7.9_x64 (mini)

Docker

20-ce

Kubernetes

1.26

服务器规划:

角色

IP

主机名

k8s-master

192.168.1.71

k8s-master-1-71

k8s-node1

192.168.1.72

k8s-node1-1-72

k8s-node2

192.168.1.73

k8s-node2-1-73

架构图:

二、环境准备

2.1 操作系统初始化配置(所有节点

1)设置网卡命名(不强求)

cat /etc/default/grub
...
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifnames=0 biosdevname=0"

...
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot    //重启生效

2)配置IP地址(以1.71为例)

[root@k8s-master-1-71 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0

IPADDR=192.168.1.71
PREFIX=24
GATEWAY=192.168.1.254
DNS1=223.5.5.5
...

3)关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

4)关闭 selinux

setenforce 0  # 临时配置
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久配置

5)关闭 swap

swapoff -a  # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久

6)根据规划设置主机名

hostnamectl set-hostname <hostname>

7)添加 hosts 解析

cat >> /etc/hosts << EOF
192.168.1.71 k8s-master
192.168.1.72 k8s-node1
192.168.1.73 k8s-node2
EOF

8)将桥接的IPv4流量传递到iptables的链

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system  # 生效

9)配置YUM源

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

10)时间同步

yum install ntpdate -y
ntpdate time.windows.com
(echo "*/5 * * * * /usr/sbin/ntpdate -u time.windows.com") | crontab
crontab -l
*/5 * * * * /usr/sbin/ntpdate -u time.windows.com

11)配置内核模块

cat >> /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF

systemctl restart systemd-modules-load.service

lsmod | grep -e ip_vs -e nf_conntrack
ip_vs_sh 16384 0
ip_vs_wrr 16384 0
ip_vs_rr 16384 0
ip_vs 155648 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 139264 1 ip_vs
nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
nf_defrag_ipv4 16384 1 nf_conntrack
libcrc32c 16384 4 nf_conntrack,btrfs,raid456,ip_vs

12)内核参数调优

cat <<EOF >> /etc/sysctl.conf
fs.file-max = 6815744
fs.nr_open = 1048576
net.ipv4.tcp_max_tw_buckets = 102400
net.ipv4.tcp_max_syn_backlog = 20480
net.core.somaxconn = 102400
net.core.netdev_max_backlog = 32768
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv6.conf.all.forwarding = 1
EOF

13)下载基本软件

yum -y install wget vim net-tools jq telnet lvm2 git tar curl nfs-kernel-server chrony bash-completion

2.2 安装 Docker / kubeadm / kubelet(所有节点

2.2.1 安装Docker

# 下载 docker 镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

# 安装 docker-ce
yum -y install docker-ce

# 开启 docker 开机自启
systemctl enable docker && systemctl start docker

# 查看docker版本
docker --version
Docker version 23.0.1, build a5ee5b1

2.2.2 配置镜像下载加速器

cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl restart docker

docker info    //查看docker信息
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.10.2
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.16.0
    Path:     /usr/libexec/docker/cli-plugins/docker-compose
  scan: Docker Scan (Docker Inc.)
    Version:  v0.23.0
    Path:     /usr/libexec/docker/cli-plugins/docker-scan
...
 Registry Mirrors:
  https://b9pmyelo.mirror.aliyuncs.com/
 Live Restore Enabled: false

参考:配置Docker镜像加速器-阿里云开发者社区

 2.2.3 安装cri-dockerd(CRI容器运行时)

Kubernetes v1.24 移除 docker-shim 的支持,而Docker Engine默认又不支持CRI标准,因此二者默认无法再直接集成。为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI规范的桥梁,从而能够让Docker作为Kubernetes容器引擎。如图所示:

补充:containerd 是自带CRI,不需要 cri-docker 的支持,且 containerd 是集成在dockerd 中的;

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1-3.el7.x86_64.rpm
rpm -ivh cri-dockerd-0.3.1-3.el7.x86_64.rpm

指定依赖镜像地址:

vi /usr/lib/systemd/system/cri-docker.service
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
systemctl daemon-reload 
systemctl enable cri-docker && systemctl start cri-docker

2.2.4 添加阿里云YUM软件源

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

2.2.5 安装kubeadm、kubelet 和 kubectl

由于版本更新频繁,这里指定版本号部署(注意,是所有节点安装)

yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
systemctl enable kubelet

三、部署 k8s 集群

  • 安装目录:/etc/kubernetes/
  • 组件配置文件目录:/etc/kubernetes/manifests/

3.1 部署Kubernetes Master

在 k8s-Master 执行(192.168.1.71

kubeadm init \
  --apiserver-advertise-address=192.168.1.71 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.26.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --cri-socket=unix:///var/run/cri-dockerd.sock \
  --ignore-preflight-errors=all
  • --apiserver-advertise-address 集群通告地址
  • --image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
  • --kubernetes-version K8s版本,与上面安装的一致
  • --service-cidr 集群内部虚拟网络,Pod统一访问入口
  • --pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致
  • --cri-socket 指定cri-dockerd接口,如果是containerd则使用--cri-socket unix:///run/containerd/containerd.sock
  • --ignore-preflight-errors=all,忽略所有错误告警

初始化完成后,会输出以下信息,其中有一个join命令,需记住,在后面步骤将会使用

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf
kubeadm join 192.168.1.71:6443 --token 0c2d3a.awbn79ctop2plelx \
        --discovery-token-ca-cert-hash sha256:7d286f2200085684c82ec9c08ef93df391ce4437d17360f9d4f5f0baf275bc57

拷贝 kubectl 使用的连接k8s认证文件到默认路径(admin.conf 文件拷贝到所有节点的 $HOME/.kube/config,即可以在每个节点使用 kubectl get nodes查看集群

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

注意:由于网络插件还没有部署,还没有准备就绪 NotReady

参考资料:

  • kubeadm init | Kubernetes
  • Creating a cluster with kubeadm | Kubernetes

3.2 加入Kubernetes Node

在 k8s-Node 工作节点执行(192.168.1.72/73

向集群添加新节点,将刚刚执行在 kubeadm init 输出中的 kubeadm join 命令,并手动加上相关

--cri-socket=unix:///var/run/cri-dockerd.sock

kubeadm join 192.168.1.71:6443 --token 0c2d3a.awbn79ctop2plelx \
        --discovery-token-ca-cert-hash sha256:7d286f2200085684c82ec9c08ef93df391ce4437d17360f9d4f5f0baf275bc57 --cri-socket=unix:///var/run/cri-dockerd.sock

默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:

kubeadm token create --print-join-command

参考资料:kubeadm join | Kubernetes

3.3 部署容器网络(CNI) (k8s-master上运行)

Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案

# 下载 calico 相关yaml文件
wget https://docs.projectcalico.org/v3.23/manifests/calico.yaml

下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样(例如:10.244.0.0/16 )

- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16"

修改完后文件后进行部署:

[root@k8s-master-1-71 ~]# kubectl apply -f calico.yaml
[root@k8s-master-1-71 ~]# kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-79568db7f8-7b8qt   1/1     Running   0          10h
calico-node-52hzv                          1/1     Running   0          10h
calico-node-hwlxn                          1/1     Running   0          10h
calico-node-qngqv                          1/1     Running   0          10h
coredns-5bbd96d687-58m5t                   1/1     Running   0          10h
coredns-5bbd96d687-dxwth                   1/1     Running   0          10h
etcd-k8s-master-1-71                       1/1     Running   0          10h
kube-apiserver-k8s-master-1-71             1/1     Running   0          10h
kube-controller-manager-k8s-master-1-71    1/1     Running   0          10h
kube-proxy-2np4n                           1/1     Running   0          10h
kube-proxy-ch5qf                           1/1     Running   0          10h
kube-proxy-sw9qt                           1/1     Running   0          10h
kube-scheduler-k8s-master-1-71             1/1     Running   0          10h

参考资料:Creating a cluster with kubeadm | Kubernetes

3.4 部署 Dashboard

Dashboard是官方提供的一个UI,可用于基本管理K8s资源。

YAML下载地址:https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:

vi recommended.yaml
...
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001      # 添加 nodePort: 30001
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort      # 添加 nodePort
...
kubectl apply -f recommended.yaml

[root@k8s-master-1-71 ~]# kubectl get pods -n kubernetes-dashboard
NAME                                        READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-7bc864c59-hwnkh   1/1     Running   0          10h
kubernetes-dashboard-6c7ccbcf87-pts92       1/1     Running   0          10h

创建 service account 并绑定默认 cluster-admin 管理员集群角色:

# 创建用户
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
# 用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
# 获取用户Token
kubectl create token dashboard-admin -n kubernetes-dashboard

访问地址:https://NodeIP:30001,使用输出的 token 登录 Dashboard

四、容器引擎Containerd(与Docker二选一)

containerd 是一个主流的容器引擎,与Docker相兼容,相比Docker轻量很多,containerd 是自带CRI,不需要 cri-docker 的支持,且 containerd 是集成在dockerd 中的,目前较为成熟。

自 1.24 版起,Dockershim 已从 Kubernetes 项目中移除,间接的希望能够从 containerd 作为今后的容器引擎,而当前主流的容器依旧还是 docker

参考资料:容器运行时 | Kubernetes

4.1 安装 containerd 容器

情况1:在未有安装 docker-ce 的情况下,需自己手动安装 containerd

① 解决内核模块及参数优化

# 将桥接的IPv4流量传递到iptables的链
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sudo sysctl --system   # 应用 sysctl 参数而不重新启动

# 通过运行以下指令确认 br_netfilter 和 overlay 模块被加载:
lsmod | grep br_netfilter
lsmod | grep overlay

② 下载安装 containerd

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y containerd.io

情况2:如果是由 docker 切换 containerd 以上①、②可省略

4.2 修改配置文件

生成 containerd config 配置文件

mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml    # 生成配置文件

修改配置文件主要内容如下:

  • pause镜像设置阿里云镜像仓库地址
  • 拉取Docker Hub镜像配置加速地址设置为阿里云镜像仓库地址
vi /etc/containerd/config.toml
...
   [plugins."io.containerd.grpc.v1.cri"]
      sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"      //设置阿里云镜像仓库地址
       ...
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors]          //在该plugins下添加以下2行,主要设置阿里云镜像加速器地址
          [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
            endpoint = ["https://b9pmyelo.mirror.aliyuncs.com"] 
           
systemctl restart containerd

4.3 配置kubelet使用containerd

修改容器运行时为 /run/containerd/containerd.sock

ls /run/containerd/containerd.sock

vi /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8"

systemctl restart kubelet

# 验证
kubectl get node -o wide

k8s-node1  xxx  containerd://1.5.6

# 如果需要停用原来的 docker-ce,停止cri-docker即可
systemctl stop cri-docker

如果需要将containerd再切换回docker,则将步骤回滚即可

4.4 管理容器工具 crictl

由于 containerd 默认提供的是 ctr 命令行工具管理容器,但功能比较简单,所以由社区开源的crictl工具去检查和调试容器,也可适配其它的容器运行时。

项目地址:GitHub - kubernetes-sigs/cri-tools: CLI and validation tools for Kubelet Container Runtime Interface (CRI) .

# 设置 crictl 工具连接 containerd :
vi /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock    //指定容器运行时的接口
image-endpoint: unix:///run/containerd/containerd.sock      //指定容器的接口
timeout: 10                //超时时间
debug: false               //debug输出

4.5 docker与crictl命令对照表

镜像相关功能

Docker

Containerd(crictl)

显示本地镜像列表

docker images

crictl images

下载镜像

docker pull

crictl pull

上传镜像

docker push

无,例如buildk

删除本地镜像

docker rmi

crictl rmi

查看镜像详情

docker inspect IMAGE-ID

crictl inspect IMAGE-ID

容器相关功能

Docker

Containerd(crictl)

显示容器列表

docker ps

crictl ps

创建容器

docker create

crictl create

启动容器

docker start

crictl start

停止容器

docker stop

crictl stop

删除容器

docker rm

crictl rm

查看容器详情

docker inspect

crictl inspect

附加容器

docker attach

crictl attach

执行命令

docker exec

crictl exec

查看日志

docker logs

crictl logs

查看容器资源

docker stats

crictl stats

POD 相关功能

Docker

Containerd(crictl)

显示 POD 列表

crictl pods

查看 POD 详情

crictl inspectp

运行 POD

crictl runp

停止 POD

crictl stopp

小结:

本篇为 【Kubernetes CKA认证】的开篇学习笔记,希望这篇笔记可以让您初步了解到 如何使用kubeadm部署1.26版本的K8s集群,不妨跟着我的笔记步伐亲自实践一下吧!


Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何安装和配置JDK17

教程目录 零、引言1、新特性概览2、性能优化3、安全性增强4、其他改进5、总结 一、下载安装二、环境配置三、测试验证 零、引言 JDK 17&#xff08;Java Development Kit 17&#xff09;是Java平台的一个重要版本&#xff0c;它带来了许多新特性和改进&#xff0c;进一步提升了…

第2章2.3立项【硬件产品立项的核心内容】

硬件产品立项的核心内容 2.3 硬件产品立项的核心内容2.3.1 第一步&#xff1a;市场趋势判断2.3.2 第二步&#xff1a;竞争对手分析1.竞争对手识别2.根据竞争对手分析制定策略 2.3.3 第三步&#xff1a;客户分析2.3.4 第四步&#xff1a;产品定义2.3.5 第五步&#xff1a;开发执…

一款革命性的视频剪辑工具,AI剪辑新纪元:Clapper

如果说AI视频剪辑工具哪家强&#xff1f;还真想不出有什么让人眼前一亮的AI视频剪辑应用。 毕竟随着AI技术的发展越来越快&#xff0c;各种AI应用如雨后春笋般涌现&#xff0c;然而&#xff0c;真正能够在视频剪辑领域脱颖而出的工具却寥寥无几。 今天我要介绍的 Clapper 就是…

递归函数学习 part1

一&#xff0c;初始递归&#xff1a;阶乘 1&#xff0c;原理 n的阶乘等于n乘以n-1的阶乘&#xff0c;而0的阶乘等于1. 2&#xff0c;代码展示 #include <iostream> using namespace std;int fact(int); int main() {cout<<fact(5);return 0; }int fact(int n) …

解决程序因缺少xinput1_3.dll无法运行的有效方法,有效修复丢失xinput1_3.dll

如果你的电脑在运行某些应用程序或游戏时提示“xinput1_3.dll丢失”或“找不到xinput1_3.dll”的错误消息&#xff0c;那么很可能是因为你的系统中缺少这个重要的DLL文件而导致的问题。那么电脑出现xinput1_3.dll丢失的问题时有哪些方法进行修复呢&#xff1f; 如何确定电脑是否…

深入了解区块链:Web3的基础架构与发展

在数字时代的浪潮中&#xff0c;区块链技术正逐渐成为Web3的重要基础&#xff0c;重新定义互联网的结构和用户体验。Web3不仅是一个全新的网络阶段&#xff0c;更代表了一种去中心化的理念&#xff0c;强调用户主权和数据隐私。本文将深入探讨区块链在Web3中的基础架构、技术特…

内核tracepoint的注册回调及添加的方法

一、背景 内核开发时往往需要做一些内核态函数的监测或者内核状态的监测&#xff0c;就需要用一些调试手段来观测。常用的内核态的观测如kprobe和tracepoint&#xff0c;但是kprobe往往受制于一些系统的限制&#xff0c;很多系统并没有打开kprobe选项&#xff0c;这样我们不能…

React融合css

单纯使用tsx文件生成的页面比较单一&#xff0c;可以考虑结合css进行使用&#xff0c;需要说明的是&#xff0c;本人水平有限&#xff0c;仅对接触过的几种方式进行说明 内联样式 内联样式也有多种写法&#xff0c;此处仅列举两种比较简单的写法 写法一 import React from …

【大数据学习 | kafka高级部分】kafka中的选举机制

controller的选举 首先第一个选举就是借助于zookeeper的controller的选举 第一个就是controller的选举&#xff0c;这个选举是借助于zookeeper的独享锁实现的&#xff0c;先启动的broker会在zookeeper的/contoller节点上面增加一个broker信息&#xff0c;谁创建成功了谁就是主…

【基于PSINS工具箱】以速度为观测量的SINS/GNSS组合导航,UKF滤波

基于【PSINS工具箱】&#xff0c;提供一个MATLAB例程&#xff0c;仅以速度为观测量的SINS/GNSS组合导航&#xff08;滤波方式为UKF&#xff09; 文章目录 工具箱程序简述运行结果 代码程序讲解MATLAB 代码教程&#xff1a;使用UKF进行速度观测1. 引言与基本设置2. 初始设置3. U…

ThinkBook 14+ 2024 Ubuntu 触控板失效 驱动缺失问题解决

首先我的电脑是thinkbook14 2024&#xff0c;从ubuntu18到ubuntu24&#xff0c;笔者整个都试了一遍&#xff0c;触摸板都没反应&#xff0c;确认不是linux系统内核问题&#xff0c;原因为驱动缺失。 解决步骤&#xff1a; &#xff08;1&#xff09;下载驱动&#xff0c;网址如…

如何使用 Web Scraper API 高效采集 Facebook 用户帖子信息

目录 前言一、什么是Web Scraper API二、Web Scraper API 的优势&#xff1a;三、Web Scraper API 适用场景四、实践案例目标需求视频讲解1、选择Web Scraper API2、登录注册3、进入用户控制面板4、选择API5、触发数据收集 API6、获取爬虫结果7、分析爬虫结果&#xff08;1&…

Qt_day3_信号槽

目录 信号槽 1. 概念 2. 函数原型 3. 连接方式 3.1 自带信号 → 自带槽 3.2 自带信号 → 自定义槽 3.3 自定义信号 4. 信号槽传参 5. 对应关系 5.1 一对多 5.2 多对一 信号槽 1. 概念 之前的程序界面只能看&#xff0c;不能交互&#xff0c;信号槽可以让界面进行人机…

Elastic 通用分析:提高性能并降低成本

作者&#xff1a;来自 Elastic Luca Wintergerst•Tim Rhsen 在这篇博客中&#xff0c;我们将介绍我们的一位工程师的一项发现如何帮助我们在 QA 环境中节省数千美元的成本&#xff0c;并且一旦我们将这一变化部署到生产中&#xff0c;还可以节省更多的成本。 在当今的云服务和…

【WRF理论第十一期】检查WPS输出:geogrid和metgrid 的输出nc数据+ungrib输出WPS格式

【WRF理论第十一期】检查WPS输出&#xff1a;geogrid和metgrid输出nc数据ungrib输出WPS格式 检查WPS输出WPS 输出检查的重要性使用 NetCDF 格式查看 geogrid 和 metgrid 的输出检查和可视化数据的工具 ungrib 输出数据的格式使用 plotfmt 工具查看 ungrib 输出 参考 上一篇博客…

万字长文解读深度学习——卷积神经网络CNN

推荐阅读&#xff1a; 卷积神经网络&#xff08;CNN&#xff09;详细介绍及其原理详解 CNN笔记&#xff1a;通俗理解卷积神经网络 文章目录 &#x1f33a;深度学习面试八股汇总&#x1f33a;主要组件输入层卷积层 (Convolutional Layer)批归一化层&#xff08;Batch Normalizat…

Redis生产问题(缓存穿透、击穿、雪崩)——针对实习面试

目录 Redis生产问题什么是缓存穿透&#xff1f;如何解决缓存穿透&#xff1f;什么是缓存击穿&#xff1f;如何解决缓存击穿&#xff1f;缓存穿透和缓存击穿有什么区别&#xff1f;什么是缓存雪崩&#xff1f;如何解决缓存雪崩&#xff1f; Redis生产问题 什么是缓存穿透&#x…

19、centos7优化

优化条目&#xff1a; 优化条目&#xff1a; 1.sudo管理用户授权 &#xff08;不用root管理,以普通用户的名义通过sudo提权&#xff09; 2.更改默认的远程连接SSH服务端口,禁止root用户远程连接,&#xff08;提前建立普通用户&#xff09;&#xff08;甚至更改为只监听内网IP…

河北省内首台心磁图仪正式落户河北梅奥心血管病医院

河北省内首台心磁图仪正式落户河北梅奥心血管病医院。 2024年11月9日&#xff0c;河北梅奥心血管病医院迎来了一场激动人心的历史时刻——河北省首台心磁图仪启用仪式在医院内隆重举行&#xff0c;标志着这一顶尖医疗设备正式入驻&#xff0c;为医院心脏影像诊断技术开启了全新…

【C语言刷力扣】283.移动零

题目&#xff1a; 解题思路&#xff1a; 将不为 0 的元素依次放在数组前面&#xff0c;再在数组末尾补上 0。 时间复杂度&#xff1a; 空间复杂度&#xff1a; void moveZeroes(int* nums, int numsSize) {int i 0, j 0;for (; i < numsSize; i) {if (nums[i]) {nums…