Kubeadm 安装 Kubernetes 高可用集群 v1.30.0

1、修改主机名(各个节点)

hostnamectl set-hostname xxx

2、hosts 文件加入主机名(全部节点)
cat /etc/hosts

192.168.88.5 master1
192.168.88.6 master2
192.168.88.7 master3
192.168.88.8 node1

3、关闭防火墙(全部节点)

systemctl stop firewalld && systemctl disable firewalld

4、关闭 selinux(全部节点,需要重启服务器)

sed -i 's/^ *SELINUX=enforcing/SELINUX=disabled/g' 

5、关闭各节点 swap 分区(全部节点,需要重启服务器)

sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

6、同步时间(全部节点)

yum -y install chrony && systemctl enable chronyd && systemctl start chronyd
timedatectl set-timezone Asia/Shanghai && chronyc -a makestep

7、安装 ipset 服务(全部节点)

yum -y install ipvsadm ipset sysstat conntrack libseccomp

8、内核调整,将桥接的 IPv4 流量传递到 iptables 的链(全部节点)
cat /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1

文件立即生效

sysctl -p /etc/sysctl.d/k8s.conf

9、开启 ipvs 模块(全部节点)
cat /etc/sysconfig/modules/ipvs.modules

#!/bin/sh
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

10、赋予权限并执行脚本,用过滤查看是否生效(全部节点)

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

11、安装 haproxy 和 keepalived(所有节点)

yum -y install keepalived haproxy

12、修改 master 节点 keepalived.conf(全部节点)
cat /etc/keepalived/keepalived.conf(master1 节点)

! Configuration File for keepalived
global_defs {
    router_id LVS_DEVEL
    script_user root
    enable_script_security
}
vrrp_script check_apiserver {
  script "/etc/keepalived/check_apiserver.sh"   # 脚本检测路径
  interval 3
  weight -2
  fall 10
  rise 2
}

vrrp_instance VI_1 {
    state  MASTER           # 第一台 master 节点是 MASTER,其他 meater 节点是 BACKUP
    interface eno16777736   # 本机网卡名
    virtual_router_id 51    # 路由都是一样
    priority 100            # 第一台权重是 100
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.88.3        # VIP IP
    }
    track_script {
        check_apiserver     # 虚拟检测模块
    }
}

cat /etc/keepalived/keepalived.conf (master2 节点)

! Configuration File for keepalived
global_defs {
    router_id LVS_DEVEL
    script_user root
    enable_script_security
}
vrrp_script check_apiserver {
  script "/etc/keepalived/check_apiserver.sh"   # 脚本检测路径
  interval 3
  weight -2
  fall 10
  rise 2
}

vrrp_instance VI_1 {
    state  BACKUP           # 第一台 master 节点是 MASTER,其他 meater 节点是 BACKUP
    interface eno16777736   # 本机网卡名
    virtual_router_id 51    # 路由都是一样
    priority 90            # 第一台权重是 100
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.88.3        # VIP IP
    }
    track_script {
        check_apiserver     # 虚拟检测模块
    }
}

cat /etc/keepalived/keepalived.conf(master3 节点)

! Configuration File for keepalived
global_defs {
    router_id LVS_DEVEL
    script_user root
    enable_script_security
}
vrrp_script check_apiserver {
  script "/etc/keepalived/check_apiserver.sh"   # 脚本检测路径
  interval 3
  weight -2
  fall 10
  rise 2
}

vrrp_instance VI_1 {
    state  BACKUP           # 第一台 master 节点是 MASTER,其他 meater 节点是 BACKUP
    interface eno16777736   # 本机网卡名
    virtual_router_id 51    # 路由都是一样
    priority 80            # 第一台权重是 100
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.88.3        # VIP IP
    }
    track_script {
        check_apiserver     # 虚拟检测模块
    }
}

13、修改 haproxy.cfg 文件(三个 master 节点配置文件一样)
cat /etc/haproxy/haproxy.cfg

