【kubernetes入门学习】使用vagrant创建虚拟机

手动创建虚拟机比较麻烦,可以使用vagrant来简化创建虚拟机的操作。vagrant既可以创建virtualbox虚拟机,也可以创建virtualVM虚拟机。当然,官方更推荐轻量级的virtualbox。

1.安装vagrant,创建虚拟机

下面就来使用vagrant来创建三台台VirtualBox虚拟机,以后我会使用这三台虚拟机来搭建k8s集群。

首先,需要先安装好virtualboxvagrant。如果创建VirtualVM虚拟机,还要额外安装Vagrant VMware Utility工具。然后,准备vagrantfile文件,文件内容如下。vagrant的详细使用可以参考:Vagrant 上手指南,超详细!

Vagrant.configure("2") do |config|
   (1..3).each do |i|
        config.vm.define "k8s-node#{i}" do |node|
            # 设置虚拟机的Box
            node.vm.box = "centos/7"

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

            # 设置虚拟机的IP
            node.vm.network "private_network", ip: "192.168.56.#{99+i}", netmask: "255.255.255.0"

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

            # VirtaulBox相关配置
            node.vm.provider "virtualbox" do |v|
                # 设置虚拟机的名称
                v.name = "k8s-node#{i}"
                # 设置虚拟机的内存大小
                v.memory = 4096
                # 设置虚拟机的CPU个数
                v.cpus = 4
            end
        end
   end
end
View Code

最后,执行以下命令,vagrant就会自动为我们创建好三台虚拟机。

vagrant up

2.开启ssh的账号密码访问

ssh服务默认不能使用用户密码访问,可以使用vagrant ssh分别连接每个节点进行设置。需要切换到root用户操作,密码为vagant。

#以node1为例,其它节点操作步骤一样
#vagrant连接node1 vagrant ssh k8s-node1

#切换到root [vagrant@k8s-node1 ~]$ su root Password:

#修改ssh配置 [root@k8s-node1 vagrant]# vi /etc/ssh/sshd_config

修改PasswordAuthentication no 改为yes

#最后记得重启下ssh服务
service sshd restart

#退出node1
exit
#退出vagrant
exit

之后,就可以使用xshell来统一管理三个节点了。

3.解决vagrant网卡ip问题

这里有个问题,vagrant创建的虚拟机的默认网卡eth0预留给自己ssh使用,这样每台虚拟机eth0的ip都是10.0.2.15,而虚拟网卡eth1才是真正的本机ip。

我们可以确认一下上面这个问题。首先,使用ip route show命令,显示默认网卡都是eth0。

[root@k8s-node1 ~]# ip route show
default via 10.0.2.2 dev eth0 proto dhcp metric 100

使用ip addr命令查看各虚拟机的网卡信息,可以发现eth0的ip都是10.0.2.15。下面是node1虚拟机的网卡信息。

[root@k8s-node1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:4d:77:d3 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
valid_lft 76573sec preferred_lft 76573sec
inet6 fe80::5054:ff:fe4d:77d3/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:95:99:41 brd ff:ff:ff:ff:ff:ff
inet 192.168.56.100/24 brd 192.168.56.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe95:9941/64 scope link
valid_lft forever preferred_lft forever

出现以上问题的主要原因,就是eth0默认使用网络地址转换(NAT)方式:使用相同的IP,通过不同的端口转发来实现网络通信。(eth1网卡使用的仅主机(Host-Only)模式,供外部连接使用)

解决方法

对于上面的问题,有两种解决方式。一种就是改变eth0的网络连接方式,比如使用NAT网络来代替默认的网络地址转换(NAT),这是看某硅谷视频中阳哥使用的方法。

具体的设置步骤如下:

首先,先将三台虚拟机都关闭。然后在管理-->全局设定-->网络,添加新NAT网络。

然后,为每个虚拟机设置网络连接方式为NAT网络。同时,更新MAC地址产生新的mac地址,防止三台虚拟机mac地址重复。

当三台虚拟机都设置完后,重启。使用无界面启动后,使用xshell连接上虚拟机,再次发送ip addr命令查看eth0,可以发现ip不再相同。

#node1
inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0

#node2
inet 10.0.2.4/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0

#node3
inet 10.0.2.5/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0

最后再检查一下网络连通性

ping 10.0.2.15
ping 10.0.2.4
ping 10.0.2.5
ping www.baidu.com

经过上面的配置后,虚拟机的网络情况如下所示:

修改前
节点 eth0  eth1
k8s-node1(master) 10.0.2.15 192.168.56.100
k8s-node2 10.0.2.15 192.168.56.101
k8s-node3 10.0.2.15 192.168.56.102

 

修改后
节点 eth0  eth1
k8s-node1(master) 10.0.2.15  192.168.56.100
k8s-node2 10.0.2.4  192.168.56.101
k8s-node3 10.0.2.5  192.168.56.102

那么,以后就依然将eth0网卡的IP作为本机IP来使用。

 

另一种解决方式就是接受vagrant的行为,就将eth1网卡ip作为主机ip。那么在应用中就要必须保证组件在读取ip时使用的也是eth1网卡的ip。比如在搭建k8s集群时,使用的flannel网络组件默认读取eth0网卡的ip,就需要修改配置让其读取eth1网卡的ip。使用这种方式时,搭建k8s集群需要有几个注意的地方,具体可以参考:使用kubeadm搭建k8s集群。目前我采用的就是第二种方式。

 

至此,我们就为搭建k8s集群准备好了虚拟机环境。在下一篇,将使用这三台虚拟机来搭建k8s集群。

posted @ 2021-12-04 14:53  静水楼台/Java部落阁  阅读(647)  评论(0编辑  收藏  举报