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

相关推荐
cyber_两只龙宝2 小时前
【Oracle】Oracle之DQL中SELECT的基础使用
linux·运维·服务器·数据库·云原生·oracle
悠悠121383 小时前
K8s持久化存储深度解析:PV、PVC、StorageClass三剑客的生产实战
云原生·容器·kubernetes
FJW0208143 小时前
Kubernetes自动化巡检脚本(Python)
容器·kubernetes·自动化
格林威3 小时前
AI视觉项目部署:Docker 部署视觉服务可行性分析
linux·运维·人工智能·数码相机·docker·容器·工业相机
江湖有缘3 小时前
极简部署Radicale:Docker快速搭建自托管日历 / 联系人服务
运维·docker·容器
❀͜͡傀儡师3 小时前
基于Docker的LLaMA-Factory全流程部署指南
docker·容器·llama
架构师老Y12 小时前
008、容器化部署:Docker与Python应用打包
python·容器·架构
handsomestWei16 小时前
Docker引擎API接入配置
运维·http·docker·容器·api