当前位置: 首页 > news >正文

RKE快速搭建离线k8s集群并用rancher管理界面

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。


本文记录使用RKE快速搭建一套k8s集群过程,使用的rancher老版本2.5.7(当前最新版为2.7)。适用于初学测试、测试环境及定制化要求不高的生产环境。

关联文章:

1. k8s集群搭建前的服务器初始化,见文章《附1:k8s服务器初始化》

2. rke搭建的k8s集群新增节点,见文章《附2:rke安装的k8s集群新增主机》

1. 前提

1.1 服务器规划

IPhostname角色部署内容
10.99.68.62k8s-master01master-1rke/kubectl/helm,执行k8s安装命令节点
10.99.68.63k8s-master02master-2
10.99.68.64k8s-master03master-3
10.99.68.65k8s-node01worker-1
10.99.68.66k8s-node02worker-2
10.99.68.67k8s-node03worker-3测试rke部署的k8s集群添加新节点
10.99.68.68rancherUIrancherUIrancher2.5.7

1.2 服务器初始化

可参考今日文章组附件《附1:k8s服务器初始化》

1.3 镜像导入

1.3.1安装自己的私有docker仓库,如harbor等

1.3.2 导入镜像

在https://github.com/rancher/rancher/releases页面找到需要的版本(不要下载标记为rc或Pre-release的版本,可能有坑,尤其在生产环境下是不稳定的),在一台能通公网的服务器执行下面三个文件下载镜像并导入私有仓库:

Release 文件描述
rancher-images.txt
此文件包含安装 Rancher、创建集群和运行 Rancher 工具所需的镜像列表。
rancher-save-images.sh这个脚本会从 DockerHub 中拉取在文件rancher-images.txt中描述的所有镜像,并将它们保存为文件rancher-images.tar.gz。
rancher-load-images.sh这个脚本会载入文件rancher-images.tar.gz中的镜像,并将它们推送到您自己的私有镜像库。

2. K8S集群安装

2.1 基础环境

2.1.1配置hosts解析

在三台master服务器的/etc/hosts文件添加以下三行,配置三台服务器的hosts解析:


10.99.68.62 k8s-master01
10.99.68.63 k8s-master02
10.99.68.64 k8s-master03

2.1.2 三台服务器之间做ssh信任

在3个节点上,通过sre用户做免秘钥认证:

# su sre
$ ssh-keygen -t rsa -b 4096 
$ ssh-copy-id sre@10.99.68.62 
$ ssh-copy-id 10.99.68.63
$ ssh-copy-id 10.99.68.64

2.1.3 检查三台服务器之间时间是否同步

如不同步,先同步三台服务器的时间。

2.2 k8s集群基础命令安装(sre用户下执行)

2.2.1 安装rke、kubectl、helm

1)安装rke

将1.2.8_rke_linux-amd64文件上传到服务器,并执行以下命令:

$ mv 1.2.8_rke_linux-amd64 rke #给rke文件修改名字
$ chmod +x rke && sudo mv rke /usr/bin/ #添加执行权限并放入/usr/bin/目录下
$ rke --version #在sre用户测试运行rke命令

2)安装kubectl

将1.21.2-kubectl文件上传到服务器,并执行以下命令:

$ mv 1.21.2-kubectl kubectl      #给kubectl修改名字
$ chmod +x kubectl && sudo mv kubectl /usr/bin/     #给kubectl添加执行权限并移动到/usr/bin目录下
$ sudo yum install bash-completion -y      #CentOS Linux上,可能需要安装默认情况下未安装的bash-completion软件包
$ echo "source <(kubectl completion bash)" >> ~/.bashrc      #运行source <(kubectl completion bash)可将kubectl自动补全添加到当前shell,要使kubectl自动补全命令自动加载
$ source ~/.bashrc      #source让上一步骤修改生效
$ kubectl version    #测试sre用户能正常使用kubectl命令

3)安装helm

将安装包helm-v3.6.1-linux-amd64.tar.gz上传到服务器,并执行以下命令:

$ tar xf helm-v3.6.1-linux-amd64.tar.gz
$ sudo mv linux-amd64/helm /usr/bin/
$ helm version #测试sre用户能正常使用helm

2.2.2 rke安装k8s集群

