【kubernetes】k8s集群的简述与搭建

news2025/1/23 13:15:57

简述

Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序

关键特性

  1. 自动化部署和回滚:Kubernetes 可以自动化地部署和回滚应用程序,确保应用程序始终处于预期的状态。
  2. 服务发现和负载均衡:Kubernetes 提供内置的服务发现和负载均衡功能,确保流量自动分配到健康的容器实例。
  3. 存储编排:Kubernetes 支持挂载本地存储、云存储和网络存储等多种存储系统。
  4. 自我修复:Kubernetes 可以自动重启失败的容器、替换被杀死的容器、以及在节点不可用时重新调度容器。
  5. 水平扩展:Kubernetes 可以根据需求自动扩展或缩减容器实例的数量。

主要组件

  1. Master 节点:
  • API Server:处理 REST 操作,提供集群的统一入口。
  • etcd:分布式键值存储,用于存储集群的所有数据。
  • Controller Manager:负责执行集群的控制逻辑,管理不同的控制器。
  • Scheduler:调度器,负责将容器调度到合适的节点上运行。
  1. 工作节点(Node):
  • Kubelet:运行在每个节点上,负责管理容器的生命周期。
  • Kube-proxy:负责网络代理和负载均衡。
  • 容器运行时:如 Docker 或 containerd,用于实际运行容器。从1.24版本之后不再使用docker作为运行时。

基本概念

  1. Pod:Kubernetes 中的最小部署单元,一个 Pod 可以包含一个或多个容器。
  2. Service:定义了一组 Pod 的访问策略,提供负载均衡和服务发现。
  3. Deployment:用于声明应用的期望状态,负责管理 Pod 的创建和更新。
  4. Namespace:用于将集群资源划分为逻辑上的组,以便不同的项目或团队使用。

搭建

环境准备

可以多节点部署,也可单节点部署。需要注意的是单节点部署要删除污点,否则无法部署应用

主机名IP地址
master192.168.11.122
node192.168.11.127

1、禁用防火墙、selinux、swap

# 禁用防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 禁用selinux
sudo sed -i 's/enforcing/disabled/' /etc/selinux/config  #永久禁用
sudo setenforce 0  # 临时禁用
# 禁用swap
sudo swapoff -a # 临时禁用
sudo sed -ri 's/.*swap.*/#&/' /etc/fstab  #永久禁用

2、将桥接的IPv4流量传递到iptables的链

以下为一条命令,可直接复制执行

cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1 # 开启路由转发
net.bridge.bridge-nf-call-ip6tables = 1 # 开启桥流量监控
net.bridge.bridge-nf-call-iptables = 1 # 开启桥流量监控
EOF
# 生效
sudo sysctl --system  

3、apt 切换国内源

Ubuntu 22.04换国内源 清华源 阿里源 中科大源 163源_ubuntu22阿里源-CSDN博客
系统版本:ubuntu22.04
其他版本可自行搜索,不同版本对应不同的代号

cat > /etc/apt/sources.list << EOF

# 清华源
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse

# 阿里源
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse

EOF

换源后,更新

apt-get update

4、时间同步

以下有两种方式,可任选其一

  • 安装chrony
## 安装chrony
sudo apt-get update
sudo apt-get install chrony -y
## 启用并启动Chrony服务
sudo systemctl enable chrony
sudo systemctl start chrony

## 检查chrony状态,看时间是否同步
sudo chronyc tracking
  • 安装ntpd
# 安装ntpd
sudo apt-get update
sudo apt-get install ntp

# 启动并启用 ntpd 服务
sudo systemctl start ntp
sudo systemctl enable ntp

# 检查 ntpd 状态
ntpq -p

更换时区

# 查看当前时区
timedatectl status
# 列出可用时区
timedatectl list-timezones
# 过滤时区列表
timedatectl list-timezones | grep Asia

# 更改时区
sudo timedatectl set-timezone Asia/Shanghai

# 验证时区更改
timedatectl status

安装k8s组件(所有节点)

  • kubeadm:用来初始化k8s集群的指令。
  • kubelet:在集群的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与k8s集群通信的命令行工具,查看、创建、更新和删除各种资源。

