📋 目录

引言

很多新手一提到K8s(Kubernetes)就犯怵:“听说搭建环境特别复杂,还容易踩坑,零基础能搞定吗?”其实真不用怕!K8s搭建的核心是“按步骤走、避坑优先”——这篇教程从环境准备到集群验证,每一步都写得明明白白,命令直接复制可用,常见报错提前预判,还附带可直接复制的《K8s搭建命令速查手册》,新手跟着做,半小时就能搭好“1主2从”K8s集群(学习/测试完全够用)。

一、搭建前核心准备(避免白忙活)

动手前先搞定基础条件,少一步都可能导致后续报错:

1. 服务器环境要求(虚拟机/云服务器通用)

  • 系统版本:CentOS 7.9(最稳定、兼容性最好,新手慎选CentOS 8/9,坑多)
    cat /etc/centos-release
    

在这里插入图片描述

  • 硬件配置:1台Master节点 + 2台Node节点(最低配置:每台2核CPU、2G内存、20G硬盘,虚拟机直接分配即可)
    在这里插入图片描述

  • 网络要求:所有节点互通(关闭防火墙后默认满足),且能访问外网(需下载组件)
    在这里插入图片描述

  • 权限要求:全程使用root用户(新手别折腾普通用户,避免权限不足报错)

2. 必备工具

  • 远程连接工具:Xshell/Xftp(复制命令、传文件方便)
  • 本地练手:VMware Workstation(云服务器可跳过)

3. 集群架构说明(新手必懂)

  • Master节点:集群“大脑”,负责调度任务、监控节点状态
  • Node节点:集群“干活的节点”,运行实际应用(如Nginx、SpringBoot服务)
  • 后续部署应用仅需在Master发命令,K8s会自动分配到Node节点运行

二、所有节点(Master+Node)前置操作(关键避坑)

所有节点必须执行以下操作,是集群搭建成功的基础!

1. 关闭防火墙(K8s端口通信需放行)

# 临时关闭(立即生效)
systemctl stop firewalld
# 永久关闭(避免重启后生效)
systemctl disable firewalld
# 验证:显示“inactive”即为成功
systemctl status firewalld

2. 关闭SELinux(避免限制K8s权限)

# 临时关闭(立即生效)
setenforce 0
# 永久关闭(修改配置文件)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 验证:显示“Permissive”即为成功
getenforce

在这里插入图片描述

3. 关闭Swap(K8s强制要求,否则影响性能)

# 临时关闭(立即生效)
swapoff -a
# 永久关闭(注释Swap配置)
sed -i '/swap/s/^/#/' /etc/fstab
# 验证:无Swap相关输出即为成功
free -h

在这里插入图片描述

含义:free -h 是查看系统内存使用情况的常用命令,-h 表示以人类易读的格式(如 GB、MB)显示。

作用:执行后,你需要观察输出结果中的 Swap 这一行。如果显示为 0B(或者总量为 0),就说明 Swap 已经彻底关闭成功了。

💡 为什么要关闭 Swap?
通常在搭建 Kubernetes (K8s) 集群、高性能数据库(如 MySQL、Elasticsearch)等对延迟极其敏感的场景下,为了防止系统因为频繁在硬盘和内存之间交换数据(换页)导致性能抖动或卡顿,运维人员会强制要求关闭 Swap。

完成关闭操作后,重启服务器(reboot),再次执行 free -m。如果 Swap 依然为 0,说明已经永久关闭成功。

⚠️ 温馨提示:
关闭 Swap 后,你的系统将完全依赖物理内存。如果物理内存被耗尽,系统可能会直接触发保护机制(OOM Killer),强制杀掉占用内存最高的进程(比如你的数据库或应用服务)。因此,在关闭 Swap 前,请务必确认你的物理内存是充足且够用的。

4. 配置主机名+Hosts映射(节点间通过名字互通)

(1)设置唯一主机名(按节点分别执行)
  • Master节点:

    hostnamectl set-hostname k8s-master
    
  • Node1节点:

    hostnamectl set-hostname k8s-node197
    
  • Node2节点:

    hostnamectl set-hostname k8s-node199
    

执行后关闭Xshell重新连接,主机名生效(方便区分节点)。