编辑rke创建集群的文件k8s-cluster.yml

nodes:- address: 10.99.68.62 internal_address: 10.99.68.62 user: srerole: [controlplane, etcd]hostname_override: k8s-master01ssh_key_path: /home/sre/.ssh/id_rsa- address: 10.99.68.63internal_address: 10.99.68.63user: srerole: [controlplane, etcd]hostname_override: k8s-master02ssh_key_path: /home/sre/.ssh/id_rsa- address: 10.99.68.64internal_address: 10.99.68.64user: srerole: [controlplane, etcd]hostname_override: k8s-master03ssh_key_path: /home/sre/.ssh/id_rsa- address: 10.99.68.65internal_address: 10.99.68.65user: srerole: [worker]hostname_override: k8s-node01ssh_key_path: /home/sre/.ssh/id_rsa- address: 10.99.68.66internal_address: 10.99.68.66user: srerole: [worker]hostname_override: k8s-node02ssh_key_path: /home/sre/.ssh/id_rsa
private_registries:- url: harbor.test.com:8000   #私人harbor仓库地址is_default: true
services:etcd:backup_config:enabled: trueinterval_hours: 6retention: 60

配置文件说明:

参数-含义

address公共域名或IP地址

user可以运行docker命令的普通用户(不能用root用户) 

role分配给节点的Kubernetes角色列表

internal_addres:内部集群通信的私有域名或IP地址 

hostname_overrid:k8s节点hostname 

ssh_key_pat:指定ssh免秘钥的路径 

private_registrie:指定私有harbor仓库的地址,如果可以通外网的服务器就可以不配置 

etcd:开启了etcd的备份机制,每隔6小时备份一次,保存60天数据

文件编辑好后,在k8s-master01执行以下命令启动k8s集群:

rke up --config k8s-cluster.yml

 成功安装完成后,日志结尾如下图:

在执行完成后,当前目录下会创建kube_config_k8s-cluster.ymlk8s-cluster.rkestate两个文件:

当排除故障、升级群集时需要用到以下文件,请将其副本保存在一个安全的位置!

k8s-cluster.yml:RKE部署k8s集群配置文件
kube_config_k8s-cluster.yml:群集的Kubeconfig文件,此文件包含完全访问群集的凭据。
k8s-cluster.rkestate:Kubernetes群集状态文件,此文件包含完全访问群集的凭据。

现在不能直接执行kubectl get nodes 查看集群,会报错:

[sre@k8s-master01 rancher-cluster]$ kubectl get node
The connection to the server localhost:8080 was refused - did you specify the right host or port?
[sre@k8s-master01 rancher-cluster]$

sre用户下配置kubectl命令执行:

$ mkdir ~/.kube
$ cp kube_config_k8s-cluster.yml ~/.kube
$ cp ~/.kube/kube_config_k8s-cluster.yml ~/.kube/config#可以把k8s-cluster.yml和 k8s-cluster.rkestate也备份一份过来,以免丢失
$ cp k8s-cluster.yml ~/.kube/ 
$ cp k8s-cluster.rkestate ~/.kube/

配置完后,就可以用kubectl get node命令直接查看集群了:

[sre@k8s-master01 .kube]$ kubectl  get node
NAME           STATUS   ROLES               AGE   VERSION
k8s-master01   Ready    controlplane,etcd   41m   v1.20.6
k8s-master02   Ready    controlplane,etcd   31m   v1.20.6
k8s-master03   Ready    controlplane,etcd   31m   v1.20.6
k8s-node01     Ready    worker              20m   v1.20.6
k8s-node02     Ready    worker              20m   v1.20.6
[sre@k8s-master01 .kube]$

如果需要root用户执行kubectl,切换到root用户,执行以下命令:

mkdir ~/.kube
cp /home/sre/.kube/config ./

3. Rancher管理k8s集群

rancher管理k8s集群,有2种方法:

一是将ks集群导入rancher管理界面;

二是在k8s集群上起动rancher应用,直接接入管理集群。

不管是rke安装的,还是别的方式如kubeadm安装的k8s,都适用。

3.1 k8s集群导入rancher

3.1.1 部署一个rancher应用

在10.99.68.68服务器部署rancher,此处使用的老版本2.5.7版本

