基于VirtualBox的CentOS集群搭建与SSH免密配置实践 干过这活的人都知道搭集群最麻烦的往往不是集群本身而是底层那套虚拟机网络。公司有现成资源当然好但自己学习、做实验、跑Demo的时候手头只有一台电脑怎么在单机环境里搞出一套能折腾、能恢复、还不会把宿主机搞崩的CentOS集群我这些年反复用下来的方案就是VirtualBox加CentOS成本低、可复制性高、快照回滚还特别方便。这篇文章就把我从创建虚拟机、规划网络、批量克隆到打通SSH免密这一步一步的完整过程写出来全程基于实践操作踩过的坑也都摆出来照着走基本不会卡壳。这篇文章适合什么人看准备考认证要练环境搭建的自己研究分布式组件想在本地跑多节点实验的或者公司没给测试机只能拿笔记本凑合的都可以参考。核心目标就一个用最少的资源在VirtualBox里跑起一套网络互通、能互相免密登录、可以随时回滚状态的CentOS集群。1. 环境准备与整体方案设计1.1 为什么本地搭集群选了VirtualBox和CentOS先说选型。市面上的虚拟机软件不少常见的就是VirtualBox、VMware Workstation这类桌面级产品加上Linux下的KVM、QEMU这些。以前我也纠结过到底用哪个后来在不同场景下都试过回头看看VirtualBox在“本地实验集群”这个场景里确实是综合成本最低的。一个是免费。这个对个人学习场景很重要不需要去找什么授权官方直接下载安装也没有功能限制。另一个是跨平台Windows、macOS、Linux宿主机都能跑这意味着你今天在Windows笔记本上搭的虚拟机拷到Linux台式机上也能直接打开注意版本差异。再一个就是轻量VirtualBox比VMware Workstation在同等配置下内存占用稍微友好一点对只有16G甚至8G内存的笔记本更实用。CentOS这边虽然现在CentOS Linux已经停更了但老版本比如说CentOS 7系列在实验和教学场景里仍然大量存在很多书、很多课程、企业遗留系统用的都是那一套命令体系。用CentOS做集群实验还有两个额外好处一是yum/dnf的包管理方式很成熟安装软件、配源都比较省心二是网上的教程资料密度极高你遇到问题一搜基本都有答案这对新手来说太重要了。有一点需要提前说明本机跑集群性能瓶颈通常在内存而不是CPU。三台CentOS虚拟机每台分2G内存宿主机就得拿出6G来。建议宿主机至少16G内存起步8G内存的话就把每台虚拟机压到1.5G并且尽量用最小化安装别装图形界面。1.2 节点规模怎么定三节点还是五个节点集群的节点数量不是拍脑袋定的。很多分布式组件的实验最少要求三个节点比如搭建高可用环境、跑数据副本、观察选举机制三个节点是最小规模。如果只有两个节点很多分布式场景根本复现不出来比如脑裂问题、多副本一致性两个节点连多数派投票都凑不齐。所以我建议起步就做三节点。一台机器可以当基础镜像后续克隆出自己的节点后面想扩到五个也很快。我自己的规划是这样管理思路上一台当作“种子机”也常被称为基础镜像机先在这台机器上把系统装好、基础环境配好、软件源换好然后打一个干净快照再从快照克隆出node1、node2、node3。这样每台机器的初始状态完全一致省去了重复安装配置的时间也最大程度避免了“这台机器多了个包那台机器少了行配置”这种环境差异问题。1.3 版本选择命令体系一致性比“新”更重要CentOS版本这里一定要注意。CentOS 7和CentOS Stream 8/9的网络管理方式有差异。CentOS 7默认还是ifcfg文件配合NetworkManager用systemctl restart network能重启网络到了CentOS Stream 8/9network服务基本退场了统一靠nmcli管理配置文件路径虽然还在但直接改文件的方式容易被NetworkManager覆盖。对做集群实验来说最重要的事情是教程里写的命令能和你的系统对得上。我个人更推荐用CentOS 7系列的最后一个版本理由很实在大部分集群搭建教程默认拿它做演示遇到问题搜出来的解决方案也最多。如果你装的是Stream版本命令体系更接近上游也不是不行但很多细节操作需要自己转换新手容易卡住。这里给一个确定的搭配建议VirtualBox用较新的版本新的版本对内核支持和硬件兼容更好虚拟机系统选CentOS 7全量DVD或者Minimal镜像。Minimal够了DVD里多出来的包在集群场景基本用不上。2. 网络模式怎么选一张表看懂NAT、桥接、仅主机2.1 三种网络模式的底层逻辑VirtualBox的虚拟网络模式新手很容易搞混。其实你只要抓住一个关键问题虚拟机想让谁看见自己、自己又想看见谁就能选出合适的模式。NAT模式网络地址转换虚拟机通过宿主机访问外网对外表现成宿主机的一个“内部进程”。外部网络看不到虚拟机虚拟机之间默认互相隔离除非手动创建NAT网络。这个模式的好处是省心虚拟机只要DHCP就能上网坏处是宿主机访问不到虚拟机、虚拟机间也基本没法做集群通信。桥接模式虚拟机直接接到宿主机所在的物理局域网上和宿主机平级。它有自己的局域网IP别的电脑能直接访问它它也能访问局域网里的任何设备。好处是网络和真实物理机完全一致坏处是依赖外部网络环境如果宿主机换了WiFi、换了网段虚拟机的IP也要跟着变这对集群来说是个大麻烦。仅主机模式Host-OnlyVirtualBox在宿主机上创建一块虚拟网卡默认叫vboxnet0宿主机和虚拟机都连到这个虚拟交换机上。虚拟机之间可以互通宿主机也能访问虚拟机但虚拟机不能直接访问外网除非额外加一块NAT网卡。三种模式各有优势但集群场景最忌讳的就是IP漂移和外部网络依赖。桥接虽然功能最强可一旦宿主机换了网络环境整个集群网络就断了。仅主机模式没有这个问题因为虚拟网络不依赖外部任何环境所以集群内部通信的主网络我建议就用仅主机模式。2.2 混合组网方案一块网卡上外网一块网卡跑集群我实际用的方案是双网卡。第一块网卡设为NAT模式负责让虚拟机访问外网用来下载软件、更新yum源。第二块网卡设为仅主机模式负责集群内部节点之间的通信所有节点都在这块虚拟网卡上配静态IP。为什么不是一块仅主机网卡走遍天下因为仅主机模式下虚拟机是上不了外网的。集群实验往往需要下载依赖包、安装组件哪怕你提前备好rpm包总会有需要临时上网查东西、拉个小包的时候。给一台虚拟机加一块NAT网卡做“外网口”是最省事的方案。为什么不直接用桥接模式加NAT的组合桥接模式的虚拟机直接暴露在局域网里别人也能访问你的机器安全上不太可控而且宿主机一旦切换网络桥接网卡就废了。仅主机模式完全内部私有外面的人摸不到这个虚拟网络集群跑起来更安静、更可控。这也是实际工作中非常常见的服务器规划方式内网口跑业务流量外网口只负责访问公网两者物理隔离互不干扰。2.3 静态IP规划与分配表集群内部通信必须用静态IP不能用DHCP。原因很简单分布式组件里每个节点都要写清楚其他节点的地址如果某台机器重启后IP变了整个集群的节点发现就全乱了排查起来极其痛苦。我的IP规划如下假设仅主机网卡的网段是192.168.56.0/24这是VirtualBox的默认网段节点仅主机网卡IP主机名角色种子机模板192.168.56.10base.local模板节点node1192.168.56.11node1.local集群成员node2192.168.56.12node2.local集群成员node3192.168.56.13node3.local集群成员IP段里留出了余量后面加节点只需要往后排就行。网关统一指向192.168.56.1也就是宿主机在vboxnet0上的地址这样宿主机访问虚拟机集群完全畅通。DNS这里有个细节仅主机网卡本身没有外网能力所以DNS不用填如果填了不存在的DNS反而可能导致部分服务解析慢需要外网域名解析时流量走NAT网卡出去那块的DNS由VirtualBox自带的DHCP分配。3. 创建第一台虚拟机从镜像到基础配置3.1 创建虚拟机时这几个参数最容易忽略很多教程一路点“下一步”就完事了但有几个参数创建时忽略的话后面要回头改就特别麻烦。第一个是类型和版本。操作系统类型选Linux版本选Red Hat64-bit。这一步决定了VirtualBox给虚拟机提供什么默认芯片组架构选错了后面装系统会起不来或者装完运行异常。第二个是内存。前面说了按照宿主机内存来分配我建议种子机给2048MB后面克隆出来的节点也保持一致。低于1536MB的话CentOS跑起来明显卡顿特别是跑构建任务的时候Swap会被疯狂调用。第三个是磁盘。磁盘大小建议20GB以上少了后面装个数据库、装套组件就满了。这里要说一个自己的经验VirtualBox默认的VDI磁盘是动态分配的就是你设多大上限都行一开始不占实际空间用多少占多少。所以不要在这个参数上抠门设了40GB也不会立刻占宿主机40GB。LVM分区的时候给/和/home留足空间后面扩容也不用愁。第四个容易被忽略的是启用I/O APIC和硬件虚拟化。I/O APIC在系统设置里默认可能没开多核分配时最好确认一下硬件虚拟化VT-x/AMD-V必须在BIOS里开启VirtualBox才能提供接近原生的CPU性能否则虚拟机的CPU会奇慢无比装系统都要很久。启动虚拟机时按下F2进入BIOS界面时把Intel VT-x或者AMD-V相关的虚拟化开关打开。3.2 最小化安装后的三件套网络、yum源、快照安装界面里选“Minimal”安装方式不要选带GUI的“Server with GUI”。集群节点要的是稳定性不是桌面。安装时要设置root密码同时创建一个普通用户比如一律用admin方便后面统一管理。装完系统进入命令行第一件事是确认网络。因为前面创建时只配了NAT网卡所以此时ip addr应该能看到一个动态获取IP的网卡接口。默认情况下CentOS 7的网络接口命名可能是enp0s3这样的格式不同机器看到的名称可能不一样后面克隆后这个名字还会变做好心理准备。第二件事是配置yum源。刚装完的系统用的还是默认官方源国内机器访问起来很慢。我一般会备份原repo文件然后换成国内某个开源镜像站的CentOS源。这一步要谨慎镜像站的路径结构和官方略有差异配置前先确认镜像站的路径格式避免配完以后yum makecache全是报错。第三件事也是最关键的一件事打完所有基础补丁、确认系统正常后立刻打一个干净快照。快照是VirtualBox最有价值的功能没有之一。集群实验最怕的就是配置改坏了、系统搞崩了有快照就能一键回到初始状态。这个习惯一定要养成每到一个稳定节点就打一个快照后续随便折腾都不怕。3.3 为什么建议“先集中配置再批量克隆”我的操作习惯是种子机上把所有公共配置一次性做完包括yum源、基础工具安装、时间同步配置、关闭SELinux等然后再克隆。这样每台克隆出来的节点天然拥有完全一致的环境后面只需要改IP、改主机名这些个性化部分。公共配置里有一项容易被忽略的就是基础工具包。最小化安装的系统里连vim、wget、tar这类常用命令都未必全趁还在种子机阶段一次性装好yum install -y vim wget net-tools bind-utils chronynet-tools提供ifconfig、route这些老牌命令很多人习惯用它排查网络bind-utils提供dig、nslookup这些DNS排查工具chrony用于时间同步。集群节点的时间不同步分布式组件运行起来会出现各种莫名奇妙的问题这个后面单说。公共配置做完以后执行一次yum update让系统处于最新补丁状态然后关机、打快照。这个快照就是整个集群的“基准盘”后面所有节点都由它克隆出来。4. 从模板到多节点克隆操作与网卡“换名字”问题4.1 完整克隆和链接克隆选哪个VirtualBox提供两种克隆方式完整克隆和链接克隆。完整克隆就是把整块虚拟磁盘复制一份新虚拟机和原虚拟机完全独立删掉任何一个都不影响另一个。链接克隆则是新虚拟机共享原始虚拟磁盘的数据只保存差异部分磁盘占用小、创建快但依赖原始虚拟机存在。集群实验我更推荐完整克隆。原因很简单链接克隆虽然最开始省空间但原始虚拟机一旦被误删所有链接克隆节点全部报废而且多个链接克隆同时跑IO压力集中在原始磁盘上性能反而不如完整克隆。三台节点的磁盘总量几十GB动态分配实际占用更小完全不值得用链接克隆换那一点点空间。4.2 克隆后网卡为什么变成了ens37/eth1克隆完成后启动新虚拟机最诡异的事情出现了网卡名字不是原来那串变成了一串新的而且/etc/sysconfig/network-scripts/下原有的网卡配置文件好像和现在的网卡对不上了。原因是这样的CentOS 7的系统里存在一套udev规则系统启动时会把网卡的MAC地址和网卡接口名绑定避免重启后网卡顺序错乱。克隆后虚拟机的网卡MAC地址已经变了VirtualBox会自动给新网卡生成新的MAC但系统里没有对应新MAC的udev规则所以内核就把网卡识别成了一个新名字比如从enp0s3变成了enp0s8或者ens37。旧配置文件里面写的是旧网卡名新网卡名没有对应配置文件于是这个新网卡根本拿不到IPip addr看只能看到LOOPBACK和新的网卡名没有IPv4地址。这就是克隆后上不了网的根本原因。解决办法有两条路。第一条路是改udev规则去/etc/udev/rules.d/下把旧的持久网络规则文件删掉CentOS 7里常见的是70-persistent-net.rules有的版本没有这个文件同时删除或修改/etc/sysconfig/network-scripts/下旧的ifcfg文件然后重启系统。系统会用新MAC重新生成规则网卡名恢复成你预期的那串。第二条路更彻底直接禁用系统的一致性网络设备命名规则统一让网卡叫eth0。方法是编辑/etc/default/grub在GRUB_CMDLINE_LINUX这一行的引号里加上两个参数net.ifnames0 biosdevname0然后重新生成grub配置grub2-mkconfig -o /boot/grub2/grub.cfg重启后网卡会变成eth0。这种方式的好处是后续所有克隆节点克隆出来的网卡名全部都叫eth0批量管理非常舒服。我个人强烈推荐第二种方式尤其是这个环境要克隆多台机器的时候统一命名能省掉很多不必要的折腾。4.3 克隆节点改IP和主机名的标准流程克隆出来的节点启动后先登进去然后按这个顺序操作。第一步确认当前网卡名和MAC。执行ip addr找出来当前活跃的那个网卡记下它的名字。第二步编辑对应的ifcfg文件改成静态IP、掩码、网关DEVICEeth0 TYPEEthernet ONBOOTyes BOOTPROTOstatic IPADDR192.168.56.11 NETMASK255.255.255.0 GATEWAY192.168.56.1如果你的NAT网卡也需要保留就把NAT那张网卡单独配置成BOOTPROTOdhcp不要混在一起写。第三步修改主机名hostnamectl set-hostname node1第四步把这个节点对应的hosts映射写进去/etc/hosts加上三行192.168.56.11 node1 192.168.56.12 node2 192.168.56.13 node3hosts文件的坑在于如果你只在自己机器上配了自己的IP和主机名那ssh node2会被解析成外网域名解析直接卡住半天连不上。集群每个节点都要配上所有节点的映射。第五步重启网络或者直接重启系统。CentOS 7里可以用systemctl restart network如果前面的grub参数没生效网络重启后网卡名可能还会漂移建议直接重启一次系统让udev和网络配置重新加载。5. 集群通信与SSH免密登录配置5.1 配置静态IP前先想清楚网关填什么很多人配静态IP时卡在网关这里。仅主机网卡的网关要填宿主机在虚拟网卡上的地址也就是vboxnet0的IP。怎么确认这个地址打开VirtualBox主界面选择“全局工具”-“网络管理器”就能看到Host-Only网络的网段默认通常是192.168.56.0/24宿主机占用的地址一般是192.168.56.1这个就是网关。如果NAT网卡还在网关不要和仅主机网卡混填。每块网卡独立配置NAT网卡走DHCP网关不用管仅主机网卡配静态地址网关指向宿主机。经验是同一块网卡千万别同时配置两个IP也不要在一个配置文件里混用多网段IP否则路由表会乱表现就是能上网但内网ping不同或者反过来。配完以后用ping -c 3 192.168.56.1验证宿主机方向的联通性再在node1上ping -c 3 node2验证节点间的联通性。这两个都通了网络才算真正落地。5.2 SSH免密互信的正确配置顺序集群节点之间SSH免密登录是标配做法说简单也简单说坑也很多。标准流程分三步。第一步在每个节点上生成密钥对。统一用ssh-keygen -t rsa -b 4096一路回车默认生成在~/.ssh/id_rsa。注意生成密钥时不要设置密码短语passphrase否则每次免密登录时还会提示你输密码集群批量操作就会被卡在交互输入上。第二步把公钥分发到其他所有节点。标准命令是ssh-copy-idssh-copy-id -i ~/.ssh/id_rsa.pub adminnode1这一步会让你输入对方admin用户的密码。新克隆出来的节点初始密码是一样的所以批量复制并不麻烦。如果有三台机器每一台上都要执行两次ssh-copy-id把公钥发到另外两台。第三步验证。在node1上执行ssh node2应该直接进入node2的命令行不再提示密码再试着ssh node3同样直达。如果其中有一台还要密码就单独排查那一台的免密配置不要全部重来。这里有个管理习惯值得多说一句不要用root直接做集群操作。root的SSH通常会禁用或严格限制而普通用户的免密配置方便多了。日常用普通用户登录需要提权时再sudo这样既安全又能满足实验需求。5.3 防火墙和SELinux是集群通信最大的两个隐形杀手很多集群第一次互通失败排查到最后都栽在防火墙和SELinux上。CentOS 7自带firewalld默认只放行ssh等少量服务其他端口全部拒绝。集群里的节点之间要跑各种各样的服务如果一个个去放行端口太累在实验环境里我直接选择把防火墙关闭。确认集群节点没有对外暴露需求的情况下执行systemctl stop firewalld systemctl disable firewallddisable是为了开机不再自动启动不然重启后防火墙又回来了排查半天找不到原因。SELinux是另一个坑。CentOS默认开启SELinux它会对文件访问、进程权限做强制访问控制很多组件跑起来“权限不足”其实都是它拦的。关闭SELinux的方法是把/etc/selinux/config里的SELINUXenforcing改成permissive注意不是改成disabledpermissive模式下SELinux不打日志不拦截但是不会像disabled那样彻底影响某些组件的路径操作。改完配置文件后重启生效。disabled的问题在于很多软件在安装时依赖selinux-policy相关的包完全关闭反而可能引起奇怪的问题所以实验环境用permissive最省心。这两个东西如果留着后面每装一个服务可能都会冒出“Permission denied”、“Connection refused”这类问题而实际上服务本身是好的。与其一个一个排查不如在最开始就把这个环境变量统一关掉把注意力集中在真正要实验的组件上。6. 常见问题速查与排错实录6.1 节点之间ping不通先按这个顺序排查虚拟机之间ping不通是最常见的问题原因可能有七八种按顺序排查最高效。先看IP地址本身。ip addr确认每台机器都拿到了预期的IP没有重复、没有169.254这种链路本地地址出现这个说明DHCP失败或者配置没有生效。再看网关和路由。ip route看看默认路由是不是指向了仅主机网卡对应的网关。如果看到路由走的是NAT网卡的网关那内网互通自然有问题。然后看防火墙。当前节点上systemctl status firewalld如果防火墙是active状态先临时stop掉再测ping。通了就说明是防火墙问题那就不用排查别的了。最后看VirtualBox自身的网络设置。打开每台虚拟机的设置-网络确认第二块网卡确实接在同一个仅主机网络上。有个很常见的低级错误三台虚拟机里有一台的仅主机网卡名字写错了或者没有启用结果那一台就跟整个集群断了。排查的时候不要同时改多个东西。我见过一个同学一次改了静态IP、关了防火墙、又动了SELinux一通操作下来还是不通最后发现是根本没用同一个网段之前的修改反而把问题搞得更乱了。一次只改一个变量每改完测一次这是排查网络问题必须养成的习惯。6.2 SSH免密不生效八成是权限问题SSH免密登录配完了还是提示输密码绝大多数情况下问题出在.ssh目录或者authorized_keys文件的权限上。OpenSSH对权限非常敏感。~/.ssh目录权限必须是700~/.ssh/authorized_keys文件权限必须是600组和其他用户不能有任何写权限。如果权限过于宽松SSH服务端会直接拒绝读取这个文件里的公钥。检查方法chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys另一个常见的坑是公钥放错了用户。比如你从node1的root用户执行ssh-copy-id adminnode2公钥会被写到node2的/root/.ssh/authorized_keys里而不是/home/admin/.ssh/里。如果你后续用admin登录node2SSH会去读/home/admin/.ssh/authorized_keys自然找不到公钥。所以执行ssh-copy-id之前先确认当前用户是谁复制到哪个用户目录下保持一致。还有一个隐蔽问题如果之前用ssh连接过某台机器known_hosts里记录了旧的host key克隆出来的节点host key如果变了SSH第一次连接会出现警告然后拒绝连接。这时候手动把known_hosts里有冲突的那行删掉或者用ssh-keygen -R清理一下即可。6.3 时间漂移问题宿主机休眠后集群会出怪事虚拟机跑一段时间后发现节点时间不一致最典型的原因是宿主机进入了休眠或者睡眠状态。宿主机休眠时虚拟机里的时钟会暂停唤醒后虚拟机的系统时间还停在暂停那一刻和真实时间差了一大截。分布式组件对时间偏差很敏感轻则日志时间错乱重则节点间通信出错。解决办法两步走。第一在VirtualBox的设置里把宿主机休眠关掉或者至少保证跑虚拟机的时候不让宿主机睡眠。第二在集群每个节点上启用chrony时间同步服务让它定期和上游时间源校准。systemctl enable chronyd systemctl start chronyd默认配置下chrony会从系统自带的pool.ntp.org服务器同步时间。如果NAT网卡正常这个同步是能成功的。同步后执行chronyc sources可以确认时间源状态执行timedatectl查看当前的系统时间和NTP状态。这里有个细节NAT网卡本身能访问外网所以时间同步走NAT出去是通的。如果只配了仅主机网卡那chrony就同步不了所以前面说的双网卡方案对时间同步也是有用的。6.4 快照回滚和一条命令同步hosts日常管理真香集群搭好之后日常管理还有两个技巧想分享。第一个是快照使用策略。每完成一个阶段性的配置比如基础环境配完了、某个组件装完了、集群验证通过了就打一个快照。快照命名要有意义不要全部叫“Snapshot 1”、“Snapshot 2”我习惯用“base-clean”、“with-jdk”、“cluster-running”这种描述性名称。某个实验把集群搞坏了直接右键-恢复快照几分钟就能回到可用状态这是本地实验环境对比公网服务器的最大优势。第二个是hosts文件的批量同步。三个节点的/etc/hosts内容完全一致如果有新增节点手动一台台改太容易漏。我一般先在node1上改好然后一条scp命令发到其他节点scp /etc/hosts node2:/etc/hosts scp /etc/hosts node3:/etc/hosts这种方式也适用于同步其他配置文件比如/etc/chrony.conf、/etc/selinux/config只要保证每台机器的配置内容一致即可。改了配置文件之后记得重启对应服务或者重启机器不然配置不会立即生效。搭完这套环境之后能做什么把yum源配好基础工具装好接下来就可以在这个集群上装各种分布式组件了。不管你是研究存储、跑任务调度还是自己搭建一套高可用服务这套VirtualBox底下的CentOS集群都已经把最底层的地基铺好了。后面不管在哪台机器上执行什么命令这套环境都能给你一个稳定、可重复、可回滚的折腾空间这才是本地搭集群最大的价值。