k8s 集群搭建详细教程

news2025/1/17 1:17:00

参考: Kubernetes 文档 / 入门 / 生产环境 / 使用部署工具安装 Kubernetes / 使用 kubeadm 引导集群 / 安装 kubeadm


B. 准备开始

  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
  • 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
  • 2 CPU 核或更多
  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
  • 开启机器上的某些端口。请参见这里 了解更多详细信息。
  • 禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区

U. 确保每个节点上 MAC 地址和 product_uuid 的唯一性

  • 你可以使用命令 ip linkifconfig -a 来获取网络接口的 MAC 地址
  • 可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验

一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes 使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装 失败。


V. 虚拟机

新建… / 创建自定虚拟机 /
Linux / Ubuntu 64位

  • 设置过程
ID『虚拟机』设置建议配置默认值说明
1处理器-2最低要求
2内存-4096 MB节约内存
3显示器取消复选加速 3D 图形复选节约内存
4网络适配器-nat需上网
5硬盘40GB20 GB保证练习容量
6选择固件类型UEFI传统 BIOSVMware Fusion 支持嵌套虚拟化
  • 设置结果
IDYour computer’s nameCPU 核RAMDISKNIC
1k8s-master4 或更多8 GB或更多40 GBnat
2k8s-worker1同上2 GB或更多同上同上
3k8s-worker2同上同上同上同上

I. 安装 Ubuntu 22.04 LTS

  1. Willkommen! Bienvenue! Welcome! Welkom!

        [ English ]

  2. Installer update available

     [ Continue without updating ]

  3. Keyboard configuration

    [ Done ]

  4. Choose type of install

    (X) Ubuntu Server (minimized)
    / [ Done ]

  5. Network connections

    [ Done ]

  6. Configure proxy

    [ Done ]

  7. Configure Ubuntu archive mirror

    Mirror address: http://mirror.nju.edu.cn/ubuntu
    / [ Done ]

  8. Guided storage configuration

    [ Done ]

  9. Storage configuration

    [ Done ]

  10. Profile setup

                             Your name: kiosk
             Your server 's name: k8s-master
                   Pick a username: kiosk
              Choose a password: ubuntu
        Confirm your password: ubuntu
        / [ Done ]

  11. SSH Setup

    ​ [X] Install OpenSSH server
    ​ / [ Done ]

  12. Featured Server Snaps

    [ Done ]

  13. Install complete!

    🅰️ [ Cancel update and reboot ]

    🅱️ [ Reboot Now ]

  14. 建议(可选)

    关机后,做个快照


P. 准备工作

[kiosk@k8s-master|k8s-worker1|k8s-worker2]$

  1. 设置当前用户sudo免密

    sudo tee /etc/sudoers.d/$USER >/dev/null <<EOF
    $USER ALL=(ALL) NOPASSWD:ALL
    EOF
    
  2. 使用国内镜像仓库

    # 国内镜像仓库
    MIRROR_URL=http://mirror.nju.edu.cn/ubuntu
    
    # 生成软件仓库源
    sudo tee /etc/apt/sources.list >/dev/null <<EOF
    deb $MIRROR_URL jammy main restricted universe multiverse
    deb $MIRROR_URL jammy-updates main restricted universe  multiverse
    deb $MIRROR_URL jammy-backports main restricted universe multiverse
    deb $MIRROR_URL jammy-security main restricted universe multiverse
    EOF
    
  3. 安装相关软件

    # 更新
    sudo apt -y update
    
    # 安装
    sudo apt install -y openssh-server \
    	vim sshpass nfs-common \
    	bash-completion netcat-openbsd \
    	open-vm-tools
    

[kiosk@k8s-master]$

  1. 设置静态IP

    # 配置IP
    sudo tee /etc/netplan/00-installer-config.yaml >/dev/null <<EOF
    network:
      ethernets:
        ens33:
          dhcp4: false
          addresses: [192.168.147.128/24]
          gateway4: 192.168.147.2
          nameservers:
            addresses: [8.8.8.8]
      version: 2
    EOF
    
    # dns
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
    
    # active
    sudo netplan apply
    