(2)配置Hosts映射(所有节点执行)
# 编辑hosts文件
vi /etc/hosts

按i进入编辑模式,添加以下内容(替换为自己的节点IP!):

172.22.1.198  k8s-master  # 你的Master节点IP
192.168.1.101  k8s-node197   # 你的Node1节点IP
192.168.1.102  k8s-node199   # 你的Node2节点IP

按Esc+:wq保存退出。

验证:Master节点ping Node1,能通即为成功:

ping k8s-node197 -c 3  # ping 3次停止

5. 安装容器运行时(Containerd,K8s官方推荐,替代Docker)

# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

# 配置Docker yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装Containerd
yum install -y containerd.io

# 生成默认配置文件
containerd config default > /etc/containerd/config.toml

# 编辑配置文件(关键:支持Systemd+国内镜像加速)
vi /etc/containerd/config.toml

搜索并修改2个参数(按/输入关键词搜索):

  1. SystemdCgroup = false → 改为 SystemdCgroup = true
  2. sandbox_image = "k8s.gcr.io/pause:3.6" → 改为 sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"(国内镜像加速)

按Esc+:wq保存,启动Containerd并设置开机自启:

systemctl start containerd
systemctl enable containerd

# 验证:显示“active (running)”即为成功
systemctl status containerd

在这里插入图片描述

6. 配置内核参数(支持K8s网络功能)

# 创建内核配置文件
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# 生效内核参数
sysctl --system

# 验证:有输出“br_netfilter”即为成功
lsmod | grep br_netfilter

在这里插入图片描述

三、安装K8s核心组件(所有节点执行)

安装kubeadm(集群初始化工具)、kubelet(节点容器管理工具)、kubectl(集群命令行工具),三者版本必须一致!

1. 配置K8s国内yum源(阿里云,加速下载)

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-\$basearch/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

2. 安装指定版本(推荐1.27.0,稳定无坑)

yum install -y kubelet-1.27.0 kubeadm-1.27.0 kubectl-1.27.0 --disableexcludes=kubernetes

3. 启动kubelet并设置开机自启

systemctl enable kubelet && systemctl start kubelet

# 验证:显示“active (running)”或“waiting”均正常(未初始化集群)
systemctl status kubelet

在这里插入图片描述
在这里插入图片描述

四、初始化Master节点(仅Master执行,集群核心步骤)

1. 集群初始化(复制命令,替换为自己的Master IP)

kubeadm init \
  --apiserver-advertise-address=172.22.1.198 \  # 你的Master节点IP
  --image-repository registry.aliyuncs.com/google_containers \  # 国内镜像源
  --kubernetes-version v1.27.0 \  # 与安装版本一致
  --service-cidr=10.96.0.0/12 \  # 服务网段(默认无需修改)
  --pod-network-cidr=10.244.0.0/16  # Pod网段(与后续网络插件匹配)

或者单行命令:

kubeadm init --apiserver-advertise-address=172.22.1.198 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.27.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16

注意:核心规划原则
在规划这service-cidr和pod-network-cidr两个网段时,除了保证它们内部不冲突外,还必须遵守一个铁律:Pod 网段和 Service 网段,绝对不能与宿主机(Node 节点)所在的物理网络网段重叠。如果发生重叠,会导致集群内部的路由混乱,引发严重的网络通信故障。

2. 等待初始化完成(5-10分钟,取决于网络)

成功标志:输出kubeadm join ...命令(复制保存!这是Node加入集群的“钥匙”):

kubeadm join 172.22.1.198:6443 --token pthydm.u8cnm9i4xdqpm470 --discovery-token-ca-cert-hash sha256:5353da0f17b99f2150c5d35197845c9777fb733b90ac6b5ec471b6193fe0cf2d

在这里插入图片描述

失败处理:执行kubeadm reset清空配置,重新初始化。

3. 配置kubectl(Master节点操作集群的权限)

# 创建kubectl配置目录
mkdir -p $HOME/.kube

# 复制集群配置文件
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# 配置权限
chown $(id -u):$(id -g) $HOME/.kube/config

# 验证:能看到Master节点信息(状态为NotReady,未装网络插件)
kubectl get nodes

在这里插入图片描述

