版本信息
- Proxmox Virtual Environment 8.4-1
- Ubuntu Server 20.04 LTS
- Kubernetes 1.26.3
使用 Cloud-Init 配置虚拟机模版
准备镜像
注意,这里是系统映像,不是原本的安装镜像
Ubuntu 20.04 LTS 下载地址:https://cloud-images.ubuntu.com/releases/focal/release/
下载成功后,在PVE宿主机中的/var/lib/vz/template/iso
查找到对应的镜像
制作模板虚拟机
创建时不需要添加硬盘,因为等下要导入镜像到硬盘
网卡选择 Virtio 虚拟网卡
创建好之后添加一个 Cloud-Init 设备
虚拟机创建好之后进入 PVE Shell 通过下面的命令导入镜像到硬盘:
qm importdisk 800 /var/lib/vz/template/iso/ubuntu-20.04-server-cloudimg-amd64.img local --format=qcow2
选择未使用的磁盘0(其实就是刚才添加的镜像)
选择 SCSI,然后添加即可
调整系统启动顺序,将刚才添加的SCSI:0移到第一位
调整 Cloud-Init,设置:用户、密码、IP 配置
调整硬盘大小为50G
原本的镜像就有2G左右了,因此这里我们再补充 48G
启动虚拟机看看是否能正常登录
Linux 优化
这个部分按需进行设置。
虚拟机初始化
安装CNI插件
# 在所有节点上安装 CNI 插件
sudo mkdir -p /opt/cni/bin
cd /opt/cni/bin
# 下载并安装 CNI 插件
sudo wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
sudo tar -zxvf cni-plugins-linux-amd64-v1.3.0.tgz
# 确保 CNI 目录存在
sudo mkdir -p /etc/cni/net.d/
# 重启 containerd 和 kubelet
sudo systemctl restart containerd
sudo systemctl restart kubelet
kubeadm 镜像初始化
sudo containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
sudo sed -i 's|sandbox_image = "registry.k8s.io/pause:3.8"|sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10"|g' /etc/containerd/config.toml
# 重启服务
sudo systemctl daemon-reload
sudo systemctl restart containerd
sudo systemctl restart kubelet
设置 QEMU 代理
关闭虚拟机,进入选项,打开 QEMU 代理。
再次启动虚拟机,安装qemu-guest-agent
sudo apt-get install qemu-guest-agent
sudo systemctl start qemu-guest-agent
# 配置虚拟机
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
# 通过运行以下指令确认 br_netfilter 和 overlay 模块被加载
lsmod | grep br_netfilter
lsmod | grep overlay
# 通过运行以下指令确认 net.bridge.bridge-nf-call-iptables、net.bridge.bridge-nf-call-ip6tables 和 net.ipv4.ip_forward 系统变量在你的 sysctl 配置中被设置为 1
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
# 安装 containerd
sudo apt-get update && sudo apt-get install -y containerd
# 配置 containerd
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
# 修改为 SystemdCgroup
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
cat /etc/containerd/config.toml | grep SystemdCgroup
# 配置 containerd 服务
sudo systemctl enable containerd
sudo systemctl restart containerd
sudo systemctl status containerd
安装 kubelet/kubeadm/kubectl:
这部分的内容存在时效性,如果失效,请前往 k8s 进行查阅
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl
sudo mkdir -p /etc/apt/keyrings/
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.33/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
sudo chmod 644 /etc/apt/keyrings/kubernetes-apt-keyring.gpg # allow unprivileged APT programs to read this keyring
# This overwrites any existing configuration in /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.33/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo chmod 644 /etc/apt/sources.list.d/kubernetes.list # helps tools such as command-not-found to work correctly
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
关闭虚拟机。
制作虚拟机模板
之后用这个模板克隆五个 VM 出来(一个 control-plane 控制平面,四个 worker),如下,注意是完整克隆:
最终效果
创建内部网桥
因为这里主要是用于内部的 k8s 相互发现的,而且 k8s 有设置静态地址的需求,这里就不设置网关,也不搭建 dhcp 服务器了。
创建内部子网,用于 k8s 之间的相互通信
克隆虚拟机初始化
设置内网地址
重新获取ip地址
在所有虚拟机上执行下列命令,获取 vmbr0 的 ip 地址
sudo dhclient -v
重新生成 machine-id
这个比较笨,一个一个去敲命令吧
在所有虚拟机上执行下列命令
# 删除现有的machine ID
sudo rm -f /etc/machine-id
sudo rm -f /var/lib/dbus/machine-id
# 生成新的machine ID
sudo systemd-machine-id-setup
# 重启服务
sudo systemctl restart systemd-journald
# 查看当前machine ID
cat /etc/machine-id
# 验证dbus machine ID
cat /var/lib/dbus/machine-id
# 使用systemd命令查看
hostnamectl | grep "Machine ID"
拉取镜像
在所有虚拟机上执行下列命令,拉取镜像
sudo -E kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
k8s 组网
Control-Plane
在所有 control-plane 中执行下列命令:
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository registry.aliyuncs.com/google_containers
初始化成功后,配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
安装网络插件
# 安装 flannel
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
# 查看安装状态
kubectl get pods --all-namespaces
Worker
使用刚才 control-plane 初始化之后的命令
在 Control-Plane 使用下列命令查看 k8s 集群状态
# 查看 Flannel Pod 状态
kubectl get pods -n kube-flannel
# 查看节点状态
kubectl get nodes