PVE 安装 k8s


版本信息

  • 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 之间的相互通信

克隆虚拟机初始化

设置内网地址

image-20250615000834929

image-20250615000900059

重新获取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

参考资料


如果本文帮助到了你,帮我点个广告可以咩(o′┏▽┓`o)


评论
  目录