Part1:基于国内源完成Kubernetes集群部署

集群规划

操作系统:CentOS7 内核版本:5.4+(需升级)

组件版本说明
操作系统内核5.4+RPM方式升级
docker26.1.4yum安装
cri-docker0.3.16二进制安装
kubeadm1.30.11yum安装
kubealet1.30.11yum安装
kubectl1.30.11yum安装
kubectl1.30.11yum安装
kubernetes1.30.11kubeadm部署
flannel1.6.2CNI插件
kubernetes-dashboad7.6.5helm安装
metric-server0.7.2

网络规划

  • 虚拟机NAT地址
    子网IP子网掩码网关
    192.168.85.0255.255.255.0192.168.85.1
  • K8S集群网络
    Pod子网Service子网
    10.240.0.0/1610.140.0.0/16
  • K8S集群节点
    节点名称节点IP
    master101192.168.85.101
    node102192.168.85.102
    node103192.168.85.103

创建虚拟机

使用VMWare先创建一个虚拟机,虚拟机的网络配置使用网桥,需要提前配置好网络配置,如:网段、掩码、网关。这部分教程比较多,可自行搜索。唯一需要注意的一点就是NAT网络的设置,需要注意子网、掩码、网关的地址,在后续的操作系统中用于配置节点的网络。
在这里插入图片描述

系统配置

配置网络

操作系统安装好之后,第一步就是先配置好网络,网络连通之后才能继续后续的步骤。在这个集群里,我们通常会把IP设置为静态IP方便管理。

