使用 VirtualBox + Vagrant + Centos 搭建虚拟机集群
最近学习 ElasticSearch、k8s 这些技术的时候,发现都要用到集群环境,所以这两天利用空闲时间,使用 VirtualBox + Vagrant + Centos 在自己的电脑上搭建了一个虚拟机集群。今天把搭建步骤整理一下,写了这篇文章,搭建过程踩过的坑已经用红色进行标注,大家按需采用。
一、使用 VirtualBox + Vagrant + Centos 快速创建一个 linux 虚拟机
VirtualBox:类似 VMware,是一个虚拟机,平常大家用 VMware 比较多,我们这里使用 VirtualBox,这样我们就可以使用 Vagrant 快速地帮我们搭建一个虚拟机了。
Centos:类似 ubantu,是一个 linux 操作系统。
Vagrant:Vagrant 是一个操作 VirtualBox 虚拟机的工具。它有一个仓库,里面有 centos 或者 ubuntu 等 Linux 操作系统镜像,使用 Vagrant 可以拉取这些操作系统镜像,然后将其安装到 VirtualBox 虚拟机中,从而实现在虚拟机中快速安装 Linux 操作系统。
踩坑:在安装 Vagrant 的时候,需要注意一点,Vagrant 依赖 VirtualBox,我们需要在安装 Vagrant 之前先安装 VirtualBox,否则 Vagrant 安装成功了也启动不起来。
1、下载并安装 VirtualBox (Windows 6.0.12 版本)
下载 VirtualBox,官网地址:https://www.virtualbox.org/wiki/Download_Old_Builds_6_0
VirtualBox 安装之前,电脑需要开启 CPU 虚拟化,虚拟化步骤见图1、2,虚拟化之后,重启电脑。
然后安装 VirtualBox,双击 VirtualBox 安装包,选择 VirtualBox 的安装地址,然后一路“下一步”即可完成安装。
2、在 VirtualBox 中安装虚拟的 Linux 系统
(1)原始安装方式(太麻烦,不推荐)
VirtualBox 安装完成,此时桌面上会有一个 VirtualBox 图标,见图5,双击鼠标打开它,进入 VirtualBox 主界面,见图6。
如果我们想在 VirtualBox 里面新建一个 Linux 虚拟机,我们需要先在网上下载 Linux 相关镜像(centos 镜像或者 ubuntu 镜像,.iso 文件)。
然后在 VirtualBox 界面,点击“新建”按钮,按照步骤将刚才下载的 Linux 镜像安装进来,见图6、图7。
(2)使用 Vagrant 快速地在 VirtualBox 虚拟机里面安装一个 centos 操作系统
使用原始方式在虚拟机中安装 Linux 虚拟机太麻烦了,并不推荐,我们可以使用 Vagrant 快速地安装一个 Linux 操作系统(使用 Vagrant 的前提是已经安装了 VirtualBox,如果你使用 VMware 虚拟机,就不能使用 Vagrant 了)。
第一步:下载并安装 Vagrant
Vagrant 官方镜像仓库地址:https://app.vagrantup.com/boxes/search,在这里面可以看到 ubuntu 和 centos 镜像,见图8。
Vagrant 官网下载地址:https://www.vagrantup.com/downloads,下载 Windows 64 位版本,见图9。
然后安装 Vagrant,双击 Vagrant 安装包,见图10,选择 Vagrant 的安装地址,然后一路“next”即可完成安装。
安装完 Vagrant,需要重启电脑,然后我们来验证一下 Vagrant 是否安装成功。打开 windows cmd 窗口,执行 vagrant 命令,如果有输出 vagrant 的命令提示,说明 Vagrant 安装成功,见图12。
第二步:打开 windows cmd 窗口,运行 vagrant init centos/7 命令,初始化一个 centos 操作系统
执行完 vagrant init centos/7 这条命令,在 C:\Users\zxj 文件夹下会自动生成一个 Vagrantfile文件,见图14。
第三步:打开 windows cmd 窗口,运行 vagrant up 命令,启动 VirtualBox 虚拟机,系统用户 root 的用户密码是 vagrant
第一次执行 vagrant up 命令,会从 Vagrant 仓库下载 Centos 镜像,并初始化为 Centos 操作系统到虚拟机中,所以第一次启动会比较慢。
此时进入 VirtualBox 主界面,发现已经有一个正在运行的虚拟机,这个就是刚刚安装了 centos 操作系统的虚拟机。
第四步:打开 windows cmd 窗口,运行 vagrant ssh 命令,自动使用 vagrant 用户连接虚拟机。之后我们就可以在 cmd 中敲 linux 命令操作虚拟机,不需要安装虚拟机的客户端啦
第五步:运行 exit 命令,断开与虚拟机的连接
之后,我们想要使用虚拟机,就打开 windows cmd 窗口,执行 vagrant up 连接虚拟机,敲 linux 命令,执行 exit 命令断开与虚拟机的连接,回到 cmd。
3、虚拟机网络设置
(1)修改 Vagrantfile 文件
虚拟机默认的 ip 不是固定的,对于日常开发很不方便,我们这里把虚拟机 ip 配置成固定的。
根据 Vagrantfile 文件创建虚拟机,这个文件中存储着虚拟机的配置信息,我们修改 Vagrantfile 文件中的网络配置,将虚拟机ip设置成是固定的。
在 Vagrantfile 文件中增加一句:config.vm.network "private_network", ip: "192.168.56.10",见图20,注意这个固定 ip 不是随便配置的,需要和 VirtualBox 的虚拟网卡在一个网段。
怎么查看 VirtualBox 所在网段是多少呢?打开 windows cmd 窗口,运行 ipconfig 命令,即可得到 VirtualBox 所在网段,见图21,VirtualBox 所在网段为 192.168.52.xxx。
(2)打开 windows cmd 窗口,运行 vagrant reload 命令,重启 vagrant
(3)运行 vagrant ssh 命令,连接上虚拟机,执行 ip addr,发现虚拟机的IP地址已经改成192.168.56.10
(4)检测windows和虚拟机能否ping通
windows 机器 IP 地址为 192.168.137.85,虚拟机 IP 地址为 192.168.56.10。
在 windows 中 ping 虚拟机,可以 ping 通,见图24,在虚拟机中 ping windows,可以 ping 通,见图25。
二、搭建虚拟机集群
首先我们需要写一个 Vagrantfile 文件,在里面指定要创建的三台虚拟机的信息,然后使用这个文件来创建三台虚拟机。
1、编写创建三个虚拟机的 Vagrantfile 文件,文件内容如下所示,将该文件放在 D:\vagrant 这个目录下。
踩坑:我们创建三个虚拟机,每个虚拟机内存设置的是4G,三个虚拟机一共占有的内存还是蛮大的,所以我们最好把它们安装到一个内部剩余比较大的盘,如果盘内存不够,虚拟机就会安装失败。
踩坑:Vagrantfile 文件不能放在 D 盘根目录下,如果放到 D 盘或者 C 盘根目录下,只能创建第一个 node,后面的 node 都不能创建,日志会被卡住。
Vagrant.configure("2") do |config|
(1..3).each do |i|
config.vm.define "node#{i}" do |node|
# 设置虚拟机的Box
node.vm.box = "centos/7"
# 设置虚拟机的主机名
node.vm.hostname = "node#{i}"
# 设置虚拟机的IP
node.vm.network "private_network", ip: "192.168.56.#{99+i}", network: "255.255.255.0"
# VirtualBox 相关配置
node.vm.provider "virtualbox" do |v|
# 设置虚拟机的名称
v.name = "node#{i}"
# 设置虚拟机的内存大小(4G)
v.memory = 4096
# 设置虚拟机的CPU个数
v.cpus = 4
end
end
end
end
2、打开 windows cmd 窗口,进入 Vagrantfile 所在目录,执行 vagrant up,此时 Vagrant 就会帮我们创建三个虚拟机。
执行 vagrant up ,此时在 Vagrantfile 的同级目录下,自动生成一个 .vagrant 文件夹,见图26。同时在 D:\vagrant 的同级目录中,自动生成一个 VirtualBox 文件夹,里面是创建的三个虚拟机,见图27、28。
vagrant up 命令的执行日志见图29、30、31,此时三个虚拟机创建成功。
此时打开 VirtualBox 主界面,可以看到这三个虚拟机,分别是 node1、node2、node3,见图32。
3、进入三台虚拟机,开启 root 的密码访问权限,这样我们就可以通过 Xshell 等工具来连接虚拟机了(cmd 没有高亮显示,用起来不是很方便)。
vagrant ssh node1 // 连接 node1 这台虚拟机
su root // 切换到 root 用户,root 用户密码为 vagrant
vi /etc/ssh/sshd_config
修改 sshd_config 文件,PasswordAuthentication no 修改成 PasswordAuthentication yes
service sshd restart // 重启虚拟机
exit // 退出 root 用户
exit // 退出 node1 这个虚拟机
接下来,以同样的方式操作剩下的两台虚拟机
4、使用 Xshell 连接虚拟机
使用 Xshell 创建 node1 的会话,见图37、38,使用同样的方式创建 node2、node3 的会话,最后三个会话创建成功,见图39。
连接 node1,选中左侧栏中 node1 会话,鼠标左键双击,此时弹出窗口,输入用户名和密码,即可连接上该虚拟机,见图40、41、42,使用同样的方式连接上 node2、node3。
5、设置虚拟机的 NAT 网络
运行 ip route show 命令,查看 node1 的网卡,得到结果,node1 使用的是 eth0 这个网卡,见图43。
运行 ip addr 命令,查看 eth0 的地址,得到结果,eth0 地址是 10.0.2.15,见图44。
以同样方式查看 node2 和 node3 的网卡,网卡 ip 都是 10.0.2.15,见图45、46。
现在我们要让这三个虚拟机的网卡 ip 是唯一的,即这三个虚拟机的网卡 ip 不相同,配置步骤如下所示。
(1)依次关闭三个虚拟机,进入 VirtualBox 主界面,选择"管理" -> "全局设定" -> "网络" -> "添加新NAT网络" -> "OK",见图47、48、49。
(2)给 node1 设置网络,选中 node1 -> "设置" -> "网络" -> 更改连接方式,由"网络地址转换(NAT)"更改为"NAT 网络" -> "高级" -> "重新生成一个 MAC 地址" -> "OK",见图50、51、52。
(3)按照第二步的方式,给 node2 和 node3 设置网络。
(4)node1、node2、node3 的网络都设置完了,重启虚拟机,此时查看这三个虚拟机的网卡,发现 node1 的网卡 ip 是 10.0.2.15,node2 的网卡 ip 是 10.0.2.4,node3 的网卡 ip 是 10.0.2.5,见图53、54、55,此时三台虚拟机的网关 ip 已经是不同的了。
(5)验证每个虚拟机到自己的网关ip是否可以ping通,已经每个虚拟机到外网(baidu.com)是否可以ping通。
node1 到其网关 10.0.2.15 可以 ping 通,见图56,node1 到 baidu.com 可以 ping 通,见图57。
node2 到其网关 10.0.2.4 可以 ping 通,见图58,node2 到 baidu.com 可以 ping 通,见图59。
node3 到其网关 10.0.2.5 可以 ping 通,见图60,node3 到 baidu.com 可以 ping 通,见图61。
(6)设置 Linux 环境(三个虚拟机都执行)
// 关闭防火墙,在开发模式下,关闭防火墙,这样我们就不用配置各种防火墙的进出规则了
systemctl stop firewalld
systemctl disable firewalld
// 关闭 selinux,selinux 是 linux 的安全策略。
// 使用下面这两条指令都可以关闭 setlinux,不同的是,第一条是永久关闭,第二条是临时关闭,下一次重启就失效了。
// setlinux 关闭之前,/etc/selinux/config 文件中 SELINUX 取值为 enforcing,setlinux 关闭之后,SELINUX 取值为 disabled,见图63、图64。
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
// 关闭 swap(内存交换),swap 会影响程序性能,所以一般把它关闭掉。
// 使用下面这两条指令都可以关闭 swap,不同的是,第一条是临时关闭,第二条是永久关闭。
// swap 关闭之前,/etc/fstab 文件中有这样一句话,/swapfile none swap defaults 0 0,swap 关闭之后,这句话就被注释掉了,见图65、图66。
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
// 验证 swap 关闭是否成功,执行完 free -g 这条指令,Swap 的 total、used、free 都为0,说明 swap 关闭成功,见图67。
free -g
// 使用 hostname 命令,查看当前虚拟机的主机名,发现三台虚拟机的主机名和我们在 vagrant 文件中定义的一样,分别是 node1、node2、node3,见图68。
hostname
// 如果主机名不是我们在 vagrant 里面指定的,我们可以使用下面这条指令添加主机名。
hostnamectl set-hostname <newhostname>
// 添加主机名和 ip 的对应关系
// 这里需要注意,每台虚拟机不仅仅要配置自己的主机名和 ip 的对应关系,还要配置其他虚拟机的主机名和 ip 的对应关系,这样它们之间才能通过主机名互相 ping 通,图69、70是node2做的配置,node1和node3需要做同样的配置。
vi /etc/hosts
10.0.2.15 node1 // 10.0.2.15 是 node1 的网卡 ip
10.0.2.4 node2
10.0.2.5 node3
// 上述操作添加完,我们在 node1 中执行 ping node3 命令,发现可以 ping 通,见图71,同理,这三个虚拟机任何两个之间去 ping,都能 ping 通,说明配置没有问题了。
[root@node2 ~]# ping node3
6、关闭集群,在 VirtualBox 主界面,右键虚拟机->退出->正常关机,依次关闭着三个虚拟机,此时集群就关闭了。
7、开启集群,执行第二步,使用 vagrant up 一下子启动三个虚拟机,也可以在 VirtualBox 主界面,右键虚拟机->启动->正常启动,依次启动这三个虚拟机,此时集群就开启了。
到这里,我们就已经搭建好一个属于自己的集群啦,happy ending