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 集群就已经搭建完成了

相关推荐
运维老郭5 小时前
【K8s运维实战】Kubernetes临时存储卷实战:emptyDir核心用法与gitRepo弃用迁移指南
运维·云原生·kubernetes
AAA@峥9 小时前
容器数据不丢失:Docker 分层存储 + Volume 共享、备份迁移完整指南
运维·docker·容器
十年磨一剑~10 小时前
docker 为何每次 docker tag才能 docker push
docker·容器·eureka
gs8014012 小时前
记一次多 Agent 架构在单节点 K8s 触发的 PID 耗尽与 Pod 驱逐(Evicted)大摸排
容器·架构·kubernetes
bukeyiwanshui13 小时前
20260701 k8s Metric Server
容器·贪心算法·kubernetes
江湖有缘13 小时前
基于Docker环境部署tillywork开源工作管理工具
docker·容器·开源
鸿儒51715 小时前
MR-50国产化GPU docker配置方法
docker·容器·mr
Zhu75817 小时前
在k8s集群部署ApacheHadoop单节点单数据副本
云原生·容器·kubernetes
Akamai中国17 小时前
Akamai收购安全企业浏览器提供商LayerX
人工智能·云原生·云计算·云服务