使用vagrant初始化多个虚拟机
2024-02-26 15:13:18

katacoda 和 play with kubernetes 的在线环境用起来太卡了,让我彻底放弃白嫖的想法。

背景

最近在学习 k8s,之前一直用的 kind 启动的集群,一键傻瓜式启动,但是不能对集群的配置进行修改,每次修改都要把集群销毁掉再重启。这显然不是我想要的,所以就只能自己想办法搞一套环境来操作。

一开始的时候,是打算用 katacoda 来在线操作的,但是这个平台还是有一些问题,一个是卡,初始化 master 节点直接卡死了,等了半天都不行,毕竟云服务器是很贵的,不可能每个人都给很多资源,还有一个就是网络问题,这个网站是国外的,网络有时候感觉不是很稳定,操作起来不方便。

使用 katacoda 不行,然后看到了 kubernetes handbook,上面介绍了 play with kubernetes 在线实验平台,刚开始上手感觉还不错,但是还是同样的问题–操作不方便。网页上复制粘贴要用 ctrl + Insert 和 shift + Insert,而且执行完命令没有反应,使用体验很差劲。

2022/3/21 更新

有时候启动的时候,ssh 登录会失败,从 vbox 进去查看,发现没有获取到正确的 ip 地址,尝试了好几种办法,最后的解决方法是在 vbox 里把多余的网卡删除掉,这样虚拟机就能获取到正确的 ip 地址。

默认用的网卡,配的 ip 地址是 192.168.56.xxx,所以在 vgrantfile 里也配成 192.168.56.xxx 的 ip 地址。

初识 Vagrant

以前经常在一些项目里看到有 Vagrantfile 这个文件,我也大概知道这个是用来创建虚拟机的,但是从来都没有用过。本来这次也是准备像以前一样,下载虚拟机的镜像,然后去创建,我都开始下载镜像了,同事给我说让我直接用 Vagrant,我想了想,试一试?

不搜不知道,原来 Vagrant 是 HashiCorp 公司的产品,说起来当初毕业设计还是参考的他们公司的一个项目做的呢 🐶

上手

vagrant 使用很简单,从官网下载对应系统的安装包,还有 virtualbox 的安装包,分别安装,就可以使用 vagrant 命令了。当然,使用 VMware 应该也可以,我在 vagrant cloud 上看到有对应的 VMware 的 box。

创建一个文件夹:

1
mkdir kubernetes

初始化:

1
vagrant init ubuntu/bionic64

上面这条指令会在当前目录创建一个 Vagrantfile 文件,如果只想运行虚拟机而不创建配置文件,可以使用:

1
vagrant box add ubuntu/bionic64

修改 Vagrantfile 配置

由于要练习 k8s 的操作,那么最好是有多个节点,因此我期望达到的目标是:执行一条指令,启动多个虚拟机,然后虚拟机里面安装好 docker 和 kubernetes。然后就可以通过 ssh 连接上去练习操作。

具体的配置贴在下面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Vagrant.configure("2") do |config|

config.vm.box_check_update = false

(1..3).each do |i|

config.vm.define "node#{i}" do |node|

# 设置虚拟机的Box
node.vm.box = "ubuntu/bionic64"

# 设置虚拟机的主机名
node.vm.hostname="node#{i}"

# 设置虚拟机的IP
node.vm.network "private_network", ip: "192.168.68.#{i}"

# 设置主机与虚拟机的共享目录
# node.vm.synced_folder "~/Desktop/share", "/home/vagrant/share"

# VirtaulBox相关配置
node.vm.provider "virtualbox" do |v|

# 设置虚拟机的名称
v.name = "node#{i}"

# 设置虚拟机的内存大小
v.memory = 2048

# 设置虚拟机的CPU个数,初始化 k8s 至少需要 cpu 为 2
v.cpus = 2
end

# 设置启动脚本
config.vm.provision :shell, path: "bootstrap.sh"

end
end
end

注意

上面的配置中使用到了一个 shell 脚本,脚本应该放在和 Vagrantfile 同一目录下,脚本中的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env bash

sudo apt-get update

# 移除旧的 docker 包
sudo apt-get remove -y docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt-get install -y ca-certificates curl gnupg lsb-release apt-transport-https

# 导入 docker GPG key

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 添加 docker apt 仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 更新索引
sudo apt-get update

# 安装 docker
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

# 导入 Google Cloud GPG key
curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

# 添加 kubernetes apt 仓库
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 再次更新包索引
sudo apt-get update

# 安装 kubelet、kubeadm 和 kubectl,并锁定其版本
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

启动

启动只需要一条命令

1
vagrant up

如果要销毁这些虚拟机,使用

1
vagrant destroy

查看 vagrant 管理的虚拟机状态:

1
vagrant status

ssh 连接上虚拟机

1
vagrant ssh node1

总结

Vagrant 是个好东西啊,以前居然一直没有尝试去用它。😀