#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------
 
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2
 
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
 
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
 
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
 
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  kubernetes-apiserver
    mode                        tcp
    bind                        *:8443
    option                      tcplog
    default_backend             kubernetes-apiserver
 
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
listen stats
    bind            *:1080
    stats auth      admin:awesomePassword
    stats refresh   5s
    stats realm     HAProxy\ Statistics
    stats uri       /admin?stats
 
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend kubernetes-apiserver
    mode        tcp
    balance     roundrobin
    server  master1 192.168.88.5:6443 check
    server  master2 192.168.88.6:6443 check
    server  master3 192.168.88.7:6443 check

14、VIP 检测脚本
cat /etc/keepalived/check_apiserver.sh

#!/bin/sh
# HAPROXY down
A=`ps -C haproxy --no-header | wc -l`
if [ $A -eq 0 ]
then
systmectl start haproxy
  if [ ps -C haproxy --no-header | wc -l -eq 0 ]
  then
    killall -9 haproxy
    echo "HAPROXY down" | mail -s "haproxy"
    sleep 3600
fi  
fi

给脚本添加执行权限

chmod +x /etc/keepalived/check_apiserver.sh

15、启动服务(启动之后自行查看服务是否报错)

systemctl enable keepalived && systemctl start keepalived
systemctl enable haproxy && systemctl start haproxy

16、下载 docker 源(全部节点)

wget https://download.docker.com/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

17、安装容器运行时(全部节点)

yum -y install docker-ce && systemctl enable docker && systemctl start docker

18、创建 daemon.json 配置文件(全部节点)
cat /etc/docker/daemon.json

{
    "exec-opts":["native.cgroupdriver=systemd"],
    "log-driver":"json-file",
    "log-opts":{
        "max-size":"100m"
    }
}

重启 docker

systemctl restart docker

19、安装cri-docker

curl -LO https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.13/cri-dockerd-0.3.13-3.el7.x86_64.rpm && rpm -ivh cri-dockerd-0.3.13-3.el7.x86_64.rpm

查看版本

cri-dockerd --version

加入开机启动并启动

systemctl enable cri-docker && systemctl start cri-docker

20、配置 k8s 源
cat /etc/yum.repo.d/k8s.repo

