前言
工程地址:dhwark/vagrant-easy_k8s (github.com)
鸣谢:此项目来源于B站up主“一小时技术精讲”,在着手部署之前一定要先看视频!!!
一:原工程中的Ubuntu镜像地址失效了,在我的fork工程中修改了镜像地址为上海交大的镜像地址。
二:修改节点的时区为CST并开启同步,避免节点时间不一致无法加入集群。
三:原工程中的IP段在我的机器上节点无法互相通信,如果你遇到同样的问题,请尝试修改IP段!
部署之前请确保你已经开启VT-x虚拟化,关闭“Windows功能”中的虚拟化平台以及hyper-v。
虽然此工程只需要用到少量vagrant命令,但还是建议你可以学习vagrant的基本用法再开始部署。
部署完成之后一定要在master节点上切换到root身份再查看集群状态!!!
视频地址:一键安装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
注意:
- 推荐使用 VirtualBox 6.1.32 或之后的版本,旧版在Windows下可能与Hyper-V有冲突。
- 不要使用 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分配的范围内,会出现如下错误:
请根据提示修改Vagrantfile
。
6.虚拟机网络
Vagrant创建的虚拟机总是将第一个网卡设置为网络地址转换(NAT)
,不可更改。
NAT模式下,虚拟机只能单向访问外部网络(通常用来访问互联网),虚拟机之间相互隔离,无法互相访问,每个虚拟机的IP都是10.0.2.15
。
我们在Vagrantfile
中通过private_network
添加了一个Host-Only
网络,虚拟机之间使用这个网络进行通信,宿主机也可以通过IP地址访问虚拟机。
master.vm.network "private_network", ip: $master_ip
Host-Only
顾名思义,虚拟机仅对宿主机可见,宿主机之外的主机无法访问虚拟机,虚拟机也无法访问外部网络(互联网)。
注意:
- 网络地址转换NAT和NAT网络不一样。在VirtualBox官方文档中,网络地址转换的英文叫NAT,而NAT网络叫 NAT network 或 NAT service
- NAT网络可以为每个虚拟机设置不同的IP地址,虚拟机之间可以互相访问,也可以访问互联网,但是无法从外部网络访问虚拟机。
- 参考文档: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.其他说明
- 本次安装只需一条命令,全程无需任何介入,无人值守全自动安装。
- 安装脚本针对国内网络进行优化,安装过程中使用的所有包和镜像仓库全部替换成阿里云源,并为
containerd
配置了阿里云镜像加速。 - 安装的版本为
kubernetes v1.26
,需要containerd 1.6
或更高版本。
ubuntu仓库里的containerd版本较低,因此使用docker仓库来安装containerd。
- 从 **v1.25 **版本开始,谷歌镜像中心由
k8s.gcr.io
变更为registry.k8s.io
。
例如containerd中使用的沙箱镜像变为了
registry.k8s.io/pause
,由于网络问题,脚本中将它替换成了registry.aliyuncs.com/google_containers/pause
,不然可能导致kubernetes安装失败。
- 本次安装使用自定义的
token
令牌,格式为[a-z0-9]{6}.[a-z0-9]{16}
,可以在Vagrantfile
中修改下面的变量设置令牌。
# k8s令牌
$k8s_token = "123456.0123456789abcdef"