LOADING
1095 字
5 分钟
K8S部署
2026-10-06
教程
/
手顺
部署

📋 前置准备:系统、网络与主机规划

OS:Ubuntu 24.04

节点主机名IP 地址
Masterk8s-master192.168.56.52
Nodek8s-node1192.168.56.53

🔧 第一阶段:所有节点共同执行

1. 更新系统并安装基础依赖

Terminal window
sudo apt update && sudo apt upgrade -y
sudo apt install -y apt-transport-https ca-certificates curl gpg

2. 禁用 Swap

Kubernetes 要求必须关闭 Swap:

Terminal window
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
sudo sed -i '/swap.img/ s/^/#/' /etc/fstab

验证:

Terminal window
free -h

若 Swap 行的值均为 0,说明已关闭

3. 加载内核模块并设置 sysctl 参数

Terminal window
# 立即加载内核模块
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置开机自动加载
cat <<EOF | sudo tee /etc/modules-load.d/kubernetes.conf
overlay
br_netfilter
EOF
# 设置网络转发参数
sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 生效
sudo sysctl --system

4. 安装并配置 containerd

Kubernetes 1.33 要求使用 CRI 兼容的容器运行时,不能使用 Docker,推荐使用 containerd

Terminal window
# 安装 containerd
sudo apt install -y containerd
# 生成默认配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
# 启用 systemd cgroup 驱动(Ubuntu 24.04 默认使用 cgroup v2,必须使用 systemd 驱动)
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 设置 pause 镜像版本
sudo sed -i 's|sandbox_image = ".*"|sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10.1"|' /etc/containerd/config.toml

验证 cgroup 驱动已正确修改:

Terminal window
grep 'SystemdCgroup' /etc/containerd/config.toml

应输出 SystemdCgroup = true

Terminal window
# 重启并设置开机自启
sudo systemctl daemon-reload
sudo systemctl enable --now containerd
sudo systemctl restart containerd

5. 添加 Kubernetes 1.33 APT 仓库

Terminal window
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.33/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://pkgs.k8s.io/core:/stable:/v1.33/deb/ /" | \
sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update

6. 安装 kubelet、kubeadm、kubectl

Terminal window
sudo apt install -y kubelet kubeadm kubectl
# 锁定版本,防止自动更新导致版本不一致
sudo apt-mark hold kubelet kubeadm kubectl
# 设置 kubelet 开机自启
sudo systemctl enable --now kubelet

验证版本:

Terminal window
kubeadm version

🚀 第二阶段:Master 节点初始化

以下所有命令仅在 Master 节点(k8s-master)上执行

7. 初始化控制平面

Terminal window
# apiserver的 ip 替换为 master节点的 ip
sudo kubeadm init \
--apiserver-advertise-address=192.168.56.52 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--image-repository=registry.aliyuncs.com/google_containers

⚠️ 重要:--pod-network-cidr 必须与后续安装的 网络插件配置一致

这里使用 10.244.0.0/16,对应下面 Flannel 的默认配置

成功后终端会输出一段指令,后续需要使用,输出示例:

To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.56.52:6443 --token xxx \
--discovery-token-ca-cert-hash sha256:xxx

8. 配置 kubectl 的 kubeconfig

执行上方 mkdir 那段

9. 安装 Flannel 网络插件

在 k8s-master 上执行:

Terminal window
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

如果网络不稳定先下载再执行

Terminal window
# 验证 网络配置, 确认 Flannel Pod 已在两个节点上都运行
kubectl get pods -A -o wide | grep flannel

🖥️ 第三阶段:Node 节点加入集群

以下命令仅在 Node 节点(k8s-node1)上执行

10. 执行 kubeadm join 命令

使用在第 7 步中保存的 kubeadm join 命令,格式如下(请替换为实际获取的命令):

Terminal window
kubeadm join 192.168.56.52:6443 --token xxx \
--discovery-token-ca-cert-hash sha256:xxx

✅ 第四阶段:在 Master节点上验证

11. 检查集群状态

Terminal window
# 查看节点列表,两个节点都应为 Ready
kubectl get nodes -o wide
# 查看所有命名空间的 Pod
kubectl get pods -A
# 查看集群信息
kubectl cluster-info

预期输出示例:

NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 176m v1.33.13
k8s-node1 Ready <none> 175m v1.33.13

⚠️ 常见问题排查

问题原因与解决方法
kubeadm init 失败,提示端口被占用检查 6443、10250 等端口是否被其他服务占用:sudo ss -tlnp | grep 6443
Node 加入后一直 NotReady检查 Flannel Pod 是否 Running:kubectl get pods -n calico-system;检查 Node 节点上 journalctl -u kubelet -f 日志
kubectl get nodes 显示 NotReady 且 Calico Pod 报错确认 calico.yaml 中的 CALICO_IPV4POOL_CIDR 与 kubeadm init 的 --pod-network-cidr 一致
containerd 启动失败检查 /etc/containerd/config.toml 是否语法正确;确认 SystemdCgroup = true 已设置
kubelet 报 cgroup 驱动不匹配Ubuntu 24.04 使用 cgroup v2,必须确保 containerd 的 SystemdCgroup = true

重置命令

配置错误使用如下命令重置:

Terminal window
# Master 上的重置命令
sudo kubeadm reset -f
sudo rm -rf /etc/kubernetes/ $HOME/.kube/
sudo iptables -F && sudo iptables -t nat -F && sudo iptables -t mangle -F
sudo systemctl restart containerd kubelet

错误举例

E1006 12:30:44.939923 12285 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s\": dial tcp 127.0.0.1:8080: connect: connection refused"

这个错误说明 kubectl 没有找到 kubeconfig 配置文件,所以它回退到默认地址 localhost:8080(这是 kubectl 的旧版默认行为)

K8S部署
/tech/hands-share/k8s-deploy/
作者
J.
发布于
2026-10-06
许可协议
CC BY-NC-SA 4.0
编辑于 2026-10-06

部分信息可能已经过时

Profile Image of the Author
J.
我是Jiy,热爱生活的学生一只~
公告
欢迎来到我的博客!
目录
行
器
律
目录