4. 安装网络插件(Calico,最稳定的K8s网络插件,必须装)

# 下载并应用Calico配置(国内加速地址)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# 验证:查看Calico组件状态(所有pod为Running即为成功)
kubectl get pods -n kube-system

等待3-5分钟,再次查看节点状态:

kubectl get nodes

在这里插入图片描述

推荐方案:证明失败了,建议:Calico “手动下载 + 导入” 方案
在这里插入图片描述

成功标志:Master节点状态变为“Ready”。
在这里插入图片描述

配置镜像源方案:下载到本地(针对报错:国内无法下载或者下载很困难)

首选建议:本地docker手动导入,具体参考附件一:Calico“手动下载 + 导入”方案

五、Node节点加入集群(仅Node执行)

在2个Node节点分别执行之前保存的kubeadm join命令(每个人的命令不同,以自己初始化Master时输出的为准):

示例命令(替换为自己的实际命令!)

kubeadm join 172.22.1.198:6443 --token pthydm.u8cnm9i4xdqpm470 --discovery-token-ca-cert-hash sha256:5353da0f17b99f2150c5d35197845c9777fb733b90ac6b5ec471b6193fe0cf2d

在这里插入图片描述

验证加入结果(在Master节点执行)

kubectl get nodes

成功标志:能看到k8s-node1和k8s-node2,状态均为“Ready”(需等待2-3分钟同步配置)

失败处理:Node节点执行kubeadm reset,重新执行kubeadm join命令。

六、集群功能验证(确保能正常部署应用)

1. 部署Nginx应用(Master节点执行)

# 创建Nginx部署(3个副本,自动分配到Node节点)
kubectl create deployment nginx --image=nginx:alpine

# 暴露端口(容器80端口映射到集群30000-32767的任意端口,外部可访问)
kubectl expose deployment nginx --port=80 --type=NodePort
# 或者:kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80

注意:指定的nodePort必须在集群配置的允许范围内(不写,默认是30000-32767),否则命令会执行失败。

执行成功后,你就可以通过 http://<你的任意节点IP>:30080 来访问你的Nginx服务了。

2. 查看部署状态

# 查看Pod状态(所有Pod为Running即为部署成功)
kubectl get pods

# 查看Service(获取Nginx外部访问端口,如30080)
kubectl get svc nginx

在这里插入图片描述

3. 访问Nginx(验证集群可用性)

浏览器输入:http://Node节点IP:外部访问端口(例:http://172.22.1.199:31233/;http://172.22.1.198:31233/;http://172.22.1.197:31233/),能看到Nginx默认页面,说明集群完全正常!
在这里插入图片描述
在这里插入图片描述

七、部署Kubernetes Dashboard(官方可视化管理界面)

1. 安装Dashboard

# 应用官方配置文件
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

注意:如果你的服务器无法访问GitHub,需要找国内镜像源或离线下载该yaml文件

2. 手动拉取并导入镜像(推荐)

如果你能在一台能上网的机器上操作,可以先拉取镜像再导入到集群节点:

(1)在有网的机器上拉取镜像
docker pull docker.io/kubernetesui/dashboard:v2.7.0
docker pull docker.io/kubernetesui/metrics-scraper:v1.0.8
(2)导出镜像为tar文件
docker save -o dashboard.tar docker.io/kubernetesui/dashboard:v2.7.0
docker save -o metrics-scraper.tar docker.io/kubernetesui/metrics-scraper:v1.0.8
(3)将tar文件传输到你的K8s节点(Master和所有Node)
scp dashboard.tar metrics-scraper.tar root@172.22.1.197:/root
scp dashboard.tar metrics-scraper.tar root@172.22.1.199:/root

在这里插入图片描述

(4)在每台节点上导入镜像
# 如果你使用的是Docker作为容器运行时
docker load -i dashboard.tar
docker load -i metrics-scraper.tar

# 如果你使用的是containerd(K8s 1.24+ 默认)
ctr -n k8s.io images import dashboard.tar
ctr -n k8s.io images import metrics-scraper.tar
(5)修改配置并重新部署
# 下载配置文件到本地
curl -O https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

# 修改配置(将imagePullPolicy改为IfNotPresent)
vi recommended.yaml
# 搜索imagePullPolicy,将Always改为IfNotPresent