[root@rancherUI App]# cat rancher.sh 
#!/bin/bash
docker run -d --privileged --restart=unless-stopped -p 8088:80 -p 8443:443 -e CATTLE_SYSTEM_DEFAULT_REGISTRY=harbor.test.com:8000 -e CATTLE_SYSTEM_CATALOG=bundled -v /home/rancher/rancher:/var/lib/rancher -v /home/rancher/auditlog:/var/log/auditlog --name rancher-server harbor.test.com:8000/rancher/rancher:v2.5.7
[root@rancherUI App]#

3.1.2 将k8s导入rancher

1)在“全局”界面,添加集群:

2)选择导入集群:

3)填写导入的集群名:

4)点击“创建”,就会生成如下命令:

命令:

curl --insecure -sfL https://10.99.68.68:8443/v3/import/tzzhn4t4dkmnhlvzz8jm7gmx5xh5ddr8gvsgpljq78rsb8xhlc4znt_c-8cwtr.yaml | kubectl apply -f -

将以命令在k8s-master01节点sre用户下执行:

[sre@k8s-master01 .kube]$ curl --insecure -sfL https://10.247.149.18:8443/v3/import/tzzhn4t4dkmnhlvzz8jm7gmx5xh5ddr8gvsgpljq78rsb8xhlc4znt_c-8cwtr.yaml | kubectl apply -f -

命令执行完毕后,rancher界面能看到导入成功:

查看主机,5台节点均导入成功:

3.2 在k8s上安装rancher

3.2.1 安装cert-manager

1)将离线包cert-managerv1.7.1(下载链接:https://artifacthub.io/packages/helm/cert-manager/cert-manager/1.7.1)上传到服务器k8s-master01解压;

2)下载离线CRD资源yaml文件:https://github.com/jetstack/cert-manager/releases/download/v1.7.1/cert-manager.crds.yaml:

3)找一台通公网的服务器下载以下镜像并修改tag,上传到自己私有仓库:

#下载镜像
docker pull quay.io/jetstack/cert-manager-controller:v1.7.1
docker pull quay.io/jetstack/cert-manager-webhook:v1.7.1
docker pull quay.io/jetstack/cert-manager-cainjector:v1.7.1
docker pull quay.io/jetstack/cert-manager-ctl:v1.7.1
#修改tag
docker tag quay.io/jetstack/cert-manager-controller:v1.7.1 harbor.test.com:8000/rancher/cert-manager-controller:v1.7.1
docker tag quay.io/jetstack/cert-manager-webhook:v1.7.1 harbor.test.com:8000/rancher/cert-manager-webhook:v1.7.1 
docker tag quay.io/jetstack/cert-manager-cainjector:v1.7.1 harbor.test.com:8000/rancher/cert-manager-cainjector:v1.7.1
docker tag quay.io/jetstack/cert-manager-ctl:v1.7.1 harbor.test.com:8000/rancher/cert-manager-ctl:v1.7.1 
#上传镜像
docker push harbor.test.com:8000/rancher/cert-manager-controller:v1.7.1
docker push harbor.test.com:8000/rancher/cert-manager-webhook:v1.7.1 
docker push harbor.test.com:8000/rancher/cert-manager-cainjector:v1.7.1
docker push harbor.test.com:8000/rancher/cert-manager-ctl:v1.7.1

4)批量修改cert-manager里面的image地址,将“quay.io/jetstack/”全部改为自己私有仓库地址“ harbor.test.com:8000/rancher/”。

5)执行命令安装cert-manager

cd cert-managerv1.7.1
kubectl apply -f cert-manager.crds.yaml    #离线升级CRD资源
#正式安装cert-manager
helm install cert-manager ./cert-manager-v1.7.1 \--namespace cert-manager \--create-namespace \--version v1.7.1

6)查看pod

[root@k8s-master01 ~]# kubectl get pod -n cert-manager
NAME                                    READY  STATUS  RESTARTS AGE
cert-manager-5698c7c8d7-8w68r            1/1   Running   0      16m
cert-manager-cainjector-57bf5766bd-9ml2x 1/1   Running   0      16m
cert-manager-webhook-7bd6cfc99c-hbz8c    1/1   Running   0      16m
[root@k8s-master01 ~]#