[kiosk@k8s-worker1]$

  1. 设置静态IP

    # 配置IP
    sudo tee /etc/netplan/00-installer-config.yaml >/dev/null <<EOF
    network:
      ethernets:
        ens33:
          dhcp4: false
          addresses: [192.168.147.129/24]
          gateway4: 192.168.147.2
          nameservers:
            addresses: [8.8.8.8]
      version: 2
    EOF
    
    # dns
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
    
    # active
    sudo netplan apply
    

[kiosk@k8s-worker2]$

  1. 设置静态IP

    # 配置IP
    sudo tee /etc/netplan/00-installer-config.yaml >/dev/null <<EOF
    network:
      ethernets:
        ens33:
          dhcp4: false
          addresses: [192.168.147.130/24]
          gateway4: 192.168.147.2
          nameservers:
            addresses: [8.8.8.8]
      version: 2
    EOF
    
    # dns
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
    
    # active
    sudo netplan apply
    

[kiosk@k8s-master|k8s-worker1|k8s-worker2]$

  1. 编辑 hosts

    sudo tee -a /etc/hosts >/dev/null <<EOF
    192.168.147.128	k8s-master
    192.168.147.129 k8s-worker1
    192.168.147.130 k8s-worker2
    EOF
    
    # 设置 root 密码
    (echo ubuntu; echo ubuntu) | sudo passwd root
    echo PermitRootLogin yes | sudo tee -a /etc/ssh/sshd_config
    sudo systemctl restart sshd
    

[kiosk@k8s-master]$

  1. ssh免密

    # 生成 keypair
    ssh-keygen -f ~/.ssh/id_rsa -N ''
    
    # 拷贝公钥
    for i in k8s-master k8s-worker1 k8s-worker2; do
       sshpass -pubuntu ssh-copy-id -o StrictHostKeyChecking=no kiosk@$i
       sshpass -pubuntu ssh-copy-id -o StrictHostKeyChecking=no root@$i
    done
    

[kiosk@k8s-master|k8s-worker1|k8s-worker2]$

  1. 禁用swap

    # 交换文件
    SWAPF=$(awk '/swap/ {print $1}' /etc/fstab)
    
    # 立即禁用
    sudo swapoff $SWAPF
    
    # 永久禁用
    sudo sed -i '/swap/d' /etc/fstab
    
    # 删除交换文件
    sudo rm $SWAPF
    
  2. 扩容

    # 逻辑卷名
    export LVN=$(sudo lvdisplay | awk '/Path/ {print $3}')
    
    # 扩容
    sudo lvextend -l 100%PVS $LVN
    
    # 立即生效
    sudo resize2fs $LVN
    
    # 验证
    df -h /
    
  3. 模块支持

    # 安装
    sudo apt -y install bridge-utils
    
    # 立即生效
    sudo modprobe br_netfilter
    
    # 内核支持
    sudo tee /etc/sysctl.d/k8s.conf >/dev/null <<EOF
    net.ipv4.ip_forward=1
    vm.swappiness=0
    vm.overcommit_memory=1
    vm.panic_on_oom=0
    EOF
    
    # 立即生效
    sudo sysctl -p /etc/sysctl.d/k8s.conf
    
  • docker: k8s-master, k8s-worker1
  • containerd: k8s-worker2