# 重新部署
kubectl delete -f recommended.yaml
kubectl apply -f recommended.yaml

在这里插入图片描述
在这里插入图片描述

(6)验证部署结果
kubectl get pods -n kubernetes-dashboard

在这里插入图片描述

3. 创建代理服务(推荐生产环境)

创建systemd服务文件/etc/systemd/system/kubectl-proxy.service:

[Unit]
Description=Kubernetes API Proxy
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/bin/kubectl proxy --address=0.0.0.0 --accept-hosts=^.*$
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

然后执行:

systemctl daemon-reload
systemctl enable kubectl-proxy
systemc

查看状态:

systemctl status kubectl-proxy

查看日志:

journalctl -u kubectl-proxy -f

安全提醒:
由于你使用了 --address=0.0.0.0 和 --accept-hosts=^.*$,这意味着任何能访问该服务器 IP 的人都可以访问你的 Kubernetes API。强烈建议在生产环境中配合防火墙规则限制访问来源,例如只允许特定 IP 段访问 8001 端口:
iptables -A INPUT -p tcp --dport 8001 -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 8001 -j DROP
或者使用 firewalld、ufw 等工具进行更精细的控制。

在本地电脑的浏览器中访问:

http://172.22.1.198:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

在这里插入图片描述

4. 创建令牌

Dashboard 默认需要 Token 登录。你需要创建一个管理员用户并获取 Token 才能登录界面。

创建临时Token:

kubectl create token admin-user -n kubernetes-dashboard

登录遇到的“检测到不安全的访问。无法登陆”问题,是由于 Kubernetes Dashboard 默认强制要求 HTTPS 或 localhost 安全访问,而你当前通过 kubectl proxy --address=0.0.0.0 暴露了 HTTP 接口,浏览器因此拒绝登录。

解决方案:使用 SSH 隧道实现安全访问(推荐)
这是最安全、最简单、无需修改任何配置的方法,适用于所有环境:

  1. 在你本地电脑(Windows/macOS/Linux)的终端中执行以下命令,建立 SSH 隧道:
ssh -L 8001:127.0.0.1:8001 root@172.22.1.198

请将 root@172.22.1.198 替换为你实际的服务器用户名和 IP。

  1. 保持这个 SSH 连接打开。

  2. 在本地电脑的浏览器中访问:

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

在这里插入图片描述

此时,浏览器地址栏显示的是 localhost,Dashboard 会认为你是从安全通道访问,登录按钮将变为可用状态。
将你之前生成的 Token 粘贴到输入框,点击“登录”即可进入管理界面。

八、常见报错及解决方案(避坑指南)

在K8s搭建过程中,你可能会遇到各种报错。本章节汇总了最常见的报错现象、原因分析和解决方案,帮助你快速定位并解决问题。

1. Calico网络插件安装失败

报错现象:

  • 执行 kubectl get pods -n kube-system 时,calico-node Pod 状态为 ImagePullBackOff 或 ErrImagePull
  • Master节点状态一直为 NotReady

核心原因:
Calico镜像默认从 k8s.gcr.io 或 quay.io 拉取,国内网络无法直接访问这些镜像仓库。

解决方案:

方案一:手动下载+导入镜像(推荐)
# 1. 在有网的机器上拉取Calico镜像
docker pull calico/cni:v3.25.0
docker pull calico/node:v3.25.0
docker pull calico/kube-controllers:v3.25.0

# 2. 导出为tar文件
docker save -o calico-cni.tar calico/cni:v3.25.0
docker save -o calico-node.tar calico/node:v3.25.0
docker save -o calico-controllers.tar calico/kube-controllers:v3.25.0

# 3. 上传到所有K8s节点(Master和所有Node)
scp calico-*.tar root@172.22.1.198:/root/
scp calico-*.tar root@172.22.1.197:/root/
scp calico-*.tar root@172.22.1.199:/root/

# 4. 在每个节点上导入镜像(使用containerd)
ctr -n k8s.io images import /root/calico-cni.tar
ctr -n k8s.io images import /root/calico-node.tar
ctr -n k8s.io images import /root/calico-controllers.tar