官网:安装kubeadm、kubelet和kubectl

方式一:apt安装

1、更新 apt 包索引,安装k8s需要的依赖包

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
  • ca-certificates 是 Linux 系统中一个非常重要的软件包,它包含了一系列的数字证书,这些证书用于验证 HTTPS 连接的安全性
  • apt-transport-https 是一个 APT (Advanced Packaging Tool) 的传输层插件,它允许 APT 通过 HTTPS 协议来获取软件包。

2、下载用于 k8s 软件包仓库的公共签名密钥
如果 /etc/apt/keyrings 目录不存在

sudo mkdir -p -m 755 /etc/apt/keyrings

所有仓库都使用相同的签名密钥,因此你可以忽略URL中的版本:

sudo curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

3、添加 k8s apt 的源列表

  • 注意版本 Kubernetes 1.31 ; 对于其他 Kubernetes 版本,则需要更改
    在这里插入图片描述

  • 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置

  • 添加之后,直接install不指定版本会默认安装设置的源列表中1.31所有版本中的最新版

sudo echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

4、更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl

执行成功后,可以看到相关依赖安装成功和安装的版本号
在这里插入图片描述

若想安装指定版本,可查询kubelet、kubeadm、kubectl可安装版本的列表

sudo apt-cache madison kubeadm
sudo apt-cache madison kubelet
sudo apt-cache madison kubectl

在这里插入图片描述

方式二:二进制包安装

二进制包地址(注意版本和架构替换),可自行下载或使用curl,wget等工具

地址: https://dl.k8s.io/release/版本/bin/linux/系统架构(amd64或arm64)/(kubeadm,kubelet,kubectl)

我这里使用最新版本,amd64架构

1、kubectl二进制包

https://dl.k8s.io/release/v1.31.3/bin/linux/amd64/kubectl

2、kubeadm二进制包

https://dl.k8s.io/release/v1.31.3/bin/linux/amd64/kubeadm

3、kubelet二进制包

https://dl.k8s.io/release/v1.31.3/bin/linux/amd64/kubelet

4、赋权并配置全局可执行

二进制包下载完成后,是执行文件,赋权

chmod +x kubeadm
chmod +x kubectl
chmod +x kubelet

配置全局可执行

cp kubeadm kubectl kubelet /usr/bin/

5、配置kubelet.service

vim /etc/systemd/system/kubelet.service

修改ExecStart为自己的kubelet的安装目录

