Ubuntu 24.04 安装 kubernetes最新版[v1.32.2]完整教程
1. 准备工作
环境要求
推荐准备3台服务器(or 虚拟机),搭建一主两从架构
- 服务器要求(Master/Node 节点):
- 最低 2 核 CPU
- 2GB 以上内存(最好4GB)
- 20GB 以上磁盘空间(建议最少40GB,20GB只够k8s本身的基础服务)
配置虚拟机、Ubuntu开启root账号ssh权限,和安装docker的方式,可以查看
Win11安装Linux子系统(WSL2)完整配置
Ubuntu安装Docker、Docker compose
服务器环境配置
🚀 注意:下方操作必须在所有节点都执行一遍
修改主机名(建议)
每个节点执行一个
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2
关闭 swap(必须)
swapoff -a
sed -i '/swap/d' /etc/fstab
Kubernetes 需要确保调度的 Pod 运行在资源可预测的环境下,而 swap(交换空间)可能导致内存分配不稳定。因此,Kubernetes 要求禁用 swap,保证节点上的内存管理更加稳定。
关闭防火墙(可选)
建议关闭以避免端口问题
systemctl stop firewalld && systemctl disable firewalld
配置内核参数(必须)
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
cat <<EOF | 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
br_netfilter必须配置,否则 Kubernetes 的网络流量管理可能无法正常工作。
作用
br_netfilter让 Linux 处理桥接网络流量时应用 iptables 规则- Kubernetes 依赖
iptables进行网络策略、NAT 和转发规则的管理。默认情况下,Linux 不会对网桥流量(bridge traffic)应用iptables规则,因此需要手动启用。
- Kubernetes 依赖
- 启用 IPv4 转发
- 默认情况下,Linux 可能不允许 IPv4 转发(
net.ipv4.ip_forward=1)。但 Kubernetes 依赖 IP 转发功能,确保 Pod 网络可以跨节点通信。
- 默认情况下,Linux 可能不允许 IPv4 转发(
参数
| 参数 | 作用 |
|---|---|
overlay |
必须的内核模块,支持容器的存储层 |
br_netfilter |
让 iptables 能够处理桥接网络的流量 |
net.bridge.bridge-nf-call-iptables=1 |
让 iptables 过滤桥接网络的 IPv4 流量 |
net.bridge.bridge-nf-call-ip6tables=1 |
让 iptables 过滤桥接网络的 IPv6 流量 |
net.ipv4.ip_forward=1 |
允许 IP 数据包的转发(K8s 跨节点通信必需) |
配置containerd(建议)
🚀 注意:如果用containerd做为k8s的容器,必须配置
- 确保主机已经安装了
containerd,并确保containerd正在运行
systemctl status containerd
如果没有安装,可以参考如下文章,安装完docker之后,会自带containerd,并且服务器使用Docker的情况较多,推荐直接安装docker
Ubuntu安装Docker、Docker compose
- 修改 containerd 配置文件
生成默认配置:
containerd config default | tee /etc/containerd/config.toml
编辑 /etc/containerd/config.toml:
vi /etc/containerd/config.toml
-
找到并修改如下内容:
-
启用 CRI 插件(确保
[plugins."io.containerd.grpc.v1.cri"]没有被注释) -
修改
SystemdCgroup = true(重要!否则 K8s 可能不兼容) -
修改
sandbox_image- 把
sandbox_image = "k8s.gcr.io/pause:3.8"修改成sandbox_image = "registry.k8s.io/pause:3.10" - k8s 版本为1.32.2,对应 pause:3.10
- 把
-
在如下位置
[plugins."io.containerd.grpc.v1.cri"] ... sandbox_image = "registry.k8s.io/pause:3.10" [plugins."io.containerd.grpc.v1.cri".containerd] default_runtime_name = "runc" [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] runtime_type = "io.containerd.runc.v2" [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] SystemdCgroup = true
-
重启 containerd
systemctl restart containerd
配置 crictl.yaml(必须)
需要手动指定 containerd 的 CRI socket,配置 containerd 连接k8s
创建或编辑 /etc/crictl.yaml 文件:
cat <<EOF | tee /etc/crictl.yaml
runtime-endpoint: "unix:///run/containerd/containerd.sock"
EOF
重启 containerd
systemctl restart containerd
2.安装kubeadm
Master 节点需要安装 kubeadm、kubelet、kubectl
Node 节点,需要安装 kubeadm、kubelet
安装 kubeadm、kubelet、kubectl(确保版本一致):
以下指令适用于 Kubernetes 1.32
- 更新
apt包索引并安装使用 Kubernetesapt仓库所需要的包
# 更新软件包索引
sudo apt-get update
# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
- 下载用于 Kubernetes 软件包仓库的公共签名密钥。所有仓库都使用相同的签名密钥,因此你可以忽略URL中的版本:
# 如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
- 添加 Kubernetes
apt仓库。 请注意,此仓库仅包含适用于 Kubernetes 1.32 的软件包; 对于其他 Kubernetes 次要版本,则需要更改 URL 中的 Kubernetes 次要版本以匹配你所需的次要版本
# 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置。
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
- 更新
apt包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:
Master节点需要安装 kubectl
# Master节点
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
# 锁定版本
sudo apt-mark hold kubelet kubeadm kubectl
node节点不需要安装 kubectl
sudo apt-get update
sudo apt-get install -y kubelet kubeadm
# 锁定版本
sudo apt-mark hold kubelet kubeadm
3. 使用 kubeadm 创建集群
🚀 注意:此操作只需要在Master节点执行
一、创建kubeadm-config.yaml 配置文件,写入如下内容:
# k8s 集群配置
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
# 安装的 Kubernetes 版本
kubernetesVersion: 1.32.0
# 单主节点可修改为主节点的 IP,端口不要修改
# 多主节点 应设置为 VIP 或负载均衡地址
controlPlaneEndpoint: 192.168.204.128:6443
networking:
# 指定pod网段
podSubnet: 10.244.0.0/16
# 指定Service网段
serviceSubnet: 10.96.0.0/12
etcd:
local:
dataDir: "/var/lib/etcd"
controllerManager: {}
scheduler: {}
---
# kubeadm 初始化配置
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
# 控制当前 master 节点上的 kube-apiserver 监听 IP 和端口,只影响当前节点。
localAPIEndpoint:
# 设为当前master节点ip地址
advertiseAddress: 192.168.204.128
bindPort: 6443
nodeRegistration:
# 你的主节点名称
name: "master"
# containerd 的默认 socket
criSocket: "unix:///run/containerd/containerd.sock"
taints: null
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: "systemd"
---
# kube-proxy 配置
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
# 采用 IPVS 模式(更高效)
mode: "ipvs"
二、使用配置文件,初始化集群
初始化集群之前,可以先执行预检,检验环境是否还有其他问题。
kubeadm init phase preflight --config kubeadm-config.yaml
会提示你可以先将k8s需要的镜像拉取下来
kubeadm config images pull
如果没有问题了,就可以执行初始化命令,初始化集群
kubeadm init --config=kubeadm-config.yaml --upload-certs
之后就可以看到执行成功的命令
而且他还提示你接下来需要执行的操作

参数详解
| 参数 | 说明 | 是否需要修改 |
|---|---|---|
apiVersion |
配置文件版本 | ❌ |
kind: InitConfiguration |
kubeadm 初始化配置 | ❌ |
nodeRegistration.name |
当前 Master 节点名称 | ✅ (可修改) |
criSocket |
容器运行时 socket 地址(containerd、docker)默认使用 containerd 作为 CRI |
✅ |
kind: ClusterConfiguration |
集群配置 | ❌ |
kubernetesVersion |
Kubernetes 版本 | ✅ (和 kubeadm 版本保持一致) |
controlPlaneEndpoint |
用于 HA 部署时,填写 负载均衡 VIP,如果是单节点,可以直接填 master 节点 IP。 |
✅ |
networking.podSubnet |
Pod 网络地址范围 | ✅(需要和 CNI 配置匹配) |
apiServer.certSANs |
允许的 API Server 访问地址 | ✅(如果有 VIP 或主机名,需要加上) |
kind: KubeProxyConfiguration |
kube-proxy 配置 | ❌ |
mode: ipvs |
kube-proxy 模式,推荐 ipvs |
✅ |
cgroupDriver |
K8s 1.22+ 版本默认使用 systemd |
❌ (不建议修改) |
4. 完成k8s集群搭建
接下来,你需要完成 几个关键步骤 来让 Kubernetes 集群正常工作:
1. 配置 kubectl 访问集群
配置kubectl的配置文件,相当于对kubectl进行授权,这样kubectl命令可以使用此证书对k8s集群进行管理
所有控制节点创建成功后 均执行此命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
然后测试 kubectl 是否能正常连接集群:
kubectl get nodes
如果输出 NotReady,表示还需要部署 网络插件。
例:
root@master:~# export KUBECONFIG=/etc/kubernetes/admin.conf
root@master:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 6m10s v1.32.2
2. 部署 Pod 网络插件
Kubernetes 默认不包含 CNI(容器网络接口)插件,你需要选择一个来管理 Pod 网络。
选择使用 Calico 网络插件,相比于 Flannel 更高效
这里k8s 集群的版本是 v1.32.2,对应 Calico 的版本是 v3.29.2
其他版本对照参照:System requirements | Calico Documentation
文件地址是 https://raw.githubusercontent.com/projectcalico/calico/<版本号>/manifests/calico.yaml
wget -O calico.yaml https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/calico.yaml
kubectl apply -f calico.yaml
之后,检查网络插件是否正常运行:
kubectl get pods -n kube-system
等待 calico-node 的 Pod 变为 Running 状态。
状态变化:Pending --> Init:0/3 --> Running ;这个过程可能需要数分钟时间
3. 添加Node节点
确保已经在 Node 节点上安装了 kubelet 和 kubeadm,并且 kubelet 是自启动的
sudo systemctl enable --now kubelet
在 192.168.204.129 和 192.168.204.130 分别执行如下命令,就是在Master节点安装完成之后提示的命令
kubeadm join 192.168.204.128:6443 --token emjun9.wvgusblbismxmczb \
--discovery-token-ca-cert-hash sha256:93811b04fda229a7560da0473bae1515d4f54f3f6ac9c074177e90b249ab46be
如果没有保存命令,可以在master节点执行命令,重新生成
kubeadm token create --print-join-command
4. 验证集群是否正常运行
执行以下命令,确认所有节点和组件都 Ready:
kubectl get nodes
kubectl get pods -n kube-system
如果所有 Node 变成 Ready,并且 kube-system 里的 Pod 状态都变为 Running,说明 Kubernetes 集群已经完全运行 🎉!
刚加入集群时,可能会有 calico-node 在初始化状态中,等待即可
🚀 完成后,你的 Kubernetes 集群就有 1 Master + 2 Node,正式可用了! 🎉
可选
root@master:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 33m v1.32.2
node1 Ready <none> 12s v1.32.2
node2 Ready <none> 2m58s v1.32.2
node1 和 node2 在 kubectl get nodes 输出中,ROLES 显示为空,这是正常的,只是它们还没有被赋予特定的角色。
默认情况下,kubeadm join 只是将它们加入集群为 Worker 节点,并不会自动分配角色。节点可以正常运行 Pod,不会影响集群功能。
如果你希望 kubectl get nodes 结果中显示 worker,可以给 node1 和 node2 添加 worker 角色:
kubectl label node node1 node-role.kubernetes.io/worker=
kubectl label node node2 node-role.kubernetes.io/worker=
然后再运行:
kubectl get nodes
现在 ROLES 列会显示 worker。
错误处理
如果在执行 kubeadm join 中遇到错误,可以排查问题,并尝试重新加入。
1️⃣ 确保 containerd 运行
在 Node 节点执行:
sudo systemctl restart containerd
sudo systemctl enable containerd
sudo systemctl status containerd
然后检查日志:
journalctl -u containerd --no-pager | tail -n 20
2️⃣ 检查 containerd CRI 配置
Kubernetes 需要 containerd 作为 容器运行时(CRI),确保 containerd 正确配置了 CRI 插件。
具体查看文章中 配置containerd 和 配置 crictl.yaml 章节
然后再尝试 kubeadm join。
3️⃣ 重置kubeadm,清理旧配置
**一、在 master 节点(192.168.204.128)上删除旧的节点 **
哪个错误就删除哪个,node1 是节点名称
kubectl delete node node1
二、在 node1 上执行以下命令,清理 kubeadm 残留数据:
kubeadm reset -f
如果遇到 iptables 规则未清理的问题,可执行:
iptables -F && iptables -X && iptables -t nat -F && iptables -t nat -X
删除 /etc/kubernetes 目录(如果 reset 之后仍然存在)
rm -rf /etc/kubernetes
rm -rf /var/lib/kubelet
rm -rf /etc/cni/net.d
重启 kubelet 和 containerd
systemctl restart containerd
systemctl restart kubelet
三、重新加入 node1
kubeadm join 192.168.204.128:6443 --token emjun9.wvgusblbismxmczb \
--discovery-token-ca-cert-hash sha256:93811b04fda229a7560da0473bae1515d4f54f3f6ac9c074177e90b249
验证节点加入情况
回到 master 执行:
kubectl get nodes
如果 node1 显示 Ready 状态,说明加入成功!
评论区