# 5. 下载Calico配置文件并修改镜像地址
curl -O https://calico-v3-25.netlify.app/archive/v3.25/manifests/calico.yaml

# 6. 修改配置文件中的镜像地址(使用sed批量替换)
sed -i 's#docker.io/calico/#registry.cn-hangzhou.aliyuncs.com/google_containers/calico-#g' calico.yaml

# 7. 重新应用配置
kubectl delete -f calico.yaml
kubectl apply -f calico.yaml

# 8. 删除旧的Pod以触发重建
kubectl delete pod -n kube-system -l k8s-app=calico-node
方案二:使用国内镜像源直接安装
# 删除旧的Calico配置
kubectl delete -f https://docs.projectcalico.org/manifests/calico.yaml

# 下载配置文件到本地
curl -O https://docs.projectcalico.org/manifests/calico.yaml

# 修改镜像地址为阿里云源
sed -i 's#docker.io/calico/#registry.cn-hangzhou.aliyuncs.com/google_containers/calico-#g' calico.yaml

# 重新应用
kubectl apply -f calico.yaml

2. Node节点加入集群失败

报错1:Token过期

错误信息:

error execution phase preflight: couldn't validate the identity of the API Server: token id "xxxx" is invalid for this cluster or has expired

原因:Kubernetes的 kubeadm token 默认有效期只有24小时。

解决方案:

# 在Master节点生成新的Token
kubeadm token create --print-join-command

# 复制输出的新命令,在Node节点执行
kubeadm join 172.22.1.198:6443 --token [新token] --discovery-token-ca-cert-hash sha256:[新hash]
报错2:Node节点Calico镜像拉取失败

错误信息:Node节点状态为 NotReady,Calico Pod 状态为 ImagePullBackOff

原因:Master节点导入的镜像不会自动同步到Node节点。

解决方案:

# 在每台Node节点上执行(需要提前上传镜像文件)
ctr -n k8s.io images import /root/calico-cni.tar
ctr -n k8s.io images import /root/calico-node.tar
ctr -n k8s.io images import /root/calico-controllers.tar

# 验证镜像导入成功
crictl images | grep calico

在这里插入图片描述
在这里插入图片描述

3. Nginx服务无法访问

现象:Service创建成功,但通过NodePort无法访问Nginx页面。

排查步骤:

# 1. 检查kube-proxy状态
kubectl get pods -n kube-system | grep kube-proxy

# 2. 检查iptables规则
iptables-save | grep 31233  # 替换为你的NodePort

# 3. 检查Service的Endpoints
kubectl get endpoints nginx

# 4. 检查Service详细配置
kubectl get svc nginx -o yaml

常见问题及解决:

  1. targetPort配置错误:
# 编辑Service,修正targetPort
kubectl edit svc nginx
# 将 targetPort: 30080 改为 targetPort: 80
  1. 删除重建Service:
kubectl delete svc nginx
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
  1. Pod未就绪:
# 检查Pod状态
kubectl get pods
# 如果Pod未运行,查看日志
kubectl logs [pod名称]

4. Dashboard无法安装或访问

问题1:Dashboard未找到资源

错误信息:

No resources found in kubernetes-dashboard namespace.

原因:Dashboard未安装或安装在其他命名空间。

解决方案:

# 检查是否安装在kube-system命名空间
kubectl get pods -n kube-system | grep dashboard

# 如果未安装,重新安装
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
问题2:Dashboard镜像拉取失败

解决方案:手动拉取并导入镜像

# 在有网的机器上拉取镜像
docker pull docker.io/kubernetesui/dashboard:v2.7.0
docker pull docker.io/kubernetesui/metrics-scraper:v1.0.8

# 导出并传输到所有节点
docker save -o dashboard.tar docker.io/kubernetesui/dashboard:v2.7.0
docker save -o metrics-scraper.tar docker.io/kubernetesui/metrics-scraper:v1.0.8

# 导入镜像(每个节点都要执行)
ctr -n k8s.io images import dashboard.tar
ctr -n k8s.io images import metrics-scraper.tar

# 修改配置文件,设置imagePullPolicy为IfNotPresent
sed -i 's/imagePullPolicy: Always/imagePullPolicy: IfNotPresent/g' recommended.yaml

