使用 kubeadm 搭建 Kubernetes 集群

398 阅读2分钟

准备虚拟机

使用HyperV来创建虚拟机。

首先创建HyperV虚拟机模板,用于克隆。用于虚拟机的操作系统使用 Ubuntu 24.04.1 Server LTS。

如何使用 HyperV 创建虚拟机网上已经有详细的教程,故省略这些步骤,直接展示创建的摘要信息: image.png

下面的 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

在虚拟机中安装操作系统,在安装前,需禁用安全启动。 image.png

接着启动虚拟机进入 Ubuntu 的安装流程。

准备 K8s 运行环境

  1. 禁用交换分区
$ 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

image.png

  1. 安装容器运行时 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
  1. 配置 systemd cgroup 驱动
$ sudo mkdir /etc/containerd
$ containerd config default > /etc/containerd/config.toml
$ sudo systemctl restart containerd

image.png

  1. 启用 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
  1. 安装 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
  1. 检查所需端口
nc 127.0.0.1 6443 -v
  1. 修改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修改Hyper-V虚拟机的UUID

下面的 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 地址

hyper-v ubuntu2204指定静态ip地址

  1. 新建一个内部虚拟交换机

image.png

image.png

  1. 在宿主机上配置 TCP/IPv4

控制面板找到新建的虚拟网卡

image.png

为每一个虚拟机添加新建的内部虚拟交换机

image.png

此时有了两张网卡,Default Switch用于连接外网,k8s用于虚拟机之间通信。

为了让虚拟机上 K8s 网卡生效,还需修改网络执行计划。

image.png

$ 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
  • 高可用性