[kiosk@k8s-master|k8s-worker1]$

  1. 安装运行时

    # 创建文件夹
    sudo mkdir -p /etc/docker
    
    # 生成配置文件
    sudo tee /etc/docker/daemon.json >/dev/null <<EOF
    {
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m",
        "max-file": "10"
      },
      "registry-mirrors": ["https://docker.nju.edu.cn/"]
    }
    EOF
    
    # 安装 runtime
    sudo apt -y install docker.io
    
    # 开机自启
    sudo systemctl enable docker
    
    # 立即重启
    sudo systemctl restart docker
    
    # 安装命令 cri-dockerd
    curl -# https://vmcc.xyz:8443/k8s/cri-docker/cri-dockerd-0.2.5.amd64.tgz \
    	-o cri-dockerd-0.2.5.amd64.tgz
    tar -xf cri-dockerd-0.2.5.amd64.tgz
    sudo cp cri-dockerd/cri-dockerd /usr/bin/
    
    # 安装服务 cri-docker.service
    sudo curl -s https://vmcc.xyz:8443/k8s/cri-docker/cri-docker.service \
    	-o /usr/lib/systemd/system/cri-docker.service
    sudo sed -i '/ExecStart/s+$+ --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8+' /usr/lib/systemd/system/cri-docker.service
    
    # 安装 cri-docker.socket
    sudo curl -s https://vmcc.xyz:8443/k8s/cri-docker/cri-docker.socket \
    	-o /usr/lib/systemd/system/cri-docker.socket
    
    # 启动服务 cri-dockerd
    sudo systemctl daemon-reload
    sudo systemctl enable cri-docker
    sudo systemctl restart cri-docker
    
    # 安装 crictl 命令
    curl -# https://vmcc.xyz:8443/k8s/crictl-v1.24.2-linux-amd64.tar.gz \
    	-o crictl-v1.24.2-linux-amd64.tar.gz
    tar -xf crictl-v1.24.2-linux-amd64.tar.gz
    sudo cp crictl /usr/bin/
    # crictl 配置文件
    sudo tee /etc/crictl.yaml >/dev/null <<EOF
    runtime-endpoint: unix:///var/run/cri-dockerd.sock
    image-endpoint: unix:///var/run/cri-dockerd.sock
    timeout: 10
    debug: false
    pull-image-on-create: true
    EOF
    

[kiosk@k8s-worker2]$

  1. 安装运行时

    # 安装 containerd
    sudo apt install -y containerd
    
    # 创建目录
    sudo mkdir /etc/containerd
    
    # 生成默认配置文件
    containerd config default | \
    sudo tee /etc/containerd/config.toml >/dev/null
    
    # 修改配置文件
    sudo sed -i \
    -e '/sandbox_image/s?k8s.gcr.io?registry.aliyuncs.com/google_containers?' \
    -e '/SystemdCgroup/s?false?true?' \
    -e '/registry.mirrors/a\        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]' \
    -e '/registry.mirrors/a\          endpoint = ["https://docker.nju.edu.cn/"]' /etc/containerd/config.toml
    
    # 服务重启
    sudo systemctl restart containerd
    
    # 安装 crictl 命令
    curl -# https://vmcc.xyz:8443/k8s/crictl-v1.24.2-linux-amd64.tar.gz \
    	-o crictl-v1.24.2-linux-amd64.tar.gz
    tar -xf crictl-v1.24.2-linux-amd64.tar.gz
    sudo cp crictl /usr/bin/
    # crictl 配置文件
    sudo tee /etc/crictl.yaml >/dev/null <<EOF
    runtime-endpoint: unix:///run/containerd/containerd.sock
    image-endpoint: unix:///run/containerd/containerd.sock
    timeout: 10
    debug: false
    pull-image-on-create: true
    EOF
    
    

K. 安装 k8s

[kiosk@k8s-master|k8s-worker1|k8s-worker2]$

  1. 安装 kubeadm、kubelet 和 kubectl

    # 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包
    sudo apt -y install apt-transport-https ca-certificates curl
    
    # 下载 Google Cloud 公开签名秘钥
    curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
    
    # 添加 Kubernetes apt 仓库
    MIRROR_URL=https://mirror.nju.edu.cn/kubernetes/apt/
    sudo tee /etc/apt/sources.list.d/kubernetes.list >/dev/null <<EOF
    deb $MIRROR_URL kubernetes-xenial main
    EOF
    
    # 更新 apt 包索引
    sudo cp /etc/apt/trusted.gpg /etc/apt/trusted.gpg.d
    sudo apt update -y
    sudo apt-cache madison kubelet | grep 1.24
    
    # 安装 kubelet、kubeadm 和 kubectl 考试版本
    sudo apt install -y kubelet=1.24.1-00 kubeadm=1.24.1-00 kubectl=1.24.1-00
    
    # 锁定版本
    sudo apt-mark hold kubelet kubeadm kubectl
    
    

[kiosk@k8s-worker2]$

# 增加 k8s 支持
 sudo sed -i '/ExecStart=\//s|$| --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --cgroup-driver=systemd|' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
# 重启 kubelet 服务
sudo systemctl daemon-reload
sudo systemctl restart kubelet

