侧边栏壁纸
博主头像
帆云素材 博主等级

苟利国家生死以,岂因祸福避趋之

  • 累计撰写 26 篇文章
  • 累计创建 26 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

Ubuntu 24.04 安装 kubernetes最新版[v1.32.2]完整教程

智慧的格子衫
2025-02-26 / 1 评论 / 0 点赞 / 64 阅读 / 0 字

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 的网络流量管理可能无法正常工作。

作用

  1. br_netfilter 让 Linux 处理桥接网络流量时应用 iptables 规则
    • Kubernetes 依赖 iptables 进行网络策略、NAT 和转发规则的管理。默认情况下,Linux 不会对网桥流量(bridge traffic)应用 iptables 规则,因此需要手动启用。
  2. 启用 IPv4 转发
    • 默认情况下,Linux 可能不允许 IPv4 转发(net.ipv4.ip_forward=1)。但 Kubernetes 依赖 IP 转发功能,确保 Pod 网络可以跨节点通信。

参数

参数 作用
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
  1. 找到并修改如下内容:

    • 启用 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 节点需要安装 kubeadmkubeletkubectl

Node 节点,需要安装 kubeadmkubelet

安装 kubeadmkubeletkubectl(确保版本一致):

以下指令适用于 Kubernetes 1.32

  1. 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包
# 更新软件包索引
sudo apt-get update
# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
  1. 下载用于 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
  1. 添加 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
  1. 更新 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

之后就可以看到执行成功的命令

而且他还提示你接下来需要执行的操作

hb1m3q-2.png

参数详解

参数 说明 是否需要修改
apiVersion 配置文件版本
kind: InitConfiguration kubeadm 初始化配置
nodeRegistration.name 当前 Master 节点名称 ✅ (可修改)
criSocket 容器运行时 socket 地址(containerddocker)默认使用 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

node1node2kubectl get nodes 输出中,ROLES 显示为空,这是正常的,只是它们还没有被赋予特定的角色

默认情况下,kubeadm join 只是将它们加入集群为 Worker 节点,并不会自动分配角色。节点可以正常运行 Pod,不会影响集群功能。

如果你希望 kubectl get nodes 结果中显示 worker,可以给 node1node2 添加 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

重启 kubeletcontainerd

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 状态,说明加入成功!

0

评论区