在离线环境中使用sealos工具快速部署一套高可用的k8s服务集群

文章目录

  • 项目基础信息
    • 工具版本
    • 测试环境
  • 下载资源文件
    • 下载sealos二进制命令文件
    • 下载k8s安装镜像和组件资源
    • 下载docker离线安装包
    • 下载Docker Registry容器镜像
  • NFS共享配置
  • coredns服务的DNS解析配置
  • 安装配置sealos、k8s服务
    • 安装sealos工具
    • 导入k8s及相关组件镜像
    • 安装 K8s 集群
    • 部署ingress组件
    • 调整Ingress资源请求体大小限制
    • 部署NFS Provisioner组件
  • 安装docker registry本地镜像仓库
    • 离线安装docker
    • 安装Docker Registry本地镜像仓库
  • 参考资料

项目基础信息

在内部网络的离线环境中,通过使用sealos工具自动化部署一套高可用的k8s服务集群,配置使用NFS共享存储,以及搭建了一个Docker Registry本地镜像仓库的服务。

近期因工作所需,不得已又捡起放下了几年的k8s,在多方咨询后,确认sealos工具是可以满足我们部署一套高可用k8s服务集群需求的,也不致于影响到后续的长期运行维护与故障处理,于是使用了几天时间部署、验证并整理出这样一篇技术资料,发与大家共享。

工具版本

  • sealos v4.3.7
  • 集群镜像版本 labring/kubernetes:v1.27.16

测试环境

操作系统版本为RHEL7.9 64
测试机信息如下:

  • 172.16.10.52 k8s master节点
  • 172.16.10.53 k8s master节点
  • 172.16.10.54 k8s master节点
  • 172.16.10.55 k8s worker节点
  • 172.16.10.56 k8s worker节点
  • 172.16.10.57 k8s worker节点
  • 172.16.10.63 NFS共享节点
  • 172.16.10.64 docker image仓库

需要注意的是容器默认使用/var/lib作为数据存储路径,在开始安装服务前,务必检查下各主机节点的数据盘空间分配使用,或者是直接挂载到/var/lib路径,或者是将数据盘空间追加到/var分区均可。

在k8s集群所有主机节点上增加/etc/hosts映射配置如下:

cat << EOF >> /etc/hosts
172.16.10.52 test-APP-10-52
172.16.10.53 test-APP-10-53
172.16.10.54 test-APP-10-54
172.16.10.55 test-APP-10-55
172.16.10.56 test-APP-10-56
172.16.10.57 test-APP-10-57
EOF

下载资源文件

需要先找一个能访问互联网的linux主机,下载需要的资源文件。拷贝到内网中离线使用。

下载sealos二进制命令文件

以下命令均使用root用户执行。

VERSION=v4.3.7
export VERSION
wget https://mirror.ghproxy.com/https://github.com/labring/sealos/releases/download/${VERSION}/sealos_${VERSION#v}_linux_amd64.tar.gz

查看下载的文件:

ls -lh
-rw-r--r--. 1 root root  61M Oct 31  2023 sealos_4.3.7_linux_amd64.tar.gz

下载k8s安装镜像和组件资源

以下命令均使用root用户执行。

在有网络的环境中导出集群镜像:

sealos pull registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.16
sealos save -o kubernetes.tar registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.16sealos pull registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4
sealos save -o helm.tar registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4sealos pull registry.cn-shanghai.aliyuncs.com/labring/calico:v3.26.1
sealos save -o cilium.tar registry.cn-shanghai.aliyuncs.com/labring/calico:v3.26.1sealos pull registry.cn-shanghai.aliyuncs.com/labring/ingress-nginx:v1.11.2
sealos save -o ingress-nginx.tar registry.cn-shanghai.aliyuncs.com/labring/ingress-nginx:v1.11.2sealos pull registry.cn-shanghai.aliyuncs.com/labring/nfs-subdir-external-provisioner:v4.0.18
sealos save -o nfs-subdir-external-provisioner.tar registry.cn-shanghai.aliyuncs.com/labring/nfs-subdir-external-provisioner:v4.0.18

下载docker离线安装包

