前言

工程地址:dhwark/vagrant-easy_k8s (github.com)

鸣谢:此项目来源于B站up主“一小时技术精讲”,在着手部署之前一定要先看视频!!!

一:原工程中的Ubuntu镜像地址失效了,在我的fork工程中修改了镜像地址为上海交大的镜像地址。

二:修改节点的时区为CST并开启同步,避免节点时间不一致无法加入集群。

三:原工程中的IP段在我的机器上节点无法互相通信,如果你遇到同样的问题,请尝试修改IP段!

部署之前请确保你已经开启VT-x虚拟化,关闭“Windows功能”中的虚拟化平台以及hyper-v。

虽然此工程只需要用到少量vagrant命令,但还是建议你可以学习vagrant的基本用法再开始部署。

部署完成之后一定要在master节点上切换到root身份再查看集群状态!!!

image-1692799169958

视频地址:一键安装kubernetes_哔哩哔哩_bilibili

原工程地址:vagrant-all/vagrant-k8s · jeff-qiu/k8s-2hours - 码云 - 开源中国 (gitee.com)


1.准备工作:

  • Vagrant 2.3.4

下载地址:https://developer.hashicorp.com/vagrant/downloads

  • VirtualBox 6.1.32

下载地址:https://www.virtualbox.org/wiki/Download_Old_Builds_6_1

注意:

  1. 推荐使用 VirtualBox 6.1.32 或之后的版本,旧版在Windows下可能与Hyper-V有冲突。
  2. 不要使用 VirtualBox 7.0,Vagrant目前支持还不是很好。

2.Vagrant介绍

Vagrant是一个虚拟机管理工具,可以通过配置文件,批量、自动化的创建虚拟机,并提供一致性环境。
Vagrant不提供虚拟化,需要配合VirtualBox或VMware使用。
Vagrant使用box镜像创建虚拟机,box类似于docker image,box是提供一个预先配置好的环境,开箱即用。
使用Vagrant创建虚拟机非常简单:

# 下载ubuntu 22.04的box文件到本地,并自动生成Vagrantfile
vagrant init ubuntu/jammy64
# 一键创建和启动虚拟机
vagrant up

Vagrant默认从HashiCorp’s Vagrant Cloud box catalog下载镜像,由于国内网络的原因,下载速度非常慢,并且它不像dockerHub,国内有整站的镜像。
好在Ubuntu官方下载中心会发布基于ubuntu的box镜像(仅支持virtualbox),因此我们可以从ubuntu的国内镜像中心下载。

# vagrant init boxname url
vagrant init ubuntu/jammy64 
        \https://s3.jcloud.sjtu.edu.cn/899a892efef34b1b944a19981040f55b-oss01/rsync/ubuntu-cloud-images/2675059070fdea94648b15eb4f302d8771fe0fac

3.集群规划

用户名:root 密码:123456

主机名 IP地址 类型
k8s-master 192.168.56.30 Control Plane 控制平台
k8s-worker1 192.168.56.31 Node节点
k8s-worker2 192.168.56.32 Node节点

4.创建集群

下载启动脚本:https://gitee.com/jeff-qiu/k8s-2hours/tree/master/vagrant-k8s

  • bootstrap.sh 通用设置脚本(修改系统配置、使用阿里云镜像仓库、安装依赖)
  • kubeadm-init.sh kubeadmin初始化控制平面脚本
  • Vagrantfile Vagrant创建虚拟机配置文件

创建虚拟机并自动部署kubernetes集群

vagrant up

k3s安装脚本和容器镜像均使用阿里云镜像仓库,避免网速不佳或无法下载的问题。

5.虚拟机IP

VirtualBox默认将192.168.56.0/21范围内的地址分配给虚拟机。可以使用以下命令查看IP地址范围。

VBoxManage list hostonlyifs

Vagrantfile中使用下面两个变量设置虚拟机的IP地址。

#ip地址从192.168.56.20的开始递增
$ip_range   = "192.168.56."
$ip_start   = 100

如果Vagrantfile中的IP地址不在VirtualBox分配的范围内,会出现如下错误:
image-1692799207108
请根据提示修改Vagrantfile

6.虚拟机网络

image-1692799218842

Vagrant创建的虚拟机总是将第一个网卡设置为网络地址转换(NAT),不可更改。
NAT模式下,虚拟机只能单向访问外部网络(通常用来访问互联网),虚拟机之间相互隔离,无法互相访问,每个虚拟机的IP都是10.0.2.15
我们在Vagrantfile 中通过private_network添加了一个Host-Only网络,虚拟机之间使用这个网络进行通信,宿主机也可以通过IP地址访问虚拟机。

master.vm.network "private_network", ip: $master_ip

Host-Only顾名思义,虚拟机仅对宿主机可见,宿主机之外的主机无法访问虚拟机,虚拟机也无法访问外部网络(互联网)。

注意:

  1. 网络地址转换NATNAT网络不一样。在VirtualBox官方文档中,网络地址转换的英文叫NAT,而NAT网络叫 NAT networkNAT service

image-1692799244342

  1. NAT网络可以为每个虚拟机设置不同的IP地址,虚拟机之间可以互相访问,也可以访问互联网,但是无法从外部网络访问虚拟机。
  2. 参考文档:https://www.virtualbox.org/manual/ch06.html

7.calico网络

本次安装使用calico作为默认的网络插件(CNI)。
calico默认为Pod分配192.168.0.0/16范围内的IP地址,集群初始化时,kubeadmin init命令通过--pod-network-cidr参数也设置了IP地址的范围,二者如果一致,会导致本机无法访问Pod。
需要修改calico.yaml中的CALICO_IPV4POOL_CIDR的值与--pod-network-cidr一致。

# The default IPv4 pool to create on startup if none exists. Pod IPs will be
# chosen from this range. Changing this value after installation will have
# no effect. This should fall within `--cluster-cidr`.
 - name: CALICO_IPV4POOL_CIDR
   value: "172.10.0.0/16"

由于虚拟机有多个网卡,Vagrant总是将第一个网卡设置为NAT(只能访问互联网,虚拟机之间无法互相访问),为了使calico选择正确的网卡进行通信,将IP_AUTODETECTION_METHOD设置为第二个网卡enp0s8

kubectl set env daemonset/calico-node -n kube-system \
        IP_AUTODETECTION_METHOD=interface=enp0s8

8.其他说明

  1. 本次安装只需一条命令,全程无需任何介入,无人值守全自动安装。
  2. 安装脚本针对国内网络进行优化,安装过程中使用的所有包和镜像仓库全部替换成阿里云源,并为containerd配置了阿里云镜像加速。
  3. 安装的版本为kubernetes v1.26,需要containerd 1.6或更高版本。

ubuntu仓库里的containerd版本较低,因此使用docker仓库来安装containerd。

  1. 从 **v1.25 **版本开始,谷歌镜像中心由k8s.gcr.io变更为registry.k8s.io

例如containerd中使用的沙箱镜像变为了registry.k8s.io/pause,由于网络问题,脚本中将它替换成了registry.aliyuncs.com/google_containers/pause,不然可能导致kubernetes安装失败。

  1. 本次安装使用自定义的token令牌,格式为[a-z0-9]{6}.[a-z0-9]{16},可以在Vagrantfile中修改下面的变量设置令牌。
# k8s令牌
$k8s_token      = "123456.0123456789abcdef"