[root@master101 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO="static" # 必须为static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33 # 网卡名称
UUID=07ba6f88-2fce-4fd9-9b95-4da163097f7a
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.85.101 # 静态IP 需要在虚拟机的NET地址网段内
GATEWAY=192.168.85.1 # 网关 需要与虚拟机的NET地址的网关一致
NETMASK=255.255.255.0 # 掩码 需要与虚拟机的NET地址的掩码一致
IPV6_PRIVACY=no #
DNS1=8.8.8.8 # DNS可以有多个,也可以使用其他稳定的DNS
PREFIX=24

重新启动下网络,并检查下IP是否是与配置文件一致

[root@master101 ~]# systemctl restart network
[root@master101 ~]# ifconfig

关闭防火墙

[root@master101 ~]# systemctl disable firewalld
[root@master101 ~]# systemctl stop firewalld
[root@master101 ~]# systemctl status firewalld
[root@master101 ~]# systemctl restart network

同步时钟

[root@master101 ~]# timedatectl set-timezone 'Asia/Shanghai'
[root@master101 ~]# ntpdate ntp1.aliyun.com
[root@master101 ~]# date
[root@master101 ~]# cat >> /etc/crontab << EOF
* * * * root /usr/sbin/ntpdate ntp1.aliyun.com && /sbin/hwclock -w
EOF

升级内核

Kubernetes 1.30 默认要求容器运行时(containerd/CRI-O)启用 ​cgroups v2,而完整支持该功能需要 Linux 5.4+ 内核。目前使用的docker,没有修改使用到cgroupV2。

  1. 查看系统的内核版本
    [root@master101 ~]# uname -r
    3.10.0-693.el7.x86_64
    
  2. 使用yum升级内核
    [root@master101 ~]# cat <<EOF > /etc/yum.repos.d/elrepo.repo
    [elrepo]
    name=elrepo
    baseurl=https://mirrors.aliyun.com/elrepo/archive/kernel/el7/x86_64
    gpgcheck=0
    enabled=1
    EOF
    [root@master101 ~]# yum clean all && yum makecache
    [root@master101 ~]# yum list --showduplicate kernel*
    已加载插件:fastestmirror, langpacks
    Loading mirror speeds from cached hostfile
    已安装的软件包
    kernel.x86_64                              3.10.0-693.el7                   @anaconda
    kernel-devel.x86_64                        3.10.0-693.el7                   @anaconda
    kernel-headers.x86_64                      3.10.0-693.el7                   @anaconda
    kernel-tools.x86_64                        3.10.0-693.el7                   @anaconda
    kernel-tools-libs.x86_64                   3.10.0-693.el7                   @anaconda
    
    没有找到预期的内核版本,所以换种另外的方式,使用RPM来安装。
  3. RPM升级内核
    下载内核包
    [root@master101 ~]# mkdir kernel-rpm
    [root@master101 ~]# cd kernel-rpm
    [root@master101 kernel-rpm]# wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.226-1.el7.elrepo.x86_64.rpm
    [root@master101 kernel-rpm]# wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-headers-5.4.226-1.el7.elrepo.x86_64.rpm
    [root@master101 kernel-rpm]# wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-5.4.226-1.el7.elrepo.x86_64.rpm
    
    安装
    [root@master101 kernel-rpm]#  rpm -ivh kernel-lt-5.4.226-1.el7.elrepo.x86_64.rpm
    [root@master101 kernel-rpm]# rpm -ivh kernel-lt-devel-5.4.226-1.el7.elrepo.x86_64.rpm
    
    查看内核启动版本
    [root@master101 kernel-rpm]# rpm -qa | grep kernel
    kernel-tools-libs-3.10.0-693.el7.x86_64
    kernel-headers-3.10.0-693.el7.x86_64
    kernel-lt-5.4.226-1.el7.elrepo.x86_64
    abrt-addon-kerneloops-2.1.11-48.el7.centos.x86_64
    kernel-lt-devel-5.4.226-1.el7.elrepo.x86_64
    kernel-3.10.0-693.el7.x86_64
    kernel-devel-3.10.0-693.el7.x86_64
    kernel-tools-3.10.0-693.el7.x86_64
    
    设置内核启动顺序,默认启动高版本的内核
    [root@master101 ~]# cat /etc/grub2.cfg | grep menuentry|awk -F "\'" '$1=="menuentry " {print i++ " : " $2}'
    [root@master101 ~]# grub2-set-default 0
    [root@master101 ~]# reboot
    [root@master101 ~]# uname -r
    5.4.226-1.el7.elrepo.x86_64
    
    CentOS7.9升级3.10内核至5.4

配置内核参数

禁止使用swap分区

[root@master101 ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
[root@master101 ~]# setenforce 0
[root@master101 ~]# swapoff -a

将桥接的lPv4流量传递到iptables的链

[root@master101 ~]# cat > /etc/sysctl.d/k8s.conf << EOF
vm.swappiness=0
net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_recycle = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
[root@master101 ~]# sysctl -p /etc/sysctl.d/k8s.conf
vm.swappiness = 0
net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_recycle = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
[root@master101 ~]# sysctl --system 

配置ipvs功能

[root@master101 ~]# yum install ipset ipvsadm -y
[root@master101 ~]# cat >> /etc/sysconfig/modules/ipvs.modules << EOF
> #!/bin/bash
> modprobe -- ip_vs
> modprobe -- ip_vs_rr
> modprobe -- ip_vs_wrr
> modprobe -- ip_vs_sh
> modprobe -- nf_conntrack
> EOF
[root@master101 ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
[root@master101 ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
[root@master101 ~]# 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_ipv4      15053  2 
nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
nf_conntrack          139264  6 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4
libcrc32c              12644  4 xfs,ip_vs,nf_nat,nf_conntrack

安装Docker以及cri-dockerd

安装Docker

[root@master101 ~]# yum remove docker*
[root@master101 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@master101 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@master101 ~]# yum install -y docker-ce
[root@master101 ~]# docker -v
Docker version 26.1.4, build 5650f9b

配置国内的镜像源,一般可以去阿里云注册一个账户,免费使用它的镜像加速。当然也可以使用其他常用的加速地址。不过更推荐阿里云的,因为比较稳定。

[root@localhost ~]# cat >> /etc/docker/daemon.json << EOF
{"registry-mirrors": ["https://29wbjzyc.mirror.aliyuncs.com","https://registry.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn"],"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF[root@master101 ~]# systemctl daemon-reload
[root@master101 ~]# systemctl restart docker

先拉取下后续安装K8S所需的镜像,顺便验证下docker是否正常。

[root@master101 ~]# docker images
REPOSITORY                                                                                  TAG               IMAGE ID       CREATED         SIZE
ghcr.io/flannel-io/flannel-cni-plugin                                                       v1.6.2-flannel1   55ce2385d9d8   6 weeks ago     10.7MB
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/kubernetesui/dashboard-api               1.8.1             9446b3f1c3ba   6 months ago    46.9MB
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/kong                                     3.8.0             8ed1b48bc959   6 months ago    375MB
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/kubernetesui/dashboard-web               1.4.0             65bdf9576e48   9 months ago    181MB
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/kubernetesui/dashboard-auth              1.1.3             19b0f210f0dc   11 months ago   40.1MB
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/kubernetesui/dashboard-metrics-scraper   1.1.1             e3e259695944   12 months ago   35.3MB

安装cri-dockerd

[root@master101 ~]# mkdir k8s && cd k8s
[root@master101 k8s]# wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.16/cri-dockerd-0.3.16.amd64.tgz 
[root@master101 k8s]# ls
cri-dockerd-0.3.16.amd64.tgz
[root@master101 k8s]# tar xvf cri-dockerd-0.3.16.amd64.tgz
cri-dockerd/
cri-dockerd/cri-dockerd
[root@master101 k8s]# ls
cri-dockerd  cri-dockerd-0.3.16.amd64.tgz
[root@master101 k8s]# cp cri-dockerd/cri-dockerd /usr/bin/
[root@master101 k8s]# cri-dockerd --version
cri-dockerd 0.3.16 (7119864)

配置 cri-docker 服务


# 配置 cri-docker 服务
[root@master101 k8s]#  cat > /usr/lib/systemd/system/cri-docker.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
Requires=cri-docker.socket[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
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# 配置 cri-docker socket
[root@master101 k8s]# cat > /usr/lib/systemd/system/cri-docker.socket <<EOF 
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker[Install]
WantedBy=sockets.target

重新启动并且设置开机自启动

[root@master101 k8s]# systemctl daemon-reload
[root@master101 k8s]# systemctl enable cri-docker --now

安装 kubeadm、kubelet、kubectl

通过阿里云的镜像站来完成加速下载 kubeadm、kubelet、kubectl。需要注意的是由于 Kubernetes 官方变更了仓库的存储路径以及使用方式,如果需要使用 1.28 及以上版本,需要使用新版配置方法进行配置。详情参见阿里云开发者社区-镜像站-kubernetes。

[root@master101 ~]# cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/repodata/repomd.xml.key
EOF[root@master101 ~]# yum --disablerepo="*" --enablerepo="kubernetes" list available
[root@master101 ~]# yum -y install kubeadm kubelet kubectl# 如果无法启动则需要排查下,可能因为开启了swap
[root@master101 ~]# systemctl status kubelet
[root@master101 ~]# systemctl start kubelet
[root@master101 ~]# systemctl enable kubelet

注意:如果kubelet启动失败,大概率是系统开启了swap分区,这时候是需要关闭的。

[root@master101 ~]# swapon --show
NAME      TYPE      SIZE USED PRIO
/dev/dm-1 partition   2G 524K   -2
[root@master101 ~]# cat /etc/fstab | grep swap
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@master101 ~]# vim /etc/fstab 
[root@master101 ~]# cat /etc/fstab | grep swap
#/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@master101 ~]# swapoff -a

克隆机器

目前为止,我们在master101上配置了k8s集群部署所需的关键配置,也完成了docker和k8s容器运行时的安装,拉取了后续集群部署所需的镜像。 拉取镜像其实可以放到后续的步骤去完成,只是我比较懒,我更希望通过克隆虚拟机的方式将所有资源都拷贝到集群的各个节点上。这样可以避免多次下载。后面直接将master101当成模板机克隆出两台机器node102以及node103,当然熟悉的朋友也可以自行再次新建虚拟机完成。这里的克隆我就不再演示了,比较简单,没什么门槛,只是克隆的时候需要注意是完整克隆。

网络配置

由于两台虚拟机都是通过master101克隆出来的,所以克隆出来的node102,、node103与master101的IP地址还有主机名都是一样的,因此我们需要修改IP地址和主机名。先单独开启node102,或者将master101和node103的网络断开,这样node102就可以正常使用网络通信了。

需要注意UUID是否与master101一致,如果一致则需要重新修改,UUID在我们的网络集群中必须保证唯一性。设置完IP之后,我们再修改下主机名方便我们更好的区分。

[root@master101 ~]# cat  /etc/sysconfig/network-scripts/ifcfg-ens33 | grep -E 'IPADDR|UUID'
UUID=1ebe2b03-dd7d-4df7-87e9-1dbc00c33252
IPADDR=192.168.85.101
[root@master101 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@master101 ~]# cat  /etc/sysconfig/network-scripts/ifcfg-ens33 | grep -E 'IPADDR|UUID'
UUID=1ebe2b03-dd7d-4df7-87e9-1dbc00c33252
IPADDR=192.168.85.102
[root@master101 ~]# hostnamectl set-hostname node102
[root@master101 ~]# systemctl restart network

如果我们使用shell远程连接的可能需要重新使用node102的IP完成登录。按照此步骤我们开启node103并完成相关的配置。

[root@master101 ~]# cat  /etc/sysconfig/network-scripts/ifcfg-ens33 | grep -E 'IPADDR|UUID'
UUID=1ebe2b03-dd7d-4df7-87e9-1dbc00c33259
IPADDR=192.168.85.101
[root@master101 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@master101 ~]# cat  /etc/sysconfig/network-scripts/ifcfg-ens33 | grep -E 'IPADDR|UUID'
UUID=1ebe2b03-dd7d-4df7-87e9-1dbc00c33259
IPADDR=192.168.85.103
[root@master101 ~]# hostnamectl set-hostname node103
[root@master101 ~]# systemctl restart network

在三台主机上都添加下集群节点的主机名信息,注意是三个节点都执行

[root@master101 ~]# cat >> /etc/hosts <<EOF
> 192.168.85.101 master101 master101
> 192.168.85.102 node102 node102
> 192.168.85.103 node103 node103
> EOF

免密登录

所有主机均修改ssh配置运行公钥验证免密登录,先打开公钥验证开关,注意三个主机都需要执行。

[root@master101 ~]# cat /etc/ssh/sshd_config | grep -e AuthorizedKeysFile -e PubkeyAuthentication 
#PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys
[root@master101 ~]# vim /etc/ssh/sshd_config
[root@master101 ~]# cat /etc/ssh/sshd_config | grep -e AuthorizedKeysFile -e PubkeyAuthentication 
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

生成以RSA算法生成的秘钥对,执行命令时不输入任何信息直接回车,保持默认就行。三个节点均需要执行。

[root@master101 ~]# ssh-keygen -t rsa
[root@master101 .ssh]# pwd
/root/.ssh
[root@master101 .ssh]# ls
id_rsa  id_rsa.pub

在master101上将每个节点的公钥复制

[root@master101 .ssh]# cat id_rsa.pub >> authorized_keys
[root@master101 .ssh]# ssh master101			# 自己远程自己,测试下
[root@master101 ~]# ssh root@node102 cat ~/.ssh/id_rsa.pub>> authorized_keys
[root@master101 ~]# ssh root@node103 cat ~/.ssh/id_rsa.pub>> authorized_keys
[root@master101 ~]# scp authorized_keys root@node102:/root/.ssh/
[root@master101 ~]# scp authorized_keys root@node103:/root/.ssh/
[root@master101 ~]# scp known_hosts root@node102:/root/.ssh/
[root@master101 ~]# scp known_hosts root@node103:/root/.ssh/

Part1结束语

截止到目前为止,我们已经完成了k8s集群部署的所有准备工作,接下来就是使用kubeadm来完成集群的部署。具体步骤在Part2:基于国内源完成Kubernetes集群部署。

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

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

相关文章

中考英语之10难点单词

A abandon ~动词&#xff0c;意为 “抛弃&#xff1b;放弃”。 ~例如 He abandoned his old bike by the roadside.&#xff08;他把他的旧自行车扔在路边。&#xff09; absolute ~形容词&#xff0c;“绝对的&#xff1b;完全的”。 ~例如 We have absolute trust in him…

【GPT入门】第24课 langfuse介绍

【GPT入门】第24课 langfuse介绍 1. langfuse概念与作用2. 代码3. 页面效果4. 设计模式1. 装饰器模式2. 上下文管理模式1. langfuse概念与作用 Langfuse是一款专为大规模语言模型(LLM)应用开发设计的开源平台。其作用主要包括以下几个方面: 提升开发效率:通过消除LLM应用构…

在 React 中使用 Web Components 的实践操作

前言 在现代前端开发中&#xff0c;React 和 Web Components 都是广泛使用且备受欢迎的技术。React 是一个用于构建用户界面的 JavaScript 库&#xff0c;提供了组件化的开发方式和高效的状态管理&#xff0c;而 Web Components 是一套原生的浏览器技术标准&#xff0c;允许开…

C++单例模式精解

单例模式&#xff08;重点*&#xff09; 单例模式是23种常用设计模式中最简单的设计模式之一&#xff0c;它提供了一种创建对象的方式&#xff0c;确保只有单个对象被创建。这个设计模式主要目的是想在整个系统中只能出现类的一个实例&#xff0c;即一个类只有一个对象。 将单…

【微服务】java中http调用组件深入实战详解

目录 一、前言 二、http调用概述 2.1 什么是http调用 2.1.1 http调用步骤 2.2 HTTP调用特点 2.3 HTTP调用应用场景 三、微服务场景下http调用概述 3.1 微服务开发中http调用场景 3.2 微服务组件中http的应用 四、常用的http调用组件 4.1 java中常用的http组件介绍 4…

Implementing SAP BPC Embedded - 2nd Edition

Implementing SAP BPC Embedded - 2nd Edition

stm32第四天控制蜂鸣器

一&#xff1a; 1.蜂鸣器的种类 蜂鸣器是一种常用的电子发声元器件&#xff0c;采用直流电压供电。广泛应用于计算机&#xff0c;打ED机&#xff0c;报警器&#xff0c;电子玩具&#xff0c;汽车电子设备灯等产品中常见的蜂鸣器可分为有源蜂鸣器和无源蜂鸣器。 2.蜂鸣器的控制…

Swift 中 associatedtype 的用法详解

目录 前言 1.什么是associatedtype 2.associatedtype 的作用 1.让协议支持泛型 2.让协议支持不同的数据类型 3.结合 where 关键字限制类型 4.什么时候使用 associatedtype 5.总结 前言 在 Swift 语言中&#xff0c;泛型&#xff08;Generics&#xff09;是一个非常强大…

每日Attention学习26——Dynamic Weighted Feature Fusion

模块出处 [ACM MM 23] [link] [code] Efficient Parallel Multi-Scale Detail and Semantic Encoding Network for Lightweight Semantic Segmentation 模块名称 Dynamic Weighted Feature Fusion (DWFF) 模块作用 双级特征融合 模块结构 模块思想 我们提出了 DWFF 策略&am…

OpenCV实现图像特征提取与匹配

‌一、特征检测与描述子提取‌ ‌选择特征检测器‌ 常用算法包括&#xff1a; ‌ORB‌&#xff1a;一种高效的替代SIFT和SURF的算法&#xff0c;主要用于移动机器人和增强现实等领域。适合实时应用&#xff0c;结合FAST关键点与BRIEF描述子‌。‌SIFT&#xff08;尺度不变特征变…

向量检索在AI中的应用与技术解析

关键要点 向量检索在AI中用于信息检索、推荐系统和图像搜索&#xff0c;研究表明其通过高维空间中的向量表示数据来提升搜索相关性。它依赖于嵌入技术&#xff08;如Word2Vec、BERT&#xff09;和近邻算法&#xff08;如kNN、ANN&#xff09;&#xff0c;证据倾向于其在处理大…

事务与异步方法(@Async)协同工作

目录 1. 问题场景与风险 &#xff08;1&#xff09;典型场景 &#xff08;2&#xff09;风险分析 2. 解决方案&#xff1a;事务提交后触发异步操作 &#xff08;1&#xff09;代码示例 &#xff08;2&#xff09;关键注解 3. 原理解析 &#xff08;1&#xff09;事务同…

关于进程的实验(子进程和父进程相关的)

文章目录 1.第一个问题2.第二个问题3.第三个问题 1.第一个问题 编写一段程序&#xff0c;利用系统调用fork( )创建两个进程。当此程序运行时&#xff0c;在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符&#xff1a;父进程显示字符“a”;子进程分别显…

MyBatis 如何创建 SqlSession 对象的?

MyBatis 创建 SqlSession 对象的过程主要由 SqlSessionFactory 接口及其实现类来完成。以下是详细步骤&#xff1a; 1. SqlSessionFactory 接口: SqlSessionFactory 是 MyBatis 的核心接口之一&#xff0c;它负责创建 SqlSession 对象。 你可以将 SqlSessionFactory 视为 Sql…

深度优先搜索(DFS)剪枝技术详解与C++实现

深度优先搜索&#xff08;DFS&#xff09;剪枝技术通过提前终止无效路径的搜索&#xff0c;大幅提升算法效率。以下是五种核心剪枝技术的详细解析及C代码示例&#xff1a; 目录 一、可行性剪枝 C实现示例 二、搜索顺序剪枝 伪代码逻辑 三、最优性剪枝 C实现示例 四、排除…

【双指针】移动零

题目描述&#xff1a; 算法分析&#xff1a; 观察输入输出&#xff1a; 输出中一共分为两个区域&#xff0c;0区和非零区。 但是在处理未完成之前&#xff0c;必然存在着一个零和非零数共存的区域&#xff0c;所以在处理的过程当中一共有三个区域&#xff0c;0区&#xff0c;…

学习15天:pytest

1、.pytest强大的插件 pytest-html(生成html格式的自动化测试报告) pytest-xdist测试用例分布式执行。多CPU分发。 pytest-ordering 用于改变测试用例的执行顺序 pytest-rerunfailures用例失败后重跑 allure-pytest 用于生成美观的测试报告。 2、规则&#xff1a; 模块…

股票交易所官方api接口有哪些?获取和使用需要满足什么条件

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…

2.7 滑动窗口专题:串联所有单词的子串

LeetCode 30. 串联所有单词的子串算法对比分析 1. 题目链接 LeetCode 30. 串联所有单词的子串 2. 题目描述 给定一个字符串 s 和一个字符串数组 words&#xff0c;words 中所有单词长度相同。要求找到 s 中所有起始索引&#xff0c;使得从该位置开始的连续子串包含 words 中所…

【区块链】区块链密码学基础

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 区块链密码学基础引言一、哈希函数1.1 基本概念1.2 数学表达 二、非对称加密2.1…