[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
enabled=1
gpgcheck=0

更新yum缓存

yum clean all && yum makecache

21、安装 kubeadm,kubelet,kubectl

yum -y install kubeadm-1.30.0 kubelet-1.30.0 kubectl-1.30.0 && systemctl enable kubelet

22、整合 kubelet 和 cri-docker
修改/usr/lib/systemd/system/cri-docker.service文件的ExecStart字段(全部节点)

--network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d

在这里插入图片描述

重启cri-dockerd服务

systemctl daemon-reload && systemctl restart cri-docker

23、生成初始化配置文件
kubeadm config print init-defaults > kubeadm-init.yaml

24、修改默认配置文件
cat kubeadm-init.yaml

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.88.5         # 当前主机 ip
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/cri-dockerd.sock
  imagePullPolicy: IfNotPresent
  name: master1      # 本机主机名                    
  taints:
  - effect: "NoSchedule"
    key: "node-role.kubernetes.io/master"
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.88.3:8443  # 重点!! 这里是我们自定义的域名,端口是haproxy的端口,单master可注释掉这个参数
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.30.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16       # k8s 网卡网段(flannel,如果是 calico 需要改成别的网段)
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs     # k8s 需要 ipvs 模式
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd   # k8s 驱动 systemd

25、下载镜像

kubeadm config images pull --config kubeadm-init.yaml

26、初始化集群

kubeadm init --config kubeadm-init.yaml

在这里插入图片描述

27、在其他 master 节点创建目录

mkdir -p /etc/kubernetes/pki/etcd/

28、把主 master 节点证书分别复制到从 master 节点
cat cert.sh(自己创建脚本)

#!/bin/sh/
ip="192.168.88.6 192.168.88.7"

for host in $ip
do 
   scp /etc/kubernetes/pki/ca.* root@192.168.88.6:/etc/kubernetes/pki/
   scp /etc/kubernetes/pki/sa.* root@192.168.88.6:/etc/kubernetes/pki/
   scp /etc/kubernetes/pki/front-proxy-ca.* root@192.168.88.6:/etc/kubernetes/pki/
   scp /etc/kubernetes/pki/etcd/ca.* root@192.168.88.6:/etc/kubernetes/pki/etcd/
   scp /etc/kubernetes/admin.conf root@192.168.88.6:/etc/kubernetes/
   scp /etc/kubernetes/pki/ca.* root@192.168.88.7:/etc/kubernetes/pki/
   scp /etc/kubernetes/pki/sa.* root@192.168.88.7:/etc/kubernetes/pki/
   scp /etc/kubernetes/pki/front-proxy-ca.* root@192.168.88.7:/etc/kubernetes/pki/
   scp /etc/kubernetes/pki/etcd/ca.* root@192.168.88.7:/etc/kubernetes/pki/etcd/
   scp /etc/kubernetes/admin.conf root@192.168.88.7:/etc/kubernetes/
done

把主节点admin.conf证书复制到其他node节点

scp /etc/kubernetes/admin.conf root@192.168.88.8:/etc/kubernetes/

29、其他 master 节点加入集群命令

kubeadm join 192.168.88.3:6443 --token uozrup.6v02tswc3xk33org \
	--discovery-token-ca-cert-hash sha256:b5391b689f7986a2ef8aa84665568e9ea25a031c89c31472bb56f14e17c7c471 \
	--control-plane --certificate-key 3fdfbfe831ebc90939cdbde89d3894cbe527b64f67a4cd90de56018dfae75399 
    --cri-socket=unix:///var/run/cri-dockerd.sock

node 节点加入集群命令

kubeadm join 192.168.88.3:6443 --token uozrup.6v02tswc3xk33org \
	--discovery-token-ca-cert-hash sha256:b5391b689f7986a2ef8aa84665568e9ea25a031c89c31472bb56f14e17c7c471 --cri-socket=unix:///var/run/cri-dockerd.sock

30、非 root 用户加入 master 执行以下命令

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

root 用户加入 master 执行以下命令

export KUBECONFIG=/etc/kubernetes/admin.conf

31、安装网络插件

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

查看集群网络是否正常

kubectl get pods --all-namespaces 

在这里插入图片描述

kubectl get pods --all-namespaces

在这里插入图片描述

32、安装 etcdctl 客户端(可以用脚本中的集群查询命令也可以单独用最下面的 etcd 查询命令)

cat etcdctl.sh

#!/bin/sh
# Author: Jacket_San
# Email: xxx@163.com
# Date: 26/11/2024
# Filename: etcd.sh
 
##########################
#    etcd 客户端安装     #    
# etcdctl 查询数据库信息 #
##########################

# 定义 etcd 路径
path="/root/etcd/"

# 下载 etcd 客户端并加入环境变量
if [ ! -d "$path" ];then
    mkdir $path
fi

# yum 安装 jq
yum -y install jq

# 获取最新版本号
LATEST_VERSION=$(curl -s https://api.github.com/repos/etcd-io/etcd/releases/latest | jq -r .tag_name)

# 下载最新版本的 tar.gz 文件
curl -L -O https://github.com/etcd-io/etcd/releases/download/${LATEST_VERSION}/etc-${LATEST_VERSION}-linux-amd64.tar.gz 

# 移动 etcdctl 到指定目录并授权
mv /root/etcd-*.tar.gz $path && cd $path && tar -zxf * 
mv */etcdctl /usr/local/bin && chmod +x /usr/local/bin/
 
# 查看 etcdctl 版本
etcdctl version && etcdctl -h

# 查看etcd高可用集群健康状态
ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=192.168.88.5:2379,192.168.88.6:2379,192.168.88.7:2379 endpoint health

# 查看etcd高可用集群列表
ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=192.168.88.5:2379,192.168.88.6:2379,192.168.88.7:2379 member list

# 查看etcd高可用集群leader
ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=192.168.88.5:2379,192.168.88.6:2379,192.168.88.7:2379 endpoint status

在这里插入图片描述

33、查看etcd高可用集群健康状态

ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=192.168.88.5:2379,192.168.88.6:2379,192.168.88.7:2379 endpoint health

在这里插入图片描述

查看etcd高可用集群列表

ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=192.168.88.5:2379,192.168.88.6:2379,192.168.88.7:2379 member list

在这里插入图片描述

查看etcd高可用集群leader

ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key --write-out=table --endpoints=192.168.88.5:2379,192.168.88.6:2379,192.168.88.7:2379 endpoint status

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

泥石流灾害风险评估与模拟丨AI与R语言、ArcGIS、HECRAS融合,提升泥石流灾害风险预测的精度和准确性

目录 第一章 理论基础 第二章 泥石流风险评估工具 第三章 数据准备与因子提取 第四章 泥石流灾害评价 第五章 HECRAS软件的应用 第六章 操作注意事项与模型优化 泥石流灾害的频发与严重后果,已成为全球范围内防灾减灾工作的重大挑战。随着科技的不断进步&…

自由学习记录(25)

只要有修改,子表就不用元表的参数了,用自己的参数(只不过和元表里的那个同名) 子表用__index“继承”了父表的值,此时子表仍然是空表 一定是创建这样一个同名的变量在原本空空的子表里, 传参要传具体的变…

leetcode 3206. 交替组 I 简单

给你一个整数数组 colors ,它表示一个由红色和蓝色瓷砖组成的环,第 i 块瓷砖的颜色为 colors[i] : colors[i] 0 表示第 i 块瓷砖的颜色是 红色 。colors[i] 1 表示第 i 块瓷砖的颜色是 蓝色 。 环中连续 3 块瓷砖的颜色如果是 交替 颜色&…

彻底解决 macOS 下Matplotlib 中文显示乱码问题

彻底解决 macOS 下Matplotlib 中文显示乱码问题 在使用 Python 的 Matplotlib 库进行数据可视化时,中文字符的显示常常会出现乱码问题,尤其在 macOS 系统上。在网上找了一大堆方法,花了很久,发现不是要安装各种字体就是要改配置&…

深度学习笔记24_天气预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境:Python 3.9 2.编译器:Pycharm 3.深度学习环境:TensorFlow 2.10.0 二、GPU设置…

podman 源码 5.3.1编译

1. 构建环境 在麒麟V10服务器操作系统上构建:Kylin-Server-V10-GFB-Release-2204-Build03-ARM64.iso。由于只是编译 podman 源码,没必要特地在物理机或服务上安装一个这样的操作系统,故采用在虚拟机里验证。 2. 安装依赖 参考资料&#xf…

【K8S系列】深入解析 Kubernetes 中的 Deployment

Kubernetes(K8s)是一个开源的容器编排平台,旨在自动化应用程序的部署、扩展和管理。在 Kubernetes 中,Deployment 是一种用于管理无状态应用的工作负载资源,提供了丰富的功能,包括版本控制、滚动更新和回滚…

玩转 Burp Suite (1)

内容预览 ≧∀≦ゞ 玩转 Burp Suite (1)声明Burp Suite 简介Dashboard(仪表盘)1. 默认任务管理2. 暂停任务3. 新建扫描任务4. 使用总结 Target(目标)1. SIte Map (站点地图)2. Scope(范围&#…

【ArcGISPro】Sentinel-2数据处理

错误 默认拉进去只组织了4个波段,但是实际有12个波段 解决方案 数据下载 Sentinel-2 数据下载-CSDN博客 数据处理 数据查看 创建镶嵌数据集 在数据管理工具箱中找到创建镶嵌数据集

智慧环保大数据解决方案

1. 智慧环保概述 智慧环保是“数字环保”的延伸,借助物联网技术整合环境监控对象,通过云计算实现环境管理与决策的智能化。其核心在于快速感知城市环境指标,保障人体健康与生命安全。 2. 智慧环保总体目标 智慧环保的总体目标是建立全面感…

【H2O2|全栈】JS进阶知识(八)ES6(4)

目录 前言 开篇语 准备工作 浅拷贝和深拷贝 浅拷贝 概念 常见方法 弊端 案例 深拷贝 概念 常见方法 弊端 逐层拷贝 原型 构造函数 概念 形式 成员 弊端 显式原型和隐式原型 概念 形式 constructor 概念 形式 原型链 概念 形式 结束语 前言 开篇语…

03-微服务搭建

1、搭建分布式基本环境 分布式组件 功能 SpringCloud Alibaba - Nacos 注册中心(服务发现/注册)、配置中心(动态配置管理) SpringCloud Alibaba - Sentinel 服务容错(限流、降级、熔断) SpringCloud …

Vue前端开发2.3.2-4 绑定指令

本文介绍了Vue中的绑定指令,包括属性绑定指令v-bind、事件绑定指令v-on以及双向数据绑定指令v-model。通过创建单文件组件,演示了如何使用这些指令来控制DOM属性、监听事件和实现表单输入与数据的双向同步。同时,探讨了v-model的修饰符如.num…

uniapp开发支付宝小程序自定义tabbar样式异常

解决方案: 这个问题应该是支付宝基础库的问题,除了依赖于官方更新之外,开发者可以利用《自定义 tabBar》曲线救国 也就是创建一个空内容的自定义tabBar,这样即使 tabBar 被渲染出来,但从视觉上也不会有问题 1.官方文…

双向链表、循环链表、栈

双向循环链表 class Node:#显性定义出构造函数def __init__(self,data):self.data data #普通节点的数据域self.next None #保存下一个节点的链接域self.prior None #保存前一个节点饿链接域 class DoubleLinkLoop:def __init__(self, node Node):self.head nodeself.siz…

【大数据学习 | Spark-Core】RDD的缓存(cache and checkpoint)

1. 单应用缓存:cache 1.1 cache算子 cache算子能够缓存中间结果数据到各个executor中,后续的任务如果需要这部分数据就可以直接使用避免大量的重复执行和运算。 rdd 存储级别中默认使用的算子cache算子,cache算子的底层调用的是persist算子…

上海乐鑫科技一级代理商飞睿科技,ESP32-C61高性价比WiFi6芯片高性能、大容量

在当今快速发展的物联网市场中,无线连接技术的不断进步对智能设备的性能和能效提出了更高要求。为了满足这一需求,乐鑫科技推出了ESP32-C61——一款高性价比的Wi-Fi 6芯片,旨在为用户设备提供更出色的物联网性能,并满足智能设备连…

如何选择黑白相机和彩色相机

我们在选择成像解决方案时黑白相机很容易被忽略,因为许多新相机提供鲜艳的颜色,鲜明的对比度和改进的弱光性能。然而,有许多应用,选择黑白相机将是更好的选择,因为他们产生更清晰的图像,更好的分辨率&#…

ubuntu22开机自动登陆和开机自动运行google浏览器自动打开网页

一、开机自动登陆 1、打开settings->点击Users 重启系统即可自动登陆桌面 二、开机自动运行google浏览器自动打开网页 1、安装google浏览器 sudo wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg -i ./google-chrome-stable…

MVC、EL、JSTL

1.MVC设计模式 三层: MVC: M(Model)模型:负责业务逻辑处理,数据库访问。 V(View)视图:负责与用户交互。 C(Controller)控制器:负责流程…