3.2.2 安装rancher

1)下载rancher2.5.7离线helm安装包

安装命令:

helm install rancher ./rancher-v2.5.7 \--namespace cattle-system \--create-namespace \--set hostname=rancher.test.com \  #rancher不要以local域名命名--set replicas=1 \   #指定启动几个rancher pod,可以启动多个--version 2.5.7

2)查看ingress:

3)windows电脑本地绑定hosts:

10.9.68.65 rancher.test.com  #在ingress的SDDRESS中任意绑定一个IP

4)浏览器访问:https://rancher.test.com,设置admin用户的密码后,跳转到URL,这里默认就是使用的上一步骤设置的域名,默认即可。

5)进入rancher,就能看到集群了,这里的集群名就是local:

(完)

相关文章:

RKE快速搭建离线k8s集群并用rancher管理界面

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 本文记录使用RKE快速搭建一套k8s集群过程&#xff0c;使用的rancher老版本2.5.7&#xff08;当前最新版为2.7&#xff09;。适用…...

代码随想录算法训练营第十四天|● 理论基础 ● 递归遍历 ● 迭代遍历 ● 统一迭代

仅做学习笔记&#xff0c;详细请访问代码随想录 ● 理论基础 ● 递归遍历 ● 迭代遍历 ● 统一迭代 单层递归的逻辑就是按照中左右的顺序来处理的&#xff0c;这样二叉树的前序遍历&#xff0c;基本就写完了&#xff0c;再看一下完整代码&#xff1a; 前序遍历&#xff1a; …...

❤css实用

❤ css实用 渐变色边框&#xff08;Gradient borders方法的汇总 5种&#xff09; 给 border 设置渐变色是很常见的效果&#xff0c;实现这个效果有很多思路 1、使用 border-image 使用 css 的 border-image 属性给 border 绘制复杂图样 与 background-image 类似&#xff0c;我…...

web系统架构基于springCloud的各技术栈

博主目前开发的web系统架构是基于springCloud的一套微服务架构。 使用的技术栈&#xff1a;springbootmysqlclickhousepostgresqlredisrocketMqosseurekabase-gatewayapollodockernginxvue的一套web架构。 一、springboot3.0 特性&#xff1a;Spring Boot 3.0提供了许多新特性…...

【第十五课】数据结构:堆 (“堆”的介绍+主要操作 / acwing-838堆排序 / 时间复杂度的分析 / c++代码 )

目录 关于堆的一些知识的回顾 数据结构&#xff1a;堆的特点 "down" 和 "up"&#xff1a;维护堆的性质 down up 数据结构&#xff1a;堆的主要操作 acwing-838堆排序 代码如下 时间复杂度分析 确实是在写的过程中频繁回顾了很多关于树的知识&…...

el-select选项过多导致页面卡顿,路由跳转卡顿

问题&#xff1a;el-select数据量太大&#xff0c;导致渲染过慢&#xff0c;或造成页面卡顿甚至于卡死 卡顿原因&#xff1a;DOM中数据过多&#xff0c;超过内存限制 解决方法&#xff1a; 1.使用Virtualized Select 虚拟化选择器&#xff0c;页面就不卡了 2.el-select做分…...

信息流广告参数回传工具怎么做联调

信息流广告在抖音等平台上越来越受到广告主的青睐&#xff0c;它能够在用户浏览内容的同时&#xff0c;以自然的方式展示广告&#xff0c;提高曝光率和点击率。然而&#xff0c;为了更好地评估广告效果&#xff0c;需要进行参数回传联调。本文将介绍一种实用的工具——数灵通外…...

matlab appdesigner系列-常用18-表格

表格&#xff0c;常用来导入外部表格数据 示例&#xff1a; 导入外界excel数据&#xff1a;data.xlsx 姓名年龄城市王一18长沙王二21上海王三56武汉王四47北京王五88成都王六23长春 操作步骤如下&#xff1a; 1&#xff09;将表格拖拽到画布上 2&#xff09;对app1右键进行…...

密码学的100个基本概念

密码学作为信息安全的基础&#xff0c;极为重要,本文分为上下两部分&#xff0c;总计10个章节&#xff0c;回顾了密码学的100个基本概念&#xff0c;供小伙伴们学习参考。本文将先介绍前五个章节的内容。 一、密码学历史 二、密码学基础 三、分组密码 四、序列密码 五、哈希…...

