ubuntu搭建k8s 1.35版本

前言

本文基于 Ubuntu 24.04 + Kubernetes 1.35.3 实战整理,从零搭建一套可用的 Kubernetes 集群环境。

k8s 在 1.24 之后正式移除了对 Docker 的支持,默认采用 containerd 作为容器运行时。本教程将基于 containerd 进行部署,并对国内环境下常见的镜像拉取问题做了优化(镜像加速、pause 镜像替换等)。

整篇内容覆盖以下关键点:

  • containerd 正确配置(包括 SystemdCgroup)
  • kubeadm 初始化配置优化
  • 国内镜像源替换
  • 网络插件 Flannel 安装
  • Node 节点加入集群

适合人群:

  • 想快速搭一套可用 k8s 环境的人
  • 被各种初始化失败折磨过的人
  • 不想在 pause 镜像上浪费人生 2 小时的人

开始安装

1. 关闭swap

bash 复制代码
# k8s 要求关闭 swap,否则 kubelet 会直接拒绝启动
swapoff -a
sed -i 's|^/swap.img|#/swap.img|' /etc/fstab
rm -f /swap.img

查看一下,确保已经注释了

bash 复制代码
grep swap /etc/fstab

2. 加载内核模块

bash 复制代码
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

3. 设置sysctl

bash 复制代码
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 --system

4. 安装容器运行时

bash 复制代码
apt install -y containerd

5. 生成配置

bash 复制代码
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml

6. 修改关键配置

bash 复制代码
# 使用 systemd 作为 cgroup 驱动(必须和 kubelet 保持一致)
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 替换 pause 镜像(国内必须改,否则 kubeadm init 大概率卡死)
sed -i 's|sandbox_image = "registry.k8s.io/pause:3.8"|sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10.1"|' /etc/containerd/config.toml

7. 启动服务

bash 复制代码
systemctl restart containerd
systemctl enable containerd

8. 添加阿里云源(懂的都懂)

bash 复制代码
mkdir -p /etc/apt/keyrings

curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/deb/Release.key \
| sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \
https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/deb/ /" \
| sudo tee /etc/apt/sources.list.d/kubernetes.list

apt update

9. 安装组件

bash 复制代码
apt install -y kubelet=1.35.3-* kubeadm=1.35.3-* kubectl=1.35.3-*

10. 锁版本(防止系统突然"帮你升级")

bash 复制代码
apt-mark hold kubelet kubeadm kubectl

11. 设置主机名

bash 复制代码
hostnamectl set-hostname k8s-master

12. 配置hosts

bash 复制代码
cat >> /etc/hosts << EOF
192.168.200.155 k8s-master
192.168.200.156 k8s-node1
EOF

这里的ip根据你自身情况配置,不要照抄,如果你只有一个master节点,那就把node1去掉就行了

13. 生成配置文件

bash 复制代码
kubeadm config print init-defaults > kubeadm.yaml

14. 修改配置

bash 复制代码
sed -i 's/advertiseAddress: .*/advertiseAddress: 192.168.200.155/' kubeadm.yaml
sed -i 's#imageRepository: .*#imageRepository: registry.aliyuncs.com/google_containers#' kubeadm.yaml
sed -i 's/^\s*name: .*$/  name: k8s-master/' kubeadm.yaml
sed -i 's/kubernetesVersion: .*/kubernetesVersion: v1.35.3/' kubeadm.yaml
sed -i '/serviceSubnet/a\  podSubnet: 10.244.0.0/16' kubeadm.yaml

注意:这里的192.168.200.155是你master节点的ip,根据你自身情况配置,不要照抄

15. 提前拉取镜像

bash 复制代码
kubeadm config images pull \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.35.3

我们可以通过cri工具,看一下镜像拉取成功了没有

bash 复制代码
crictl images

16. 初始化

bash 复制代码
kubeadm init --config kubeadm.yaml

初始化完成后,会有一串join命令,把这个记下来,一会儿node节点加入集群的时候会用到

很多人卡在这一步,一直初始化失败,需要检查一下/etc/containerd/config.toml里的pause镜像地址,是否已经改成了阿里云,而不是registry.k8s.io