[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/kubelet # 注意修改为kubelet执行文件所在目录
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target

设置kubelet开机自启动

sudo systemctl enable kubelet

以上为所有节点的配置,下面进行对master节点的单独配置

配置与初始化(master节点)

1、配置容器运行时(master节点)

官网:Container Runtimes

安装containerd

若安装了docker,可跳过containerd等安装,直接对containerd进行配置,若未安装过可以使用以下方式安装

下载containerd 二进制文件

  • amd64(x86_64)版本
sudo wget https://github.com/containerd/containerd/releases/download/v1.6.12/containerd-1.6.12-linux-amd64.tar.gz
  • arch64(arm64)版本
sudo wget https://github.com/containerd/containerd/releases/download/v1.6.12/containerd-1.6.12-linux-arm64.tar.gz

解压并安装

  • amd64(x86_64)版本
sudo tar -xvf containerd-1.6.12-linux-amd64.tar.gz
  • arch64(arm64)版本
sudo tar -xvf containerd-1.6.12-linux-arm64.tar.gz

将解压后的二进制文件内容移动到 /usr/local/bin 目录

sudo mv bin/* /usr/local/bin/

创建 containerd 的 systemd 服务文件containerd.service,执行一下命令写入配置

cat > /etc/systemd/system/containerd.service << EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target

[Service]
ExecStart=/usr/local/bin/containerd
Restart=always
RestartSec=5
Delegate=yes
KillMode=process
OOMScoreAdjust=-999
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity

[Install]
WantedBy=multi-user.target
EOF

至此,containerd安装完成,下面进行配置

配置containerd

创建配置文件

sudo mkdir -p /etc/containerd

生成容器运行时的默认配置,写入/etc/containerd/config.toml

sudo containerd config default > /etc/containerd/config.toml

进入配置文件,按ESC,输入"/<关键字>"查询内容

sudo vi /etc/containerd/config.toml
  • 按ESC,进入命令模式。输入"/sandbox_image",找到位置后按Enter选中,按i进入插入模式,修改sandbox_image镜像为国内镜像,这里用的阿里云。若配置了代理可不用切换国内源,直接访问k8s镜像源拉取

    sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10"
    
  • 按ESC,输入"/SystemdCgroup"查询,修改SystemdCgroup = true,使用 systemd 作为容器的 cgroup 驱动程序

  • 修改完成后按ESC,输入:wq保存退出
    重启containerd,并设置开机自启

    sudo systemctl daemon-reload
    sudo systemctl restart containerd
    sudo systemctl enable containerd
    

2、配置cgroup驱动(master节点)

官网:配置cgroup驱动

方式一:输出默认配置文件,写入kubeadm-config.yaml中
sudo kubeadm config print init-defaults > kubeadm-config.yaml

在这里插入图片描述
配置详解:

kind: InitConfiguration(初始化过程的配置)
localAPIEndpoint.advertiseAddress:设置控制平面节点的广播地址,通常是节点的 IP 地址。
bootstrapTokens 用于配置集群的引导令牌(Bootstrap
Tokens)。在集群初始化时,允许新的节点加入集群。引导令牌是一种短期的、一次性的令牌,通常用于在集群初始化和节点加入过程中进行身份验证。
nodeRegistration.name:设置主节点名称。
nodeRegistration.criSocket:如果你使用的是containerd 而不是 Docker,设置为 “/run/containerd/containerd.sock”。

kind: ClusterConfiguration(集群的配置)
kubernetesVersion:指定 Kubernetes 版本,例如"v1.30.1"。
controlPlaneEndpoint:如果你有高可用性(HA)集群,设置控制平面通信的共享端点,例如 “master节点IP:6443”。
networking.podSubnet:指定 Pod网络的子网范围,例如 “10.244.0.0/16”
controllerManager 和 scheduler: 分别包含了控制器管理器和调度器的额外设置。
etcd:包含了etcd(Kubernetes的后端存储)的配置,可以是本地的也可以是外部的。
imageRepository:如果你使用自定义镜像仓库,设置镜像仓库地址,例如registry.aliyuncs.com/google_containers。

增加KubeletConfiguration的配置,设置cgroup驱动为systemd
在1.22及以上版本中,不设置cgroupDriver会默认为systemd,低版本注意修改。

--- # 分隔
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd # 使用 systemd 作为cgroup 驱动程序

修改配置文件
通过/<关键词>搜索 更改默认配置中的localAPIEndpoint.advertiseAddress地址为节点ip、更改节点名称、切换镜像源为阿里源、指定 Pod 网络的 CIDR地址范围

localAPIEndpoint:
  advertiseAddress: 192.168.11.122 # 主节点的IP
  
nodeRegistration:
  name: master # 主节点的hostname
  
imageRepository: registry.aliyuncs.com/google_containers


networking:
  podSubnet: 10.244.0.0/16 # 指定 Pod 网络的 CIDR(Classless Inter-Domain Routing)地址范围
方式二:最简配置,创建kubeadm-config.yaml,写入以下配置

以下配置版本为1.31。若安装的其他版本可以通过sudo kubeadm config print init-defaults命令,将kubeadm.k8s.io/v1beta4改为其输出的内容中对应的版本即可

apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: stable
controlPlaneEndpoint: "192.168.11.122:6443" # master节点IP:6443
networking:
  podSubnet: "10.244.0.0/16"
imageRepository: registry.aliyuncs.com/google_containers
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

3、初始化master节点

在kubeadm-config.yaml文件所在目录执行命令

sudo kubeadm init --config kubeadm-config.yaml

集群创建成功,执行提示命令,创建集群配置文件,开始使用集群
在这里插入图片描述

需要注意的是:

直接执行export KUBECONFIG=/etc/kubernetes/admin.conf命令是有时效性的,关闭终端立即失效 ,需要将其放入shell配置文件~/.bashrc 或 ~/.zshrc

或者也可在root用户执行命令创建配置文件

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

稍等30s执行命令查看节点

kubectl get nodes

这个过程中可能遇到的问题 :【解决】k8s使用kubeadm初始化集群失败问题整理

工作节点加入集群(node节点)

主节点初始化集群成功后,会提示工作节点的加入命令,复制到工作节点执行即可(此处替换自己的)

kubeadm join 192.168.11.122:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:036843071148c8f7700062c2438b35c86b0dc5754011829b5cf83bb9379d88fa 

此命令为集群初始化时生成的,toke有效期有限,后面加入集群,可执行以下命令:

1、在master节点获取 Join 命令
首先,你需要从集群的master节点获取 kubeadm join 命令。执行以下命令来获取:

kubeadm token create --print-join-command

这将输出一个 kubeadm join 命令

kubeadm join 192.168.11.122:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

2、在工作节点上运行 输出的Join 命令
node工作节点上运行控制台输入的Join 命令,等待执行完成

节点成功加入集群

3、验证节点是否加入集群
在主节点上运行以下命令,验证工作节点是否成功加入集群:

kubectl get nodes

能够看到新加入的节点出现在节点列表中
在这里插入图片描述

至此,集群创建并加入工作节点成功,接下来继续在master节点安装部署需要的组件

安装网络插件flannel

下载地址: kube-flannel.yml

可直接下载到本机,复制到远程

scp  本地文件路径 user@ip:远程路径

或者使用wget、curl等工具下载

sudo wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

下载完成后,部署到集群

kubectl apply -f kube-flannel.yml

等待flannel拉取必要组件镜像并完成初始化,查看所有组件的状态,必须全部Running才行

kubectl get pods --all-namespaces

所有命名空间的pod状态

这个过程中可能遇到的问题 :【解决】k8s使用flannel网络插件的问题整理

初始化PV、PVC

创建pv.yaml配置文件

apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: manual
  hostPath:
    path: "/mnt/data"    

pvc.yaml配置文件

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: example-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: manual

部署pv和pvc

kubectl apply -f pv.yaml
kubectl apply -f pvc.yaml

验证pv和pvc

kubectl get pv
kubectl get pvc

在这里插入图片描述

在 Kubernetes (K8s) 中,持久卷 (Persistent Volume, PV) 和持久卷声明 (Persistent Volume Claim, PVC) 是用于管理持久存储的资源。

它们的主要目的是为容器化应用提供持久化存储,以便在 Pod重启或重新调度时数据不会丢失。

安装 ingress

来自: https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.1/deploy/static/provider/cloud/deploy.yaml

注意上面内容的ingress.yaml 复制下来后,需要设定 ingress 的外部地址:

按ESC进入命令模式,输入/kind: Service搜索,按Enter后,N查找下一个,找到Service 中name为ingress-nginx-controller的配置项,在该配置的最下方加入:

  externalIPs: 
    - 服务器ip

在这里插入图片描述

部署ingress

kubectl apply -f ingress.yaml

创建默认的 ingressCllass 配置文件ingress-class.yaml

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: nginx
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
spec:
  controller: k8s.io/ingress-nginx

部署 ingressClass

kubectl apply -f ingress-class.yaml

删除污点

如果是单节点部署,需要删除污点,否则无法部署运行应用 pod

kubectl taint nodes --all node-role.kubernetes.io/master-
kubectl taint nodes --all node-role.kubernetes.io/control-plane-

部署安装应用

示例

编写my-dockerfile-nginx.yaml文件

此文件主要是定义了一个 K8s 服务(Service)和一个部署(Deployment),用于运行一个基于 Nginx 的应用

apiVersion: v1
kind: Service
metadata:
  name: my-dockerfile-nginx
spec: 
  ports:
    - port: 8081 # 对外暴露的端口
      targetPort: 80 # Nginx 内部监听的端口
      nodePort: 31111  # NodePort访问端口
  type: NodePort   # NodePort类型的Service,可以通过Node的IP和NodePort访问到Service   
  selector:
    app: my-dockerfile-nginx
---   
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-dockerfile-nginx
  labels:
    app: my-dockerfile-nginx
spec:
  replicas: 1 # 副本数
  selector:  # 选择器,用于选择replicas生效的Pod
    matchLabels:
      app: my-dockerfile-nginx
  template:
    metadata:
      labels:
        app: my-dockerfile-nginx
    spec:
      containers:
      - name:  my-dockerfile-nginx
        image: liuhp6903/my-dockerfile-nginx:latest # 应用的镜像
        imagePullPolicy: Always
        ports:
        - containerPort: 80
          protocol: TCP

部署到集群

kubectl apply -f my-dockerfile-nginx.yaml -n <指定namespace>

不指定命名空间,会部署到默认命名空间

等待pod创建并running,可以通过节点IP:nodePort在外部进行访问

在这里插入图片描述

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

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

相关文章

SpringBoot+vue实现WebSocket通信

WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务器主动向客户端推送数据。 WebSocket的主要特点&#xff1a; 全双工通信&#xff1a;客户端和服务器之间的数据可以同时双向传输低延迟&…

【BUG】记一次context canceled的报错

文章目录 案例分析gorm源码解读gin context 生命周期context什么时候cancel的什么时候context会被动cancel掉呢&#xff1f; 野生协程如何处理 案例分析 报错信息 {"L":"ERROR","T":"2024-12-17T11:11:33.0050800","file"…

H5 中 van-popup 的使用以及题目的切换

H5 中 van-popup 的使用以及题目的切换 在移动端开发中&#xff0c;弹窗组件是一个常见的需求。vant 是一个轻量、可靠的移动端 Vue 组件库&#xff0c;其中的 van-popup 组件可以方便地实现弹窗效果。本文将介绍如何使用 van-popup 实现题目详情的弹窗展示&#xff0c;并实现…

【第一节】Git的简介和安装

目录 一、git的介绍 二、git 的安装 2.1 Linux 平台安装 2.2 源码安装 2.3 Windows 平台安装 2.4 Mac 平台安装 2.5 Git 配置 2.5.1 配置文件 2.5.2 用户信息配置 2.5.3 文本编辑器配置 2.5.4 差异分析工具配置 2.5.5 查看配置信息 一、git的介绍 Git 是一种开源的…

奇怪的知识又增加了,ESP32下的Lisp编程:ULisp--Lisp for microcontrollers

ESP32下有MicroPython&#xff0c;那么我就在想&#xff0c;有Lisp语言支持吗&#xff1f;答案是果然有&#xff01;有ULisp&#xff0c;专门为MCU设计的Lisp&#xff01; 网址&#xff1a;uLisp - Lisp for microcontrollers 介绍&#xff1a;用于微控制器的 Lisp 适用于 Ar…

决策树的生成与剪枝

决策树的生成与剪枝 决策树的生成生成决策树的过程决策树的生成算法 决策树的剪枝决策树的损失函数决策树的剪枝算法 代码 决策树的生成 生成决策树的过程 为了方便分析描述&#xff0c;我们对上节课中的训练样本进行编号&#xff0c;每个样本加一个ID值&#xff0c;如图所示…

51c嵌入式~单片机~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信&#xff1f; 下面这个“电平转换”电路&#xff0c;理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途&#xff1a;当两个MCU在不同的工作电压下工作&a…

Kerberos实验

kdc&#xff1a;192.168.72.163 客户端&#xff08;机器账户win10&#xff09;&#xff1a;192.168.72.159 用户&#xff1a;administrator 抓包&#xff1a;开机登录win10&#xff0c;使用administrator域用户凭据登录。 生成 Kerberos 解密文件 抓取 krbtgt 用户和 win1…

AI一键分析小红书对标账号‼️

宝子们&#xff0c;AI小助手近期发现了一款宝藏AI工具&#xff0c;拥有对标账号AI分析功能&#xff0c;只需10秒就能全面掌握对标账号的运营情况&#xff0c;并且可以根据分析结果提供创作方向和灵感&#xff0c;轻松助力1:1复刻起号&#xff01; 功能亮点&#xff1a; &…

大腾智能CAD:国产云原生三维设计新选择

在快速发展的工业设计领域&#xff0c;CAD软件已成为不可或缺的核心工具。它通过强大的建模、分析、优化等功能&#xff0c;不仅显著提升了设计效率与精度&#xff0c;还促进了设计思维的创新与拓展&#xff0c;为产品从概念构想到实体制造的全过程提供了强有力的技术支持。然而…

VMware虚拟机 Ubuntu没有共享文件夹的问题

在虚拟机的Ubuntu系统中&#xff0c;共享文件目录存放在 mnt/hgfs 下面&#xff0c;但是我安装完系统并添加共享文件后发现&#xff0c;在mnt下连/hgfs目录都没有。 注意&#xff1a;使用共享文件目录需要已安装VMtools工具。 添加共享文件目录 一&#xff1a;在超级用户下 可…

OpenGL ES 01 渲染一个四边形

项目架构 着色器封装 vertex #version 300 es // 接收顶点数据 layout (location 0) in vec3 aPos; // 位置变量的属性位置值为0 layout (location 1) in vec4 aColors; // 位置变量的属性位置值为1 out vec4 vertexColor; // 为片段着色器指定一个颜色输出void main() {gl…

leetcode二叉搜索树部分笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 二叉搜索树 1. 二叉搜索树的最小绝对差2. 二叉搜索树中第 K 小的元素3. 验证二叉搜索树 1. 二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中…

推送本地仓库到远程git仓库

目录 推送本地仓库到远程git仓库1.1修改本地仓库用户名1.2 push 命令1.3远程分支查看 推送本地仓库到远程git仓库 删除之前的仓库中的所有内容&#xff0c;从新建库&#xff0c;同时创建一个 A.txt 文件 清空原有的远程仓库内容&#xff0c;重新创建一个新的仓库&#xff0c;…

暂停一下,给Next.js项目配置一下ESLint(Next+tailwind项目)

前提 之前开自己的GitHub项目&#xff0c;想着不是团队项目&#xff0c;偷懒没有配置eslint&#xff0c;后面发现还是不行。eslint的存在可以帮助我们规范代码格式&#xff0c;同时 ctrl s保存立即调整代码格式是真的很爽。 除此之外&#xff0c;团队使用eslint也是好处颇多…

基于微信小程序的小区疫情防控ssm+论文源码调试讲解

第2章 程序开发技术 2.1 Mysql数据库 为了更容易理解Mysql数据库&#xff0c;接下来就对其具备的主要特征进行描述。 &#xff08;1&#xff09;首选Mysql数据库也是为了节省开发资金&#xff0c;因为网络上对Mysql的源码都已进行了公开展示&#xff0c;开发者根据程序开发需…

Win11安装安卓子系统WSA

文章目录 简介一、启用Hyper-V二、安装WSA三、安装APKAPK商店参考文献 简介 WSA&#xff1a;Windows Subsystem For Android 一、启用Hyper-V 控制面板 → 程序和功能 → 启用或关闭 Windows 功能 → 勾选 Hyper-V 二、安装WSA 进入 Microsoft Store&#xff0c;下拉框改为 …

[面试题]--索引用了什么数据结构?有什么特点?

答&#xff1a;使用了B树&#xff1a; 时间复杂度&#xff1a;O(logN),可以有效控制树高 B树特点&#xff1a; 1.叶子节点之间有相互链接的作用&#xff0c;会指向下一个相近的兄弟节点。 MySQL在组织叶子节点使用的是双向链表 2.非叶子节点的值都保存在叶子节点当中 MySQL非叶…

Element plus 下拉框组件选中一个选项后显示的是 value 而不是 label

最近刚进行 Vue3 Element plus 项目实践&#xff0c;在进行表单二次封装的时候&#xff0c;表单元素 select 下拉框组件选中一个选项后显示的是 value 而不是 label&#xff0c;下面上代码&#xff1a; 原来的写法&#xff1a; <el-selectv-if"v.type select"…