运维高级学习--Kubernetes(K8s 1.28.x)部署
一、基础环境配置(所有主机操作)
主机名规划
序号 主机ip 主机名规划1 192.168.1.30 kubernetes-master.openlab.cn kubernetes-master2 192.168.1.31 kubernetes-node1.openlab.cn kubernetes-node13 192.168.1.32 kubernetes-node2.openlab.cn kubernetes-node24 192.168.1.33 kubernetes-node3.openlab.cn kubernetes-node35 192.168.1.34 kubernetes-register.openlab.cn kubernetes-register
1.配置IP地址和主机名、hosts解析
#这里只演示一台服务器上的命令,实则五台服务器都要实现
[root@kubernetes-master ~]# vim /etc/hosts
192.168.1.30 kubernetes-master.openlab.cn kubernetes-master
192.168.1.31 kubernetes-node1.openlab.cn kubernetes-node1
192.168.1.32 kubernetes-node2.openlab.cn kubernetes-node2
192.168.1.33 kubernetes-node3.openlab.cn kubernetes-node3
192.168.1.34 kubernetes-register.openlab.cn kubernetes-register
2.关闭防火墙、禁用SELinux
#这里只演示一台服务器上的命令,实则五台服务器都要实现
[root@kubernetes-master ~]# systemctl stop firewalld
[root@kubernetes-master ~]# systemctl disable firewalld
[root@kubernetes-master ~]# sed -i '/^SELINUX=/ c SELINUX=disabled' /etc/selinux/config
[root@kubernetes-master ~]# setenforce 0
3.安装常用软件
#这里只演示一台服务器上的命令,实则五台服务器都要实现
[root@kubernetes-master ~]# yum install -y wget tree bash-completion lrzsz psmisc net-tools vim
4.时间同步
#这里只演示一台服务器上的命令,实则五台服务器都要实现
[root@kubernetes-master ~]# yum install chrony -y
[root@kubernetes-master ~]# vim /etc/chrony.conf
···
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server ntp1.aliyun.com iburst
···
#启动chronyd服务并设置chronyd服务开机自启动
[root@kubernetes-master ~]# systemctl enable --now chronyd
[root@kubernetes-master ~]# chronyc sources
5.禁用Swap分区
#这里只演示一台服务器上的命令,实则五台服务器都要实现
#临时禁用
[root@kubernetes-master ~]# swapoff -a
#永久禁用
[root@kubernetes-master ~]# sed -i 's/.*swap.*/#&/' /etc/fstab
6.修改linux的内核参数
#这里只演示一台服务器上的命令,实则五台服务器都要实现
# 修改linux的内核参数,添加网桥过滤和地址转发功能
[root@kubernetes-master ~]# cat >> /etc/sysctl.d/k8s.conf << EOF
> vm.swappiness=0
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> net.ipv4.ip_forward = 1
> EOF#加载模块
[root@kubernetes-master ~]# modprobe br_netfilter
[root@kubernetes-master ~]# modprobe overlay
#重新加载配置
[root@kubernetes-master ~]# sysctl -p /etc/sysctl.d/k8s.conf
7.配置ipvs功能
#这里只演示一台服务器上的命令,实则五台服务器都要实现
#1.安装ipset和ipvsadm
[root@kubernetes-master ~]# yum install ipset ipvsadm -y
#2.添加需要加载的模块写入脚本文件
[root@kubernetes-master ~]# cat <<EOF>> /etc/sysconfig/modules/ipvs.modulesmodprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
#3.为脚本文件添加执行权限
[root@kubernetes-master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
#4.执行脚本文件
[root@kubernetes-master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
#5.查看对应的模块是否加载成功
[root@kubernetes-master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
ip_vs_sh 12688 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 0
ip_vs 145458 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 139264 1 ip_vs
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
二、容器环境操作(所有主机操作)
1.定制软件源
[root@kubernetes-master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@kubernetes-master ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.安装最新版docker
[root@kubernetes-master ~]# yum install docker-ce -y
3.配置docker加速器
[root@kubernetes-master ~]# cat >> /etc/docker/daemon.json <<-EOF
> {
> "registry-mirrors": [
> "http://74f21445.m.daocloud.io",
> "https://registry.docker-cn.com",
> "http://hub-mirror.c.163.com",
> "https://docker.mirrors.ustc.edu.cn"
> ],
> "insecure-registries": ["kubernetes-register.openlab.cn"],
> "exec-opts": ["native.cgroupdriver=systemd"]
> }
> EOF
4.启动docker
[root@kubernetes-master ~]# systemctl daemon-reload
[root@kubernetes-master ~]# systemctl enable --now docker
三、cri环境操作(所有主机操作)
#下载软件
[root@kubernetes-master ~]#wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4.amd64.tgz
#解压
[root@kubernetes-master ~]# tar xf cri-dockerd-0.3.4.amd64.tgz -C /usr/local/[root@kubernetes-master ~]# mv /usr/local/cri-dockerd/cri-dockerd /usr/local/bin/
[root@kubernetes-master ~]# cri-dockerd --version
cri-dockerd 0.3.4 (e88b1605)#定制配置文件
[root@kubernetes-master ~]# cat > /etc/systemd/system/cri-dockerd.service<<-EOF
> [Unit]
> Description=CRI Interface for Docker Application Container Engine
> Documentation=https://docs.mirantis.com
> After=network-online.target firewalld.service docker.service
> Wants=network-online.target
>
> [Service]
> Type=notify
> ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
> --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin -
> -container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --docker-endpoint=unix:///var/run/docker.sock --
> cri-dockerd-root-directory=/var/lib/docker
> ExecReload=/bin/kill -s HUP $MAINPID
> TimeoutSec=0
> RestartSec=2
> Restart=always
> StartLimitBurst=3
> StartLimitInterval=60s
> LimitNOFILE=infinity
> LimitNPROC=infinity
> LimitCORE=infinity
> TasksMax=infinity
> Delegate=yes
> KillMode=process
> [Install]
> WantedBy=multi-user.target
> EOF[root@kubernetes-master ~]# cat > /etc/systemd/system/cri-dockerd.socket <<-EOF
> [Unit]
> Description=CRI Docker Socket for the API
> PartOf=cri-docker.service
> [Socket]
> ListenStream=/var/run/cri-dockerd.sock
> SocketMode=0660
> SocketUser=root
> SocketGroup=docker
> [Install]
> WantedBy=sockets.target
> EOF#设置服务开机自启
[root@kubernetes-master ~]# systemctl daemon-reload
[root@kubernetes-master ~]# systemctl enable --now cri-dockerd.service
四、harbor仓库操作(只在仓库机器上执行)
#安装docker-compose
[root@kubernetes-register ~]# install -m 755 docker-compose-linux-x86_64 /usr/local/bin/docker-compose[root@kubernetes-register ~]# mkdir -p /data/server
[root@kubernetes-register ~]# tar xf harbor-offline-installer-v2.8.4.tgz -C /data/server/#加载镜像
[root@kubernetes-register ~]# cd /data/server/harbor/
[root@kubernetes-register harbor]# docker load -i harbor.v2.8.4.tar.gz#修改配置文件
[root@kubernetes-register harbor]# cp harbor.yml.tmpl harbor.yml
[root@kubernetes-register harbor]# vim harbor.yml
hostname: kubernetes-register.openlab.cn
#https:
# port: 443
# certificate: /your/certificate/path
# private_key: /your/private/key/path
···
harbor_admin_password: 123456
data_volume: /data/server/harbor/data
···
#配置harbor
[root@kubernetes-register harbor]# ./prepare
#启动harbor
[root@kubernetes-register harbor]# ./install.sh#定制服务启动文件
[root@kubernetes-register harbor]# vim /etc/systemd/system/harbor.service
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor
[Service]
Type=simple
Restart=on-failure
RestartSec=5
#需要注意harbor的安装位置
ExecStart=/usr/local/bin/docker-compose --file /data/server/harbor/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose --file /data/server/harbor/docker-compose.yml down
[Install]
WantedBy=multi-user.target#启动harbor并设置开机自启
[root@kubernetes-register harbor]# systemctl daemon-reload
[root@kubernetes-register harbor]# systemctl enable harbor.service
[root@kubernetes-register harbor]# systemctl restart harbor#测试仓库,只在k8s集群某一个节点
#拉取镜像
[root@kubernetes-master ~]# docker pull busybox
#登录harbor仓库
[root@kubernetes-master ~]# docker login kubernetes-register.openlab.cn -u admin -p 123456
#将镜像打上标签
[root@kubernetes-master ~]# docker tag busybox:latest kubernetes-register.openlab.cn/library/busybox:latest
#推送镜像到仓库
[root@kubernetes-master ~]# docker push kubernetes-register.openlab.cn/library/busybox:latest
五、k8s集群初始化
定制软件源(所有主机操作)
[root@kubernetes-master ~]# 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[root@kubernetes-master ~]# yum install kubeadm kubectl kubelet -y
在仓库中新建项目:google_containers
接下来这一步只用在一个主机上操作
[root@kubernetes-master ~]# vim images.sh
#!/bin/bash
images=$(kubeadm config images list --kubernetes-version=1.28.0 | awk -F'/' '{print $NF}')
for i in ${images}
dodocker pull registry.aliyuncs.com/google_containers/$idocker tag registry.aliyuncs.com/google_containers/$i kubernetes-register.openlab.cn/google_containers/$idocker push kubernetes-register.openlab.cn/google_containers/$idocker rmi registry.aliyuncs.com/google_containers/$i
done
#执行脚本文件
[root@kubernetes-master ~]# sh images.sh
master节点初始化
[root@kubernetes-master ~]# kubeadm init --kubernetes-version=1.28.0 \
> --apiserver-advertise-address=192.168.1.30 \
> --image-repository kubernetes-register.openlab.cn/google_containers \
> --service-cidr=10.96.0.0/12 \
> --pod-network-cidr=10.244.0.0/16 \
> --ignore-preflight-errors=Swap \
> --cri-socket=unix:///var/run/cri-dockerd.sock
···
kubeadm join 192.168.1.30:6443 --token wj0hmh.2cdfzhck6w32quzx \--discovery-token-ca-cert-hash sha256:a0b7e59c2e769dc1e2197611ecae1f39d7a0bd19fc25906fe7a5b43199d15cd2出现这两行说明初始化成功[root@kubernetes-master ~]# mkdir -p $HOME/.kube
[root@kubernetes-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@kubernetes-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
node节点加入
[root@kubernetes-node1 ~]# kubeadm join 192.168.1.30:6443 --token wj0hmh.2cdfzhck6w32quzx \
> --cri-socket=unix:///var/run/cri-dockerd.sock \
> --discovery-token-ca-cert-hash sha256:a0b7e59c2e769dc1e2197611ecae1f39d7a0bd19fc25906fe7a5b43199d15cd2#注意的是,每个人的令牌是不一样的
六、k8s环境收尾
命令补全
#放到master主机的环境文件中
[root@kubernetes-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@kubernetes-master ~]# echo "source <(kubeadm completion bash)" >> ~/.bashrc
[root@kubernetes-master ~]# source ~/.bashrc
网络环境(在master主机上)
#下载kube-flannel.yml[root@kubernetes-master ~]# vim flannel.sh
#执行脚本
[root@kubernetes-master ~]# sh flannel.sh
#修改配置文件
[root@kubernetes-master ~]# sed -i '/ image:/s#docker.io/flannel#kubernetes-register.openlab.cn/google_containers#' kube-flannel.yml#应用配置文件
[root@kubernetes-master ~]# kubectl apply -f kube-flannel.yml#检查效果
[root@kubernetes-master ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-76f899b8cf-tmdx9 1/1 Running 0 19m
coredns-76f899b8cf-zvfhg 1/1 Running 0 19m
etcd-kubernetes-master 1/1 Running 0 19m
kube-apiserver-kubernetes-master 1/1 Running 0 19m
kube-controller-manager-kubernetes-master 1/1 Running 0 19m
kube-proxy-rhdck 1/1 Running 0 14m
kube-proxy-tvfh4 1/1 Running 0 19m
kube-proxy-vjmrs 1/1 Running 0 14m
kube-proxy-zkwv2 1/1 Running 0 14m
kube-scheduler-kubernetes-master 1/1 Running 0 19m#全部都是Running就可以了
扩展:要让kubectl在node节点上也能运行,需要将master上的.kube文件复制到node节点上,即在master节点上执行下面操作:
scp -r $HOME/.kube kubernetes-node1.openlab.cn:$HOME/
scp -r $HOME/.kube kubernetes-node2.openlab.cn:$HOME/
scp -r $HOME/.kube kubernetes-node3.openlab.cn:$HOME/
至此,Kubernetes(K8s 1.28.x)部署完成
相关文章:

运维高级学习--Kubernetes(K8s 1.28.x)部署
一、基础环境配置(所有主机操作) 主机名规划 序号 主机ip 主机名规划1 192.168.1.30 kubernetes-master.openlab.cn kubernetes-master2 192.168.1.31 kubernetes-node1.openlab.cn kubernetes-node13 192.168.1.32 kubernetes-node2…...
Apache zookeeper kafka 开启SASL安全认证 —— 筑梦之路
简介 Kafka是一个高吞吐量、分布式的发布-订阅消息系统。Kafka核心模块使用Scala语言开发,支持多语言(如Java、Python、Go等)客户端,它可以水平扩展和具有高吞吐量特性而被广泛使用,并与多类开源分布式处理系统进行集成…...
lintcode 1017 · 相似的RGB颜色【进制计算】
题目链接,题目描述 https://www.lintcode.com/problem/1017 在本题中,每个大写字母代表从“0”到“f”的一些十六进制数字。红绿蓝三元色#AABBCC可以简写为#ABC。 例如,#15c是颜色#1155cc的简写。现在,定义两种颜色#ABCDEF和#UV…...

全国首台!浙江机器人产业集团发布垂起固定翼无人机-机器人自动换电机巢
展示突破性创新技术,共话行业发展趋势。8月25日,全国首台垂起固定翼无人机-机器人自动换电机巢新品发布会暨“科创中国宁波”无人机产业趋势分享会在余姚市机器人小镇成功举行。 本次活动在宁波市科学技术协会、余姚市科学技术协会指导下,由浙…...
采用 UML 对软件系统进行建模的基本框架
UML 包括一些可以相互组合为图标的图形元素, 通过提供不同形式的图形来 表述从软件分析开始的软件开发全过程的描述,一个图就是系统架构在某个侧面的 表示,所有的图组成了系统的完整视图。UML 主要提供了以下五类图: ÿ…...
编译tiny4412 Linux 内核
工作环境 Ubuntu 22 交叉编译器 4.5.1 解压Linux内核源码,进入目录 将官方配置完好的defconfig文件作为配置文件 cp tiny4412_linux_defconfig .config由于内核版本较低,需要下载低版本的gcc,选择下载gcc-9与g9 sudo apt install gcc-9 g-…...

Ubuntu22.04安装中文输入法►由踩坑到上岸版◄
Ubuntu22.04安装中文输入法►由踩坑到上岸版◄ 了解入坑上岸 更新一发:Gedit中文乱码问题的解决 为了方便回忆和记录甚至后面继续重装系统,我还是写一下以便将来用到或参考~ 了解 安装Ubuntu22.04(截至2023年08月26日11ÿ…...

SpringBoot简单上手
spring boot 是spring快速开发脚手架,通过约定大于配置,优化了混乱的依赖管理,和复杂的配置,让我们用java-jar方式,运行启动java web项目 入门案例 创建工程 先创建一个空的工程 创建一个名为demo_project的项目,并且…...

git及GitHub的使用
文章目录 git在本地仓库的使用github使用创建仓库https协议连接(不推荐,现在用起来比较麻烦)ssh连接(推荐)git分支操作冲突处理忽略文件 git在本地仓库的使用 1.在目标目录下右键打开git bash here 2.创建用户名和邮箱(注: 下载完…...

【考研数学】线性代数第四章 —— 线性方程组(1,基本概念 | 基本定理 | 解的结构)
文章目录 引言一、线性方程组的基本概念与表达形式二、线性方程组解的基本定理三、线性方程组解的结构写在最后 引言 继向量的学习后,一鼓作气,把线性方程组也解决了去。O.O 一、线性方程组的基本概念与表达形式 方程组 称为 n n n 元齐次线性方程组…...

使用Python写入数据到Excel:实战指南
在数据科学领域,Excel是一种广泛使用的电子表格工具,可以方便地进行数据管理和分析。然而,当数据规模较大或需要自动化处理时,手动操作Excel可能会变得繁琐。此时,使用Python编写程序将数据写入Excel文件是一个高效且便…...

接口测试总结分享(http与rpc)
接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 一、了解一下HTTP与RPC 1. HTTP(H…...

数据结构(Java实现)LinkedList与链表(下)
** ** 结论 让一个指针从链表起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇。 LinkedList的模拟实现 单个节点的实现 尾插 运行结果如下: 也…...

linux查看正在运行的nginx在哪个文件夹当中
1、查出Nginx进程PID ps -ef|grep nginx2、查看Nginx进程启动时的工作目录 ls -la /proc/<PID>/cwd将<PID>替换为第一步中列出的Nginx进程的PID。该命令会显示Nginx进程在启动时所在的工作目录(当前工作目录)...

Vue实现Excel表格中按钮增加小数位数,减少小数位数功能,多用于处理金融数据
效果图 <template><div><el-button click"increaseDecimals">A按钮</el-button><el-button click"roundNumber">B按钮</el-button><el-table :data"tableData" border><el-table-column v-for&q…...

自然语言处理(一):词嵌入
词嵌入 词嵌入(Word Embedding)是自然语言处理(NLP)中的一种技术,用于将文本中的单词映射到一个低维向量空间中。它是将文本中的单词表示为实数值向量的一种方式。 在传统的文本处理中,通常使用独热编码&…...

【HSPCIE仿真】HSPICE仿真基础
HSPICE概述 1. HSPICE简介3. 标准输入文件4. 标准输出文件3. HSPCIE仿真过程 1. HSPICE简介 SPICE (Simulation Program with IC Emphasis)是1972 年美国加利福尼亚大学柏克莱分校电机工程和计算机科学系开发 的用于集成电路性能分析的电路模拟程序。 …...

二、前端监控之方案调研
前端监控体系 一个完整的前端监控体系包括了日志采集、日志上报、日志存储、日志切分&计算、数据分析、告警等流程。 对于一名前端开发工程师来说,也就意味着工作不再局限于前端业务的开发工作,需要有Nginx服务运维能力、实时/离线分析能力、Node应…...
npm 创建 node.js 项目
package.json重要说明 package.json是创建任何node.js项目必须要有的一个文件。 因为在package.json文件中,有详细的项目描述, 包括: (1)项目名称:name (2)版本:version (3)依赖文件:dependencies 等…...

JMeter性能测试(上)
一、基础简介 界面 打开方式 双击 jmeter.bat双击 ApacheJMeter.jsr命令行输入 java -jar ApacheJMeter.jar 目录 BIN 目录:存放可执行文件和配置文件 docs目录:api文档,用于开发扩展组件 printable-docs目录:用户帮助手册 li…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...

Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...