17. 配置kubectl

bash 复制代码
mkdir -p ~/.kube
cp /etc/kubernetes/admin.conf ~/.kube/config
chown $(id -u):$(id -g) ~/.kube/config

这时候执行kubectl get no看下节点状态,会看到k8s-master这个节点处于NotReady状态,原因是因为没有安装网络插件,所以还用不了

18. 安装网络插件flannel

bash 复制代码
# 下载
curl -O https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# 替换镜像源
sed -i 's|ghcr.io|ghcr.nju.edu.cn|g' kube-flannel.yml
# 部署
kubectl apply -f kube-flannel.yml

这时候我们需要等待部署完成,我们可以kubectl get po -A,来查看安装状态,当这3个的ready状态都是1/1的时候,就说网络插件安装完成了

这时候我们再查看节点状态,就会变成Ready了

到这里,k8s的master节点就安装完成了,接下来就是node节点的初始化和加入了

以下内容是node节点的操作,不是master节点的操作

19. node节点准备

在 Node 节点上重复以上1-10的步骤

20. 设置主机名

bash 复制代码
hostnamectl set-hostname k8s-node1

注意,这里的hostname是k8s-node1,而不是刚刚的k8s-master

21. 设置hosts

bash 复制代码
cat >> /etc/hosts << EOF
192.168.200.155 k8s-master
192.168.200.156 k8s-node1
EOF

22. 加入集群

这里的命令是刚刚master节点初始化时,控制台打印的命令

bash 复制代码
kubeadm join 192.168.200.155:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:bb656d8e6b6e0b2ea38c48c40d396351d45a8a3b991d3ecb28f016fe83068322

如果不小心关掉了窗口,可以通过kubeadm token create --print-join-command来查看命令

23. 节点配置kubectl

这时候node节点还用不了kubectl,需要先创建文件夹

bash 复制代码
mkdir -p ~/.kube

然后在master上执行,把配置文件复制到node节点去

bash 复制代码
scp /etc/kubernetes/admin.conf root@node-ip:/root/.kube/config

这时候回到node节点,就可以正常使用kubectl了

一个基于 Ubuntu 24.04 + containerd 的 Kubernetes 集群就已经搭建完成了

相关推荐
林浅不想努力9 小时前
LVS知识点总结
服务器·云原生·lvs
极客先躯12 小时前
高级java每日一道面试题-2026年05月03日-实战篇[Docker]-如何实现容器化环境的数据加密?
java·运维·docker·容器·金融·加解密·高级面试
ChaITSimpleLove15 小时前
SimpleIdServer 6.0.4 Docker Compose 实战部署指南
运维·docker·容器·身份认证·id-server·simpleidserver
阿里云云原生16 小时前
将内核专家经验封装进 Agent:SysOM 巡检 Skill 开源,赋能你的运维自动化闭环
云原生
自律懒人17 小时前
AI应用从原型到上线的最后一公里——灵光闪应用一键部署深度实测,30+免费API + Serverless零配置发布
人工智能·云原生·开源·serverless
程序喵大人17 小时前
【C++进阶】STL容器与迭代器 - 05 map 和 set 为什么按键保持有序
开发语言·c++·容器·迭代器·stl
风曦Kisaki18 小时前
Kubernetes(K8s)笔记Day03: Pod命名空间,标签,Pod 的调度,污点与容忍度,Pod 常见状态和重启策略,Pod 生命周期
linux·运维·笔记·docker·云原生·容器·kubernetes
张忠琳19 小时前
【NVIDIA】NVIDIA k8s-device-plugin v0.19.3 资源管理器模块深度分析之三
云原生·容器·架构·kubernetes·nvidia
Chengbei1120 小时前
云安全漏洞挖掘SKILL、一站式云漏洞挖掘工具,支持S3爆破、IMDS探测、K8s检测与AK/SK权限利用
前端·人工智能·网络安全·云原生·容器·kubernetes·系统安全
Ai拆代码的曹操1 天前
K8s 调度器 predicate 阶段揭秘:为什么你的 Pod 总是堆在同一台机器
后端·容器