https://download.docker.com/linux/static/stable/x86_64/docker-20.10.24.tgz

下载Docker Registry容器镜像

找一个可以访问互联网的docker容器,执行下面命令下载并导出一份容器镜像文件:

docker pull registry
docker images
docker save IMAGE_ID > registry.tar

将上面下载的各种资源文件,拷贝到内网中做离线部署使用。

NFS共享配置

我们测试环境中没有nas共享网盘资源,所以在搭建该测试服务时改为使用一台测试机自行搭建一个NFS共享服务,管理信息如下:

  • 测试机地址 :172.16.10.64
  • 文件系统共享路径:/nfsdata

在这里跳过怎么配置上述linux系统下的nfs共享服务了,有不明白的可自行查找参考资料。
需要特别注意的一点是,需要调整nfs共享路径的属主权限如下:

## nfs 目录权限问题,执行命令修改权限:
chown nfsnobody:nfsnobody /nfsdata

coredns服务的DNS解析配置

由于目前测试环境没有dns解析服务,coredns容器会因找不到dns server而启动失败,解决方法有两种:
1)在k8s集群所有测试机上手工配置一条dns server地址
cat << EOF >> /etc/resolv.conf
nameserver 114.114.114.114
EOF

对于无法访问互联网的测试机来说,其实上面的nameserver地址可以随便写一个即可。需要注意的是,还需要手工修改下测试机网卡配置文件,增加DNS1=114.114.114.114的配置内容,以防测试机重启后会丢失resolv.conf中的配置信息。

2)执行命令kubectl edit cm coredns -n kube-system
在configmap配置文件中删除以下内容:

  forward . /etc/resolv.conf {max_concurrent 1000}

保存退出后,删除相应的coredns pod即可。

安装配置sealos、k8s服务

挑选第一个k8s master节点,使用root用户执行以下配置操作。

安装sealos工具

