基于Multipass从零搭建k8s集群
笔者目前使用的Mac,但又很想从零搭建一整套较为完整的 kubernetes 集群(基于kubeadm),多番尝试后最终选定 multipass,且成功完成k8s集群搭建。
mac版本 Sonoma 14.5、multipass版本1.9.0+mac、Ubuntu 24.04 LTS、k8s v1.30.3。
一、安装multipass
1、下载安装
# 安装 multipass
brew install multipass
# 启动三台2c4g,磁盘20G机器
multipass launch -n k8s-master -c 2 -m 4G -d 20G
multipass launch -n k8s-worker1 -c 2 -m 4G -d 20G
multipass launch -n k8s-worker2 -c 2 -m 4G -d 20G
# 进入shell
multipass shell k8s-master
multipass shell k8s-worker1
multipass shell k8s-worker2
# 重启节点
multipass restart k8s-master
multipass restart k8s-worker1
multipass restart k8s-worker2
2、必备设置
# 挂载目录,避免文件与宿主机之间的来回复制
multipass mount /home/k8s k8s-master:/home/k8s
# 禁止交换分区,k8s硬性要求,为了确保容器的性能和稳定性
swapoff -a
#
https://bugs.launchpad.net/ubuntu/+source/containerd-app/+bug/2065423
3、禁用AppArmor
在 Ubuntu 24.04 LTS,AppArmor存在bug,这一步bug会导致k8s组件无限重启,不能正常运行。详见(别问我为什么知道,卡了我好几天,这东西太底层了):
- https://bugs.launchpad.net/ubuntu/+source/containerd-app/+bug/2065423
- https://github.com/containerd/containerd/pull/10123
# 查看apparmor是否启用
cat /sys/module/apparmor/parameters/enabled
# https://wiki.debian.org/zh_CN/AppArmor/HowToUse#A.2BaMBn5V9TUk1ytmAB-
# AppArmor是一种安全机制,不建议禁用它。如果您确实需要在系统上禁用AppArmor,请执行以下操作:
mkdir -p /etc/default/grub.d
echo 'GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT apparmor=0"' \
| sudo tee /etc/default/grub.d/apparmor.cfg
sudo update-grub
sudo reboot
ubuntu@k8s-master:~$ apt list --upgradable
Listing... Done
apparmor/noble-updates 4.0.1really4.0.0-beta3-0ubuntu0.1 amd64 [upgradable from: 4.0.1-0ubuntu0.24.04.2]
如果不禁用,那么你可能看到如下报错日志
# vi /var/log/syslog
# 查看系统日志
2024-07-25T17:53:47.223203+08:00 k8s-master containerd[712]: time="2024-07-25T17:53:47.222954220+08:00" level=info msg="Skipping the sending of signal terminated to container \"411e1b77d209151937b61dccb652136d32cea930842b48628b663200959de121\" because a prior stop with timeout>0 request already sent the signal"
2024-07-25T17:53:56.247670+08:00 k8s-master kernel: audit: type=1400 audit(1721901236.246:756): apparmor="DENIED" operation="signal" class="signal" profile="cri-containerd.apparmor.d" pid=34609 comm="runc" requested_mask="receive" denied_mask="receive" signal=kill peer="runc"
2024-07-25T17:53:56.252118+08:00 k8s-master containerd[712]: time="2024-07-25T17:53:56.250606971+08:00" level=error msg="StopContainer for \"03e1f3ea88663a6570b71bd18f2f7277b2479f916d65293f72a8d2ba70d3eac2\" failed" error="failed to kill container \"03e1f3ea88663a6570b71bd18f2f7277b2479f916d65293f72a8d2ba70d3eac2\": unknown error after kill: runc did not terminate successfully: exit status 1: unable to signal init: permission denied\n: unknown"
2024-07-25T17:53:56.252968+08:00 k8s-master kubelet[17203]: E0725 17:53:56.251069 17203 remote_runtime.go:366] "StopContainer from runtime service failed" err=<
2024-07-25T17:53:56.253206+08:00 k8s-master kubelet[17203]: #011rpc error: code = Unknown desc = failed to kill container "03e1f3ea88663a6570b71bd18f2f7277b2479f916d65293f72a8d2ba70d3eac2": unknown error after kill: runc did not terminate successfully: exit status 1: unable to signal init: permission denied
一般般帅