Python中的进制转换——bin/oct/hex函数与int函数

简介 进制转换可能是一个工作学习中的常见小任务&#xff0c;手写相关函数显然很麻烦。 Python有相关内置函数一般能满足我们的需求。bin()、oct()、hex()将十进制转换为常用的二、八、十六进制&#xff0c;而 int()函数可指定第二个参数从而将其它进制转换为十进制。或许后者…...

RT-Thread 瑞萨 智能家居网络开发:RA6M3 HMI Board 以太网+GUI技术实践

不用放大了&#xff0c; 我在包里找到张不小的…… 以太网HMI线下培训-环境准备 这是社群的文档&#xff1a;【腾讯文档】以太网线下培训&#xff08;HMI-Board&#xff09; https://docs.qq.com/doc/DY0FIWFVuTEpORlNn 先介绍周六的培训是啥&#xff0c;然后再介绍一下要准…...

力扣刷题第十天 美丽塔 一

给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。 你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i &#xff0c;高度为 heights[i] 。 如果以下条件满足&#xff0c;我们称这些塔是 美丽 的&#xff1a; 1 < heights[i] < maxHeights[i]heights 是一个 山脉…...

c# ADODB.Recordset实例调用Fields报错

代码&#xff1a; using System; using System.CodeDom; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ADODB;namespace ConsoleApp1 {internal class Programre{static ADODB.Recordset recordsetInstance…...

windows和linux下SHA1,MD5,SHA256校验办法

今天更新android studio到Android Studio Hedgehog | 2023.1.1时&#xff0c;发现提示本机安装的git版本太老&#xff0c;于是从git官网下载最新的git。 git下载地址&#xff1a; https://git-scm.com/ 从官网点击下载最新windows版本会跳转到github仓库来下载发布的git&…...

高新技术企业申报需要具备哪些条件?

&#xff08;一&#xff09;企业申请认定时须注册成立一年以上&#xff1b; &#xff08;二&#xff09;企业通过自主研发、受让、受赠、并购等方式&#xff0c;获得对其主要产品&#xff08;服务&#xff09;在技术上发挥核心支持作用的知识产权的所有权&#xff1b; &#…...

测试不拘一格——掌握Pytest插件pytest-random-order

在测试领域,测试用例的执行顺序往往是一个重要的考虑因素。Pytest插件 pytest-random-order 提供了一种有趣且灵活的方式,让你的测试用例能够以随机顺序执行。本文将深入介绍 pytest-random-order 插件的基本用法和实际案例,助你摆脱固定的测试顺序,让测试更具变化和全面性…...

DophineScheduler通俗版

1.DophineScheduler的架构 ZooKeeper&#xff1a; AlertServer&#xff1a; UI&#xff1a; ApiServer&#xff1a; 一个租户下可以有多个用户&#xff1b;一个用户可以有多个项目一个项目可以有多个工作流定义&#xff0c;每个工作流定义只属于一个项目&#xff1b;一个租户可…...

企业如何稳步开启SASE实施之路

在上一篇题为《企业为什么选择SASE&#xff1f;香港电讯专家给你答案&#xff01;》的文章中&#xff0c;我们从SD-WAN的安全策略和能力、市场趋势的推动及SASE的四大特性分析了企业选择采用安全访问服务边缘&#xff08;SASE&#xff09;的原因。基于SASE的各项优势&#xff0…...

【Oracle】收集Oracle数据库内存相关的信息

文章目录 【Oracle】收集Oracle数据库内存相关的信息收集Oracle数据库内存命令例各命令的解释输出结果例参考 【声明】文章仅供学习交流&#xff0c;观点代表个人&#xff0c;与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) 【Oracle】收集Oracle数据库内存相关的信息 …...

MySQL也开始支持JavaScript了

2023 年 12 月 16 日&#xff0c;Oracle 公司在一篇名为 《Introducing JavaScript support in MySQL》的文章中宣布 MySQL 数据库服务器将开始支持 JavaScript 语言。 这个举措标志着继PostgreSQL之后&#xff0c; MySQL 也支持使用 JavaScript 编写函数和存储过程了。作为最…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...