准备虚拟机
使用HyperV来创建虚拟机。
首先创建HyperV虚拟机模板,用于克隆。用于虚拟机的操作系统使用 Ubuntu 24.04.1 Server LTS。
如何使用 HyperV 创建虚拟机网上已经有详细的教程,故省略这些步骤,直接展示创建的摘要信息:
下面的 Powershell 命令创建的虚拟机跟 GUI 向导创建的具有同样的效果:
# Set VM Name, Switch Name, and Installation Media Path.
$VMName = 'Template'
$Switch = 'Default Switch'
$InstallMedia = 'C:\Users\zyang\Downloads\ubuntu-24.04.1-live-server-amd64.iso'
# Create New Virtual Machine
New-VM -Name $VMName -MemoryStartupBytes 2GB -Generation 2 -NewVHDPath "C:\Users\zyang\Desktop\clusters\$VMName\$VMName.vhdx" -NewVHDSizeBytes 40GB -Path "C:\Users\zyang\Desktop\clusters" -SwitchName $Switch
# Add DVD Drive to Virtual Machine
Add-VMScsiController -VMName $VMName
Add-VMDvdDrive -VMName $VMName -ControllerNumber 1 -ControllerLocation 0 -Path $InstallMedia
# Mount Installation Media
$DVDDrive = Get-VMDvdDrive -VMName $VMName
# Configure Virtual Machine to Boot from DVD
Set-VMFirmware -VMName $VMName -FirstBootDevice $DVDDrive
在虚拟机中安装操作系统,在安装前,需禁用安全启动。
接着启动虚拟机进入 Ubuntu 的安装流程。
准备 K8s 运行环境
- 禁用交换分区
$ swapon --show
NAME TYPE SIZE USED PRIO
/swap.img file 2G 0B -2
$ free -h
total used free shared buff/cache available
Mem: 1.9Gi 334Mi 1.5Gi 912Ki 197Mi 1.5Gi
Swap: 2.0Gi 0B 2.0Gi
sudo vim /etc/fstab
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
sudo reboot
sudo shutdown -r now
- 安装容器运行时 containerd
Getting started with containerd
$ sudo tar Cxzvf /usr/local containerd-1.7.21-linux-amd64.tar.gz
$ sudo mkdir -p /usr/local/lib/systemd/system
$ sudo curl -fsSL https://raw.githubusercontent.com/containerd/containerd/main/containerd.service -o /usr/local/lib/systemd/system/containerd.service
$ systemctl daemon-reload
$ systemctl enable --now containerd
$ install -m 755 runc.amd64 /usr/local/sbin/runc
$ sudo mkdir -p /opt/cni/bin
$ sudo tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.5.1.tgz
- 配置
systemdcgroup 驱动
$ sudo mkdir /etc/containerd
$ containerd config default > /etc/containerd/config.toml
$ sudo systemctl restart containerd
- 启用 IPv4 数据包转发
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
sysctl net.ipv4.ip_forward
- 安装 kubeadm、kubelet 和 kubectl
sudo apt-get update
# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
# 如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它,请阅读下面的注释。
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置。
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
- 检查所需端口
nc 127.0.0.1 6443 -v
- 修改hosts(可选)
cat >> /etc/hosts << EOF
192.168.100.100 master1
192.168.100.201 worker1
192.168.100.202 worker2
192.168.100.203 worker3
EOF
创建主节点和工作节点
下面的 PowerShell 命令使用虚拟机模板克隆新的虚拟机,并修改其 product_uuid,保证节点 product_uuid 的唯一性。
$VMname="Master1"
$VMTemplate='C:\Users\zyang\Desktop\clusters\Template\Virtual Machines\7DA98424-4E6B-4109-B549-E062D49E842E.vmcx'
$VMPath="C:\Users\zyang\Desktop\clusters\$VMname"
## 使用虚拟机模板克隆新的虚拟机
Import-VM -Path $VMTemplate -VirtualMachinePath $VMPath -VhdDestinationPath $VMPath -SnapshotFilePath $VMPath -SmartPagingFilePath $VMPath -GenerateNewId -Copy
Get-VM | Where-Object { $_.Name -eq 'Template' -and $_.Path -eq $VMPath } | Rename-VM -NewName $VMname -Passthru
## 修改克隆出来的虚拟机的UUID
$vmx = Get-WmiObject -Namespace root\virtualization\v2 -Class msvm_virtualsystemsettingdata
# 每次操作选择一台虚拟机
$CurrentSettingsData = $vmx | Where-Object { $_.ElementName -eq $VMname }
# 检查一下老的GUID
$CurrentSettingsData.BIOSGUID
# 生成新GUID
$GUID = [System.Guid]::NewGuid()
# 重新写入GUID,注意要带{},这是非常重要的细节
$CurrentSettingsData.BIOSGUID = "{" + $GUID.Guid.ToUpper() + "}"
# 生成一个ModifySystemSettings的空对象
$VMMS = Get-WmiObject -Namespace root\virtualization\v2 -Class msvm_virtualsystemmanagementservice
$ModifySystemSettingsParams = $VMMS.GetMethodParameters('ModifySystemSettings')
# 配置这个属性,需要特殊的转换方式
$ModifySystemSettingsParams.SystemSettings = $CurrentSettingsData.GetText([System.Management.TextFormat]::CimDtd20)
# 写入
$VMMS.InvokeMethod('ModifySystemSettings', $ModifySystemSettingsParams, $null)
为节点配置静态 ip 地址
- 新建一个内部虚拟交换机
- 在宿主机上配置 TCP/IPv4
控制面板找到新建的虚拟网卡
为每一个虚拟机添加新建的内部虚拟交换机
此时有了两张网卡,Default Switch用于连接外网,k8s用于虚拟机之间通信。
为了让虚拟机上 K8s 网卡生效,还需修改网络执行计划。
$ hostnamectl set-hostname master1
$ sudo cp /etc/netplan/50-cloud-init.yaml /etc/netplan/00-installer-config.yaml
$ sudo cat /etc/netplan/00-installer-config.yaml
network:
ethernets:
eth0:
dhcp4: true
eth1:
dhcp4: false
addresses:
- 192.168.100.100/24
version: 2
$ netplan apply
使用 kubeadmin 安装 K8s
$ kubeadm config print init-defaults > kubeadm-config.yaml
localAPIEndpoint:
advertiseAddress: 192.168.100.100 #指定master节点的IP地址
bindPort: 6443
networking:
dnsDomain: cluster.local
podSubnet: "10.244.0.0/16"
serviceeSubnet: 10.96.0.0/16
$ kubeadm init --config=kubeadm-config.yaml | tee kubeadm-init.log
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
$ kubeadm join 192.168.100.100:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1c1a747e707ca147344c703c2eb3bd6a1ca00a036f2024533048cea47ea451c8
安装网络插件
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
安装dashboard ui
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
TODO:
- 使用ipvs
- 高可用性