tar zxvf sealos_${VERSION#v}_linux_amd64.tar.gz sealos
chmod 744 /usr/bin/sealos
mv sealos /usr/bin

导入k8s及相关组件镜像

将 kubernetes.tar、helm.tar、calico.tar 拷贝到离线环境, 使用 load 命令导入镜像即可:

sealos load -i kubernetes.tar
sealos load -i helm.tar
sealos load -i calico.tar
sealos load -i ingress-nginx.tar
sealos load -i nfs-subdir-external-provisioner.tar

查看集群镜像是否导入成功:

sealos imagesREPOSITORY                                                                  TAG        IMAGE ID       CREATED         SIZE
registry.cn-shanghai.aliyuncs.com/labring/kubernetes                        v1.27.16   d8938a9ce5af   11 days ago     623 MB
registry.cn-shanghai.aliyuncs.com/labring/ingress-nginx                     v1.11.2    66a7671dfb5f   2 months ago    130 MB
registry.cn-shanghai.aliyuncs.com/labring/calico                            v3.26.1    1e8350ad92f0   14 months ago   340 MB
registry.cn-shanghai.aliyuncs.com/labring/nfs-subdir-external-provisioner   v4.0.18    379a90149496   16 months ago   18 MB
registry.cn-shanghai.aliyuncs.com/labring/helm                              v3.9.4     3376f6822067   2 years ago     46.4 MB

安装 K8s 集群

在所有节点上,预安装几个工具包如下:

yum -y install socat conntrack-tools ipvsadm nfs-utils

在所有节点上,配置支持ipvs:

mkdir -p /opt/k8s/
cat << EOF > /opt/k8s/ipvs.sh
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_sh
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- nf_conntrack_ipv4
EOFchmod +x /opt/k8s/ipvs.sh
echo "/opt/k8s/ipvs.sh" >>/etc/rc.local
chmod +x /etc/rc.localipvsadm -ln

在master1节点上面,通过sealos工具一键创建k8s服务集群:

sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.16 \registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 \registry.cn-shanghai.aliyuncs.com/labring/calico:v3.26.1 \--masters 172.16.10.52,172.16.10.53,172.16.10.54 \--nodes 172.16.10.55,172.16.10.56,172.16.10.57 -p change-to-your-password
## 查看配置结果,各节点应该是Ready状态
kubectl get nodes
## 查看容器Pod实例状态,STATUS应该是Running状态
kubectl get po -A -o wide

参数说明:
参数名 参数值示例 参数说明

  • –masters 192.168.64.2 # K8s master 节点地址列表
  • –nodes 192.168.64.1 # K8s node 节点地址列表
  • –ssh-passwd [your-ssh-passwd] # ssh 登录密码
  • kubernetes labring/kubernetes:v1.27.16 # K8s 集群镜像

在干净的服务器上直接执行上面命令,不要做任何多余操作即可安装一个高可用 K8s 集群。

查看最终的完整k8s集群配置结果:

[root@test-APP-10-52 sealos-k8s]# kubectl get nodes
NAME                  STATUS   ROLES           AGE   VERSION
test-app-10-52   Ready    control-plane   23h   v1.27.16
test-app-10-53   Ready    control-plane   23h   v1.27.16
test-app-10-54   Ready    control-plane   23h   v1.27.16
test-app-10-55   Ready    <none>          23h   v1.27.16
test-app-10-56   Ready    <none>          23h   v1.27.16
test-app-10-57   Ready    <none>          23h   v1.27.16

以下仅为参考,是节点增、删管理的更多方法:

## 增加master节点
$ sealos add --nodes 192.168.64.21,192.168.64.19 
$ sealos add --masters 192.168.64.21,192.168.64.19 ## 删除 K8s 节点
$ sealos delete --nodes 192.168.64.21,192.168.64.19 
$ sealos delete --masters 192.168.64.21,192.168.64.19  

部署ingress组件

生成一个ingress-nginx服务的ConfigMap配置文件:

cat << EOF > ingress-nginx-config.yaml
apiVersion: apps.sealos.io/v1beta1
kind: Config
metadata:creationTimestamp: nullname: ingress-nginx-config
spec:data: |controller:hostNetwork: truekind: DaemonSetservice:type: NodePortmatch: registry.cn-shanghai.aliyuncs.com/labring/ingress-nginx:v1.11.2path: charts/ingress-nginx/values.yamlstrategy: merge
EOF

创建ingress-nginx服务:

sealos run registry.cn-shanghai.aliyuncs.com/labring/ingress-nginx:v1.11.2  --config-file ingress-nginx-config.yaml
[root@test-APP-10-52 sealos-k8s]# kubectl get po -A -o wide|grep nginx
ingress-nginx      ingress-nginx-controller-5dj7c                    1/1     Running   0          19h   172.16.10.56      test-app-10-56   <none>           <none>
ingress-nginx      ingress-nginx-controller-6jbqk                    1/1     Running   0          19h   172.16.10.57      test-app-10-57   <none>         <none>
ingress-nginx      ingress-nginx-controller-cqb28                    1/1     Running   0          19h   172.16.10.55      test-app-10-55   <none>           <none>

调整Ingress资源请求体大小限制

在Kubernetes中,当使用Nginx Ingress Controller时,需要调整请求体大小限制,可以直接在Ingress资源中添加相应的annotations。
1、编辑Ingress资源
在Ingress资源的YAML文件中,添加或修改以下annotations:

apiVersion: networking.k8s.io/v1  
kind: Ingress  
metadata:  name: my-ingress  annotations:  # 这里注解用于指定请求体的最大大小,这里设置为200MB。nginx.ingress.kubernetes.io/proxy-body-size: 200m  
spec:  ...

2、应用配置变更
保存并更新Ingress资源

kubectl apply -f your-ingress.yaml

3、验证配置
检查Nginx Ingress Controller的日志或使用kubectl describe命令查看Ingress资源的详细信息,确保配置生效。

部署NFS Provisioner组件

在这里遇到一个问题是,在离线网络环境中,无法正常使用helm添加仓库并部署nfs provisioner组件,也未找到更简单的解决方法,下面提供了一种临时的解决方案,仅供参考吧。

## 1、先找到sealos nfs组件的下载文件路径
find / -name nfs-subdir-external-provisioner
## 该路径与右侧类似,路径中间部分会有差别,我们以右侧路径进行示例说明:/var/lib/sealos/data/default/applications/default-dom2h16c/workdir/charts/nfs-subdir-external-provisioner
## 2、修改nfs provisioner组件的部署参数
cd /var/lib/sealos/data/default/applications/default-dom2h16c/workdir/charts/nfs-subdir-external-provisioner/
vi values.yaml

下面是values.yaml文件中需要根据实际配置信息进行修改的内容,重点是replicaCount、nfs.server、nfs.path这几个参数值:

replicaCount: 2
strategyType: Recreateimage:repository: registry.k8s.io/sig-storage/nfs-subdir-external-provisionertag: v4.0.2pullPolicy: IfNotPresent
imagePullSecrets: []nfs:server: 172.16.10.63path: /nfsdatamountOptions:volumeName: nfs-subdir-external-provisioner-root# Reclaim policy for the main nfs volumereclaimPolicy: Retain

执行创建nfs provisioner服务的命令:

cd /var/lib/sealos/data/default/applications/default-dom2h16c/workdir
./nfs-subdir-external-provisioner.sh
Release "nfs-subdir-external-provisioner" has been upgraded. Happy Helming!
NAME: nfs-subdir-external-provisioner
LAST DEPLOYED: Wed Oct 30 17:16:58 2024
NAMESPACE: nfs-provisioner
STATUS: deployed
REVISION: 4
TEST SUITE: None

查看nfs 驱动组件配置结果:

## 查看nfs deployment:
[root@test-APP-10-52 sealos-k8s]# kubectl get deployment -A -o wide|grep nfs
## 查看nfs ReplicaSet:
[root@test-APP-10-52 sealos-k8s]# kubectl get ReplicaSet -A -o wide|grep nfs
## 查看nfs storageclass:
[root@test-APP-10-52 sealos-k8s]# kubectl get sc -A -o wide|grep nfs
## 查看nfs provisioner容器:
[root@test-APP-10-52 sealos-k8s]# kubectl get po -A -o wide|grep nfs
nfs-provisioner    nfs-subdir-external-provisioner-7fccc96d5-kwz5w   1/1     Running   0          44m   100.93.100.133    test-app-10-55   <none>           <none>
nfs-provisioner    nfs-subdir-external-provisioner-7fccc96d5-nq6t7   1/1     Running   0          70m   100.107.99.195    test-app-10-56   <none>           <none>
## 如果继续查看容器配置详情,可执行以下命令:
[root@test-APP-10-52 sealos-k8s]# kubectl describe pod nfs-subdir-external-provisioner-7fccc96d5-kwz5w -n nfs-provisioner

设置nfs-client为默认使用的storageclass类:

kubectl get sc -A -o wide
kubectl patch storageclass nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

安装docker registry本地镜像仓库

在镜像仓库主机节点上执行。

离线安装docker

tar -zxvf ./docker-20.10.24.tgz
cp docker/* /usr/bin/

配置docker服务管理:

cat << EOF > /etc/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=127.0.0.1
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF

配置docker服务启动管理:

systemctl daemon-reload
systemctl enable docker.service
systemctl start docker
systemctl status docker
## 查看docker版本信息:
docker -v

安装Docker Registry本地镜像仓库

以下配置,是在镜像仓库节点上面执行。
预先检查与配置:

  • 检查并为镜像仓库节点挂载数据盘 /data
  • 配置并开放系统防火墙端口:
systemctl enable firewalld
systemctl start firewalld
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.16.10.52" port protocol="tcp" port="5000" accept'
## 以上规则仅为示例,在实际部署时需按细粒度为所有访问镜像仓库的ip配置访问权限
firewall-cmd --reload

特别注意:该主机节点启动了firewalld系统墙服务后,轻易不可再做变更,否则会干扰docker容器的数据包转发链正常运行。如果一定要修改系统墙规则,那么在变更firewalld服务后,需要重启下服务systemctl restart docker。

导入registry离线镜像包:

docker load < registry.tar

运行docker私有仓库服务:

docker run -d -p 5000:5000 --restart always --name registry -v /data/registry/:/tmp/registry --privileged=true registry

登录与退出容器的方法:

docker exec -it container\_id /bin/sh

注意在退出容器时,不可执行exit,这会导致容器实例直接关停。正确退出容器的方法是连续执行以下两个命令的组合: Ctrl+P Ctrl+Q

查看仓库中的镜像信息:

curl -XGET http://172.16.10.64:5000/v2/_catalog

配置linux客户端使用http协议访问私有仓库并推送容器镜像,可参考以下方法:

注意在镜像仓库的服务器端是不需要调整配置的

vi /etc/docker/daemon.json
{"insecure-registries": ["0.0.0.0:5000"]
}

参考资料

  • https://sealos.io/zh-Hans/docs/category/quick-start-1
  • https://blog.csdn.net/weixin_37926734/article/details/123279987
  • https://www.cnblogs.com/netcore3/p/16982828.html

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

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

相关文章

HTB:Sightless[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机TCP端口进行开放扫描 继续使用nmap对靶机开放的TCP端口进行脚本、服务扫描 首先尝试对靶机FTP服务进行匿名登录 使用curl访问靶机80端口 使用浏览器可以直接访问该域名 使用浏览器直接访问该子域 Getshell 横向移动 查…

Golang | Leetcode Golang题解之第554题砖墙

题目&#xff1a; 题解&#xff1a; func leastBricks(wall [][]int) int {cnt : map[int]int{}for _, widths : range wall {sum : 0for _, width : range widths[:len(widths)-1] {sum widthcnt[sum]}}maxCnt : 0for _, c : range cnt {if c > maxCnt {maxCnt c}}retur…

斯坦福泡茶机器人DexCap源码解析:涵盖收集数据、处理数据、模型训练三大阶段

前言 因为我司「七月在线」关于dexcap的复现/优化接近尾声了&#xff0c;故准备把dexcap的源码也分析下。​下周则分析下iDP3的源码——为队伍「iDP3人形的复现/优化」助力 最开始&#xff0c;dexcap的源码分析属于此文《DexCap——斯坦福李飞飞团队泡茶机器人&#xff1a;带…

高中数学:概率-随机实验、样本空间、随机事件

文章目录 一、随机实验二、样本空间三、随机事件例题 四、事件运算 一、随机实验 二、样本空间 三、随机事件 例如 样本空间 Ω { a , b , c , d , e , f } 则&#xff0c;事件 A { a , b , c } &#xff0c;是一个随机事件 事件 B { d } 是一个基本事件 样本空间Ω\{a,b,c…

w~大模型~合集21

我自己的原文哦~ https://blog.51cto.com/whaosoft/12459590 #大模型~微调~用带反馈的自训练 面对当前微调大模型主要依赖人类生成数据的普遍做法&#xff0c;谷歌 DeepMind 探索出了一种减少这种依赖的更高效方法。大模型微调非得依赖人类数据吗&#xff1f;用带反馈的自训…

利用 Vue.js 开发动态组件的实战指南

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; Vue.js 是现代 Web 开发中非常流行的框架&#xff0c;以其渐进式架构和组件化设计受到广泛欢迎。组件化开发是 Vue.js 的核心优势…

Jmeter中的配置原件(一)

配置原件 1--CSV Data Set Config 用途 参数化测试&#xff1a;从CSV文件中读取数据&#xff0c;为每个请求提供不同的参数值。数据驱动测试&#xff1a;使用外部数据文件来驱动测试&#xff0c;使测试更加灵活和可扩展。 配置步骤 准备CSV文件 创建一个CSV文件&#xff0c…

MCU的OTA升级(未完-持续更新)

1.术语 ISP : In-System Programming 在系统编程&#xff0c;是一种通过MCU&#xff08;微控制器单元&#xff09;上的内置引导程序&#xff08;BootLoader&#xff09;来实现对芯片内部存储器&#xff08;如Flash&#xff09;进行编程的技术。 华大目前对应的ISP IAP&…

让redis一直开启服务/自动启动

文章目录 你的redis是怎么打开的黑窗不能关?必须要自动启动吗?再说说mysql 本文的所有指令都建议在管理员权限下打开cmd控制台 推荐的以管理员身份打开控制台的方式 Win R 打开运行 输入cmdShift Ctrl Enter 你的redis是怎么打开的 安装过redis的朋友都知道, redis的安…

从认识 VNode VDOM 到实现 mini-vue

前言 现有框架几乎都引入了虚拟 DOM 来对真实 DOM 进行抽象&#xff0c;也就是现在大家所熟知的 VNode 和 VDOM&#xff0c;那么为什么需要引入虚拟 DOM 呢&#xff1f;下面就一起来了解下吧&#xff01;&#xff01;&#xff01; VNode & VDOM VNode 和 VDOM 是什么&am…

vue项目实战

1.项目文件夹添加&#xff08;结构如下&#xff09; 2.页面构建 安装路由 npm install react-router-dom 3.页面基本模板 router文件夹下index.js的模板 // 引入组件 import Login from "../views/login"; // 注册路由数组 const routes [{// 首页默认是/path: …

SD-WAN跨境加速专线:打造无缝、高效的全球社交媒体营销网络

在数字化时代&#xff0c;电子商务与社交媒体的融合已成为不可逆转的趋势。亚马逊&#xff0c;作为全球领先的电子商务平台&#xff0c;近期与Facebook、Instagram、Snapchat、Pinterest和TikTok等社交媒体巨头携手&#xff0c;推出了一项革命性的无缝购物体验。这一创新举措不…

yelp商家数据集上使用火算法求解TSP 问题

先简要回顾下什么是TSP问题&#xff0c; 旅行商问题&#xff08;Traveling Salesman Problem&#xff0c;TSP&#xff09;是一个经典的组合优化问题&#xff0c;广泛应用于运筹学、计算机科学和物流等领域。TSP的基本描述如下&#xff1a; 问题描述 定义&#xff1a;假设有一…

【深度学习目标检测|YOLO算法1】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析...

【深度学习目标检测|YOLO算法1】YOLO家族进化史&#xff1a;从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析… 【深度学习目标检测|YOLO算法1】YOLO家族进化史&#xff1a;从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析… 文章目录 【深度学习目标检测|YOL…

星期-时间范围选择器 滑动选择时间 最小粒度 vue3

星期-时间范围选择器 功能介绍属性说明事件说明实现代码使用范例 根据业务需要&#xff0c;实现了一个可选择时间范围的周视图。用户可以通过鼠标拖动来选择时间段&#xff0c;并且可以通过快速选择组件来快速选择特定的时间范围。 功能介绍 时间范围选择&#xff1a;用户可以…

Java | Leetcode Java题解之第554题砖墙

题目&#xff1a; 题解&#xff1a; class Solution {public int leastBricks(List<List<Integer>> wall) {Map<Integer, Integer> cnt new HashMap<Integer, Integer>();for (List<Integer> widths : wall) {int n widths.size();int sum 0…

牛客小白月赛104 —— C.小红打怪

C.小红打怪 1.题目&#xff1a; 2.样例 输入 5 1 2 3 4 5 输出 2 说明 第一回合&#xff0c;小红攻击全体怪物&#xff0c;队友1攻击5号怪物&#xff0c;队友2攻击4号和5号怪物&#xff0c;剩余每只怪物血量为[0,1,2,2,2]。 第二回合&#xff0c;小红攻击全体怪物&#…

python画图|text()和dict()初探

【1】引言 在进行hist()函数的学习进程中&#xff0c;了解到了subplot_mosaic()函数&#xff0c;在学习subplot_mosaic()函数的时候&#xff0c;又发现了text()和dict()函数。 经探究&#xff0c;text()和dict()函数有很多一起使用的场景&#xff0c;为此&#xff0c;我们就一…

BUG: scheduling while atomic

▌▌上篇文章的内容还没有结束 中断处理函数中如果执行了调度&#xff0c;会发生什么 ▌这次&#xff0c;我修改了程序&#xff0c;在中断处理函数中调用了msleep 程序执行后&#xff0c;会有这样的日志 ▌关键就是这句 BUG: scheduling while atomic 我们追代码&#xff0c;可…

算法 -选择排序

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【算法】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4a1;选择排序1. &#x1f504; 选择排序&#x1f5bc;️示意图&#x1f4d6;简介&#x1f4a1;实现思路1&#x1f4bb;代码实现1&#x1f4a1;实现思路2…