# 重新部署
kubectl delete -f recommended.yaml
kubectl apply -f recommended.yaml
问题3:Dashboard登录提示"检测到不安全的访问"

解决方案:使用SSH隧道

# 在本地电脑建立SSH隧道
ssh -L 8001:127.0.0.1:8001 root@172.22.1.198

# 保持连接,在浏览器访问
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

5. 节点角色显示为"<none>"

现象:执行 kubectl get nodes 时,Node节点的ROLES列显示为<none>

原因:Kubernetes默认不会给工作节点自动打上worker标签。

解决方案(可选):

# 手动给Node节点添加worker标签
kubectl label node k8s-node197 node-role.kubernetes.io/worker=worker
kubectl label node k8s-node199 node-role.kubernetes.io/worker=worker

6. Containerd启动失败

错误信息:systemctl status containerd 显示失败

解决方案:

# 1. 删除错误配置
rm -rf /etc/containerd/config.toml

# 2. 重新生成默认配置
containerd config default > /etc/containerd/config.toml

# 3. 修改关键参数
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sed -i 's#sandbox_image = "k8s.gcr.io/pause:3.6"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"#' /etc/containerd/config.toml

# 4. 重启containerd
systemctl restart containerd
systemctl status containerd

7. kubelet启动异常

错误信息:systemctl status kubelet 显示异常

排查步骤:

# 查看详细日志
journalctl -u kubelet -f

# 常见问题:cgroup驱动不匹配
# 检查docker/containerd的cgroup驱动
docker info | grep -i cgroup
containerd config dump | grep systemd_cgroup

# 确保kubelet配置与容器运行时一致
cat /var/lib/kubelet/config.yaml | grep cgroupDriver

8. 网络不通或节点间无法通信

排查步骤:

# 1. 检查Hosts配置(所有节点)
cat /etc/hosts

# 2. 检查防火墙状态(所有节点)
systemctl status firewalld

# 3. 检查SELinux状态(所有节点)
getenforce

# 4. 检查Swap是否关闭(所有节点)
free -h

# 5. 测试节点间网络连通性
ping k8s-master
ping k8s-node197
ping k8s-node199

9. 快速重置命令(当一切都不行时)

# 在Master节点执行
kubeadm reset -f
rm -rf $HOME/.kube
rm -rf /etc/cni/net.d

# 在Node节点执行
kubeadm reset -f

# 所有节点清理iptables规则
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

# 重启所有节点
reboot

10. 报错速查表

报错现象可能原因解决方案
节点状态一直为NotReadyCalico网络插件未启动1. 检查Calico Pod状态
2. 手动导入镜像
3. 重新安装Calico
kubeadm join失败Token过期或无效在Master节点生成新Token:kubeadm token create --print-join-command
镜像下载超时未配置国内镜像源1. 使用阿里云镜像仓库
2. 手动下载导入镜像
kubectl命令找不到K8s组件未安装成功重新执行安装命令
Containerd启动失败配置文件错误1. 删除错误配置
2. 重新生成配置
3. 修改SystemdCgroup参数
节点加入后无法通信Hosts映射错误检查所有节点的/etc/hosts配置是否一致
Service无法访问targetPort配置错误1. 检查Service配置
2. 检查Pod是否就绪
3. 检查kube-proxy状态

总结建议

  1. 网络问题优先排查:80%的K8s搭建问题都与网络相关(镜像拉取、节点通信、防火墙)
  2. 版本一致性:确保所有节点的K8s组件版本一致
  3. 镜像加速:国内环境务必使用国内镜像源或提前导入镜像
  4. 按步骤操作:严格按照教程顺序执行,不要跳过任何前置步骤
  5. 查看日志:遇到问题时,第一时间查看相关组件的日志:journalctl -u [服务名] -f

如果以上方案都无法解决你的问题,建议:

  • 查看详细的错误日志
  • 检查系统资源(内存、磁盘空间)
  • 确认系统版本兼容性
  • 在社区或技术论坛搜索具体错误信息

记住:K8s搭建是一个系统工程,遇到问题是正常的。耐心排查,一步步解决,你一定能成功搭建起自己的K8s集群!

参考

更多推荐