【kubernetes入门学习】使用vagrant创建虚拟机
手动创建虚拟机比较麻烦,可以使用vagrant来简化创建虚拟机的操作。vagrant既可以创建virtualbox虚拟机,也可以创建virtualVM虚拟机。当然,官方更推荐轻量级的virtualbox。
1.安装vagrant,创建虚拟机
下面就来使用vagrant来创建三台台VirtualBox虚拟机,以后我会使用这三台虚拟机来搭建k8s集群。
首先,需要先安装好virtualbox和vagrant。如果创建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
最后,执行以下命令,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集群。