1. kubeadm、kubelet、kubectl 安装
参考官方文档:https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
2. 安装 containerd
2.1 解压安装包,设置 systemd
参考官方文档:https://github.com/containerd/containerd/blob/main/docs/getting-started.md
- 从 https://github.com/containerd/containerd/releases 下载最新的安装包解压到本地。
tar Cxzvf /usr/local/ containerd-2.2.1-linux-amd64.tar.gz bin/ bin/containerd-shim-runc-v2 bin/containerd-shim bin/ctr bin/containerd-shim-runc-v1 bin/containerd bin/containerd-stress
如果计划通过 systemd 启动 containerd,还需从以下地址下载 unit 文件并放置到 /usr/local/lib/systemd/system/containerd.service:
https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
然后执行以下命令:
systemctl daemon-reload
systemctl enable --now containerd
2.2 安装 runc
根据官方文档要求执行:
install -m 755 runc.amd64 /usr/local/sbin/runc
2.3 安装 CNI 插件
mkdir -p /opt/cni/bin
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.9.0.tgz
结果示例:
./ ./bandwidth ./host-device ./LICENSE ./loopback ./ptp ./vrf ./tuning ./host-local ./static ./tap ./bridge ./README.md ./macvlan ./firewall ./dummy ./sbr ./ipvlan ./portmap ./dhcp ./vlan
3. 使用 cgroup v2
修改 /etc/containerd/config.toml 文件内容如下:
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc]
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc.options]
SystemdCgroup = true
由于 cgroups v1 support is deprecated and will be removed in a future release.,我们需要启用 cgroups v2。参考文档:https://kubernetes.io/zh-cn/docs/concepts/architecture/cgroups/
首先使用 stat -fc %T /sys/fs/cgroup/ 查看当前系统使用的 cgroup 版本。对于 CGroup v1 输出 tmpfs;对于 CGroup v2 输出 cgroup2fs。
当前输出为 tmpfs,需要在 /etc/default/grub 的 GRUB_CMDLINE_LINUX 中添加 systemd.unified_cgroup_hierarchy=1,然后执行下面的命令(不同发行版有所不同):

# Debian/Ubuntu(默认已安装)
sudo update-grub
# CentOS/RHEL 7+
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
# Fedora(UEFI 模式)
sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
# Arch Linux
sudo grub-mkconfig -o /boot/grub/grub.cfg
重启操作系统:
sudo reboot
再次执行 stat -fc %T /sys/fs/cgroup/,发现输出变成 cgroup2fs。

4. 集群部署
4.1 第一个 master 节点
先看下文章最后的注意点 1
使用下面的命令。control-plane-endpoint 是负载均衡器的访问地址,可以暂时使用某个 master 节点 IP。
kubeadm init \
--control-plane-endpoint=11.50.138.91:6443 \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version=v1.35.0 \
--pod-network-cidr=10.244.0.0/16
等待组件都就绪,然后执行:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
然后可以使用 kubectl 命令了。
4.2 增加控制面节点
在第一个 master 节点上生成认证密钥:
kubeadm init phase upload-certs --upload-certs
结果如下:
[root@mengshi3-apack-node01 ~]# kubeadm init phase upload-certs --upload-certs
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key: 2921c3475df1449711486d503a7202f5d2a97126f416dd4627c35a52faf5db0d
然后生成添加控制面节点的命令:
kubeadm token create --print-join-command --certificate-key 2921c3475df1449711486d503a7202f5d2a97126f416dd4627c35a52faf5db0d
会生成下面的命令。在需要加进来的节点机器上执行,即可把节点作为控制面节点加入 k8s 集群:
kubeadm join 11.50.138.91:6443 --token wicgtt.nc2z5fj7cqa2ypah --discovery-token-ca-cert-hash sha256:2ffcfac3c76d84c0aceff773e9ec8a7a59155f721eeaaa024df1f055abfe4c96 --control-plane --certificate-key 2921c3475df1449711486d503a7202f5d2a97126f416dd4627c35a52faf5db0d
4.3 calico 安装
上面的组件装完之后,节点状态是 NotReady,这时候,需要安装网络插件以支持集群的节点间网络通信,常见的插件有 flannel 和 calico,对于简单的小集群可以使用 flannel,这里我们选择功能更强的 calico。
然后 Node Ready,集群部署成功。

这是 calico 的 yaml 文件,可以修改镜像地址之后 apply 到集群。安装完了之后,观察组件状态是否全部 Running。

https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
注意点
1. registry.k8s.io/pause:3.10.1 镜像
需要在 containerd 的 k8s.io ns 下放一个 registry.k8s.io/pause:3.10.1 镜像,在拉起核心组件的时候需要。但我们无法直接访问这个仓库,所以可能需要 tag 一下。使用下面的命令:
ctr -n k8s.io images tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.10.1 registry.k8s.io/pause:3.10.1
2. 可用的镜像站点
https://gist.github.com/y0ngb1n/7e8f16af3242c7815e7ca2f0833d3ea6
docker.m.daocloud.io