[kiosk@k8s-master]$

  1. 初始化

    # 生成初始文件
    sudo kubeadm config print init-defaults > kubeadm-config.yaml
    
    # 修改文件
    sudo sed -i \
      -e "/advertiseAddress/s?:.*?: 192.168.147.128?" \
      -e "/name/s?:.*?: k8s-master?" \
      -e "/clusterName/s?:.*?: ck8s?" \
      -e "/imageRepository/s?:.*?: registry.aliyuncs.com/google_containers?" \
      -e "/criSocket/s+containerd/containerd+cri-dockerd+" kubeadm-config.yaml
    
    # 使用初始文件,初始化集群
    sudo kubeadm init --config kubeadm-config.yaml
    

    …输出省略…
    Your Kubernetes control-plane has initialized successfully!

    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
    

    You should now deploy a pod network to the cluster.
    Run “kubectl apply -f [podnetwork].yaml” with one of the options listed at:
    https://kubernetes.io/docs/concepts/cluster-administration/addons/

    Then you can join any number of worker nodes by running the following on each as root:

    kubeadm join 192.168.147.128:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:c4781194de65ebb47984fc5e7e64d4897875410825ce4d18df81da1a298afa1f
    
  2. 配置文件

    # 创建目录
    mkdir -p $HOME/.kube
    
    # user 复制配置文件
    sudo \cp /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    # root 变量
    sudo tee -a ~root/.bashrc >/dev/null <<EOF
    export KUBECONFIG=/etc/kubernetes/admin.conf
    EOF
    
  3. 创建网络

    kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
    
  4. 命令补全

    # 立即生效
    source <(kubectl completion bash)
        
    # 永久生效
    mkdir ~/.kube
    kubectl completion bash > ~/.kube/completion.bash.inc
    printf "
    # Kubectl shell completion
    source '$HOME/.kube/completion.bash.inc'
    " >> $HOME/.bash_profile
    source $HOME/.bash_profile
    
  5. 命令别名

    # 永久生效
    tee -a $HOME/.bashrc >/dev/null <<EOF
    alias k='kubectl'
    complete -F __start_kubectl k
    EOF
    
    # 立即生效
    source $HOME/.bashrc
    

[kiosk@k8s-worker1]$

  1. 加入集群

    sudo kubeadm join 192.168.147.128:6443 \
      --token abcdef.0123456789abcdef \
      --discovery-token-ca-cert-hash sha256:c4781194de65ebb47984fc5e7e64d4897875410825ce4d18df81da1a298afa1f \
      --cri-socket unix://var/run/cri-dockerd.sock
    

[kiosk@k8s-worker2]$

  1. 加入集群

    sudo kubeadm join 192.168.147.128:6443 \
      --token abcdef.0123456789abcdef \
      --discovery-token-ca-cert-hash sha256:c4781194de65ebb47984fc5e7e64d4897875410825ce4d18df81da1a298afa1f
    

C. 确认环境正常

[kiosk@k8s-master]

$ kubectl get componentstatuses
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE                         ERROR
scheduler           `Healthy`  ok
controller-manager  `Healthy`  ok
etcd-0              `Healthy`  {"health":"true","reason":""}

$ kubectl get nodes
NAME          STATUS   ROLES                  AGE     VERSION
k8s-worker1  `Ready`  <none>                 4m4s    `v1.24.1`
k8s-worker2  `Ready`  <none>                 4m44s   `v1.24.1`
k8s-master   `Ready`  control-plane,master   13m     `v1.24.1`

$ kubectl -n kube-system get pod -w
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-555bc4b957-8ccgh   1/1     Running   0          27m
calico-node-5qqcq                          1/1     Running   0          9m29s
calico-node-7qclz                          1/1     Running   0          27m
calico-node-kcvt5                          1/1     Running   0          9m29s
coredns-74586cf9b6-69fn7                   1/1     Running   0          156m
coredns-74586cf9b6-8mgl9                   1/1     Running   0          156m
etcd-k8s-master                            1/1     Running   0          156m
kube-apiserver-k8s-master                  1/1     Running   0          156m
kube-controller-manager-k8s-master         1/1     Running   0          156m
kube-proxy-8j248                           1/1     Running   0          9m29s
kube-proxy-g7r55                           1/1     Running   0          9m29s
kube-proxy-rbdcp                           1/1     Running   0          156m
kube-scheduler-k8s-master                  1/1     Running   0          156m
<Ctrl-C>

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

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

相关文章

3.3 Linux shell命令(权限、输入输出)

目录 shell shell概述 shell分类 查看当前系统的shell 权限相关命令&#xff08;也是shell命令&#xff09; 基本命令 输入输出相关操作 输出命令 输入输出重定向 通配符 管道 历史查询、补齐功能 历史查询 自动补齐 命令置换 shell 什么是shell shell是一种负…

【VM服务管家】VM4.0软件使用_1.2 工具类

目录 1.2.1 文本保存&#xff1a;逐行保存格式化模块输出的方法1.2.2 脚本模块&#xff1a;循环模块搭配脚本使用的方法1.2.3 几何查找&#xff1a;彩色图像的几何查找方法1.2.4 深度学习&#xff1a;图像分割的面积的获取方法1.2.5 颜色识别&#xff1a;使用颜色识别工具做分类…

【Leetcode -86.分隔链表 -92.反转链表Ⅱ】

Leetcode Leetcode -86.分隔链表Leetcode -92.反转链表Ⅱ Leetcode -86.分隔链表 题目&#xff1a;给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每…

java数据结构之HashMap

目录 前言 1、初始化 1.1、初始化 1.2、插入第一条数据 2、数组 链表 2.1、插入数据&#xff1a;没有hash冲突 2.2、插入数据&#xff1a;Key不同&#xff0c;但产生hash冲突 2.3、插入数据&#xff1a;Key相同 3、数组 红黑树 3.1、链表如何转化为红黑树&#xff1f; 3.…

Postman测试实践笔记

Postman测试实践 文章目录 Postman测试实践一、Postman安装与使用1.1 Postman下载及安装1.1.2 Postman Mac版 1.2 Postman 更新1.2.1 mac 版更新 1.3 Postman 其他问题 二、网络相关知识2.1 接口2.1.1 软件为什么需要接口 2.2 接口测试2.2.1 什么是接口测试&#xff1a;2.2.2 为…

VTK下载并安装

去官网下载https://vtk.org/download/ 选择最新稳定版本 然后点击source后边的压缩包进行下载。 下载完成后将其解压到特定的文件夹下&#xff0c;然后打开cmake-gui.exe&#xff0c;第一行选择刚刚解压的文件夹&#xff0c;这个文件夹下有一个CMakeLists.txt文件&#xff0c…

【6. 激光雷达接入ROS】

欢迎大家阅读2345VOR的博客【6. 激光雷达接入ROS】&#x1f973;&#x1f973;&#x1f973; 2345VOR鹏鹏主页&#xff1a; 已获得CSDN《嵌入式领域优质创作者》称号&#x1f47b;&#x1f47b;&#x1f47b;&#xff0c;座右铭&#xff1a;脚踏实地&#xff0c;仰望星空&#…

Go | 一分钟掌握Go | 8 - 并发

作者&#xff1a;Mars酱 声明&#xff1a;本文章由Mars酱编写&#xff0c;部分内容来源于网络&#xff0c;如有疑问请联系本人。 转载&#xff1a;欢迎转载&#xff0c;转载前先请联系我&#xff01; 前言 当今编程界&#xff0c;一个好的编译型语言如果不支持并发&#xff0c…

工控老司机告诉你热电偶和RTD的区别

热电偶和热电阻都是温度传感器&#xff0c;但它们的原理、功能特性和应用场景有所不同。 一、原理区别 首先&#xff0c;热电偶是利用两种不同金属之间的热电效应来测量温度的。其原理是利用温度差引起的金属之间的热电势差进行测量。两种金属之间存在一种热电势&#xff08;…

Yolov8优化:卷积变体---分布移位卷积(DSConv),提高卷积层的内存效率和速度

论文: https://arxiv.org/pdf/1901.01928v1.pdf 摘要:提出了一种卷积的变体,称为DSConv(分布偏移卷积),其可以容易地替换进标准神经网络体系结构并且实现较低的存储器使用和较高的计算速度。 DSConv将传统的卷积内核分解为两个组件:可变量化内核(VQK)和分布偏移。 通过…

双亲委派机制的原理和作用

双亲委派机制&#xff0c;就必须弄清楚Java的类加载器。 什么是类加载器 Java类加载器(ClassLoader)是Java运行时环境(JRE)的一部分&#xff0c;负责动态的将Java类加载到Java虚拟机的内存空间。 类加载器有哪些 主要有三个&#xff1a; 引导类加载器(Bootstrap ClassLoade…

前端开发在本地开发与后台进行联调阶段时,接口自动重定向https、HSTS 与 307 状态码

开发者在本地开发与后台进行联调阶段时&#xff0c;Chrome 浏览器上出现 307 状态码&#xff0c;并跳转到 https 版 但是 307 代码是什么含义呢&#xff1f;页面又为何会出现 307 状态码呢&#xff1f;我之前都没见过这个状态码&#xff0c;查了才知道原来它也是一种重定向。 …

数字三角形+包子凑数(蓝桥杯JAVA解法)

数字三角形&#xff1a;用户登录 题目描述 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径&#xff0c;把路径上面的数加起来可以得到一个和&#xff0c;你的任务就是找到最大的和&#xff08;路径上的每一步只可沿左斜线向下或右斜线向下走…

ArduPilot之开源代码Sensor Drivers设计

ArduPilot之开源代码Sensor Drivers设计 1. 源由2. Sensor Drivers设计2.1 front-end / back-end分层2.2 设计思想分析 3 实例理解3.1 驱动初始化3.2 业务应用代码3.3 frond-end代码3.3 back-end代码3.3.1 UART3.3.2 I2C3.3.3 SPI 4. 参考资料 1. 源由 飞控代码除了最为基础的…

《美团机器学习实践》读后感和一点思考

前言&#xff1a;最近拜读了美团算法团队出品的《美团机器学习实践》&#xff0c;这本书写于2018年&#xff0c;一个大模型还没有标配的时代。这本书侧重于工业界的实践&#xff0c;能清楚地让我们了解到工业界和学术界对机器学习的关注方向上的差异&#xff0c;值得一读。因为…

文件系统和软硬链接

文章目录 一.文件系统1.了解磁盘的物理结构2.磁盘的存储结构a.磁盘读取 3.磁盘的逻辑结构a.为什么操作系统不直接使用CHS地址&#xff1f;b.实际IO一次的大小 4.磁盘的分区管理4.1.ext文件系统a.文件查找b.文件删除 4.2目录的属性和数据 二.软硬链接软链接的建立和删除软链接的…

【VM服务管家】VM4.0软件使用_1.4 通讯类

目录 1.4.1 通讯管理&#xff1a;ModBus通信发送非整型数据的方法1.4.2 通讯管理&#xff1a;使用Modbus TCP通讯协议与流程交互 1.4.1 通讯管理&#xff1a;ModBus通信发送非整型数据的方法 描述 环境&#xff1a;VM4.0.0 现象&#xff1a;Modbus通信发送数据只能为Int类型&a…

快速搭建Electron+Vite3+Vue3+TypeScript5脚手架 (无需梯子,快速安装Electron)

一、介绍 &#x1f606; &#x1f601; &#x1f609; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需…

【网课平台】Day13.订单支付模式:生成支付二维码与查询支付

文章目录 一、需求&#xff1a;生成支付二维码1、需求分析2、表设计3、接口定义4、接口实现5、完善controller 二、需求&#xff1a;查询支付结果1、需求分析2、表设计与模型类3、接口定义4、接口实现步骤一&#xff1a;查询支付结果步骤二&#xff1a;保存支付结果&#xff08…

如何写出一份大厂都不会拒绝的简历?

你好&#xff0c;我是宋光璠&#xff0c;今天我以过来人的身份教你写出一份惊艳面试官的简历。 简历算是我们过去经历的一个缩影&#xff0c;虽然只有短短一两页&#xff0c;但也能让人从中发现你的优点&#xff0c;一份优质的简历更是如此&#xff0c;所以今天我就带你从头到…