K8s 集群快速搭建(系列第八篇:单机/多节点集群实战)

文章目录

    • 前言
    • [一、先搞懂:三种 K8s 工具到底干嘛的?(新手必看)](#一、先搞懂:三种 K8s 工具到底干嘛的?(新手必看))
      • [1.1 kubeadm:集群「安装工程师」](#1.1 kubeadm:集群「安装工程师」)
      • [1.2 kubelet:节点「打工人服务」](#1.2 kubelet:节点「打工人服务」)
      • [1.3 kubectl:集群「操作遥控器」](#1.3 kubectl:集群「操作遥控器」)
      • [1.4 三者一句话总结(永久记住)](#1.4 三者一句话总结(永久记住))
    • [二、K8s 环境选型:为什么不用 minikube?](#二、K8s 环境选型:为什么不用 minikube?)
      • [2.1 minikube(不推荐学习企业开发)](#2.1 minikube(不推荐学习企业开发))
      • [2.2 kubeadm(本篇采用,企业标准)](#2.2 kubeadm(本篇采用,企业标准))
    • 三、集群环境规划
    • 四、所有节点前置环境初始化(必做、零报错配置)
      • [4.1 关闭交换分区(K8s 硬性要求)](#4.1 关闭交换分区(K8s 硬性要求))
      • [4.2 关闭防火墙、SELinux](#4.2 关闭防火墙、SELinux)
      • [4.3 开启内核网络转发(容器互通必备)](#4.3 开启内核网络转发(容器互通必备))
    • [五、安装容器运行时 Containerd(K8s 官方标配)](#五、安装容器运行时 Containerd(K8s 官方标配))
      • [5.1 安装 Containerd](#5.1 安装 Containerd)
      • [5.2 配置国内镜像 + 标准驱动](#5.2 配置国内镜像 + 标准驱动)
    • [六、安装 K8s 三大核心工具](#六、安装 K8s 三大核心工具)
      • [6.1 配置阿里云 K8s 国内源](#6.1 配置阿里云 K8s 国内源)
      • [6.2 安装稳定版 K8s 工具集](#6.2 安装稳定版 K8s 工具集)
    • [七、初始化 Master 主节点(搭建集群核心)](#七、初始化 Master 主节点(搭建集群核心))
      • [7.1 初始化命令(核心参数全解)](#7.1 初始化命令(核心参数全解))
      • [7.2 初始化成功后必配权限](#7.2 初始化成功后必配权限)
      • [7.3 单机专属配置(关键)](#7.3 单机专属配置(关键))
    • [八、安装 Calico 网络插件(集群变 Ready 关键)](#八、安装 Calico 网络插件(集群变 Ready 关键))
    • 九、验证集群是否搭建成功
    • [十、实战 Demo:用 K8s 部署一个 Nginx(完整落地实验)](#十、实战 Demo:用 K8s 部署一个 Nginx(完整落地实验))
      • [10.1 部署 Nginx 服务](#10.1 部署 Nginx 服务)
      • [10.2 查看部署状态](#10.2 查看部署状态)
      • [10.3 暴露端口,外网可访问](#10.3 暴露端口,外网可访问)
      • [10.4 查看访问端口](#10.4 查看访问端口)
      • [10.5 体验 K8s 自愈能力(核心亮点)](#10.5 体验 K8s 自愈能力(核心亮点))
      • [10.6 动态扩容演示](#10.6 动态扩容演示)
    • 十一、新手常见报错快速修复
      • [11.1 节点一直 NotReady](#11.1 节点一直 NotReady)
      • [11.2 镜像拉取失败](#11.2 镜像拉取失败)
      • [11.3 集群重装重置](#11.3 集群重装重置)
    • 十二、本篇总结

前言

上一篇我们搞懂了 K8s 是用来替代 Docker Compose、管理生产集群容器的企业级工具。

理论说完,本篇直接落地:从零搭一套能真正干活的 K8s 集群

很多新手学 K8s 卡在这里的核心原因只有三个:

\1. 分不清 kubeadm / kubelet / kubectl 三个命令到底谁是谁、干什么用;

\2. 只会复制命令,不懂参数含义,报错完全不会排查;

\3. 国外镜像拉不下来、各种报错,搭完集群无实战验证。

本篇全部解决:白话讲概念 + 每条命令带参数详解 + 国内零报错部署 + Nginx 完整实战 Demo,做到知其然、更知其所以然。

一、先搞懂:三种 K8s 工具到底干嘛的?(新手必看)

所有 K8s 报错、看不懂配置、不懂架构,90% 都是因为分不清这三个工具!我用最通俗的大白话讲清楚,一次性彻底弄懂。

1.1 kubeadm:集群「安装工程师」

核心作用:只负责搭建集群

它的唯一工作:帮你一键初始化 Master 主节点、生成集群配置、让子节点加入集群。

通俗理解:

kubeadm 就是专门用来装 K8s 集群的工具,集群搭好之后,平时基本不用它。

常用场景:初始化集群、节点加入、重置集群。

1.2 kubelet:节点「打工人服务」

核心作用:常驻后台干活的进程

每一台 K8s 节点(Master/Node)都必须装 kubelet。

通俗理解:

kubelet 运行在每一台服务器上,负责监听 Master 的指令:让你启动容器就启动、让你删容器就删容器、监控本地 Pod 状态。

它是一直后台运行的服务,不需要你手动调用,集群核心组件。

1.3 kubectl:集群「操作遥控器」

核心作用:我们平时敲的所有 K8s 命令,全靠它

通俗理解:

kubeadm 把房子(集群)建好,kubelet 在房子里干活,kubectl 就是我们手里的遥控器

我们执行的:查看节点、部署项目、重启服务、查看日志,全部都是 kubectl 命令。

1.4 三者一句话总结(永久记住)

  • kubeadm:建房的(搭建集群,一次性工作)
  • kubelet:干活的(节点常驻服务,持续运行)
  • kubectl:操控的(我们日常管理集群的工具)

二、K8s 环境选型:为什么不用 minikube?

2.1 minikube(不推荐学习企业开发)

minikube 是给新手体验玩具环境的,单节点、阉割版 K8s。

缺点:没有主从架构、不能多节点调度、不能模拟生产场景、学完无法对接企业项目。

2.2 kubeadm(本篇采用,企业标准)

kubeadm 搭建的是完整标准 K8s 集群,和公司生产环境一模一样。

支持:单机伪集群、多节点集群、扩容、自愈、网络插件,学完直接上岗可用。

三、集群环境规划

为适配个人学习,本篇主打 单机伪集群(一台服务器搞定所有):

一台服务器既是 Master 管理节点,也当 Node 工作节点,低配机器也能跑通全套流程。

统一前置要求:CentOS7/8、2核4G、可联网、关闭防火墙、关闭交换分区

四、所有节点前置环境初始化(必做、零报错配置)

K8s 对系统非常挑剔,以下所有命令直接复制执行,附带详细参数解释,彻底弄懂每一步作用。

4.1 关闭交换分区(K8s 硬性要求)

开启虚拟内存会导致集群调度混乱、容器卡顿、调度失败,必须关闭:

bash 复制代码
# 临时关闭交换分区(重启服务器失效)
swapoff -a

# 永久关闭交换分区(注释fstab中swap挂载,重启不恢复)
sed -i '/swap/s/^/#/' /etc/fstab

参数详解

  • swapoff -a:关闭系统所有交换分区
  • sed -i:直接修改文件内容,不进入编辑模式
  • /swap/s/^/#/:匹配以swap开头的行,在行首加#注释,禁用开机自动挂载swap

4.2 关闭防火墙、SELinux

学习环境直接关闭防护,避免端口拦截、集群节点通信失败:

bash 复制代码
# 临时关闭防火墙
systemctl stop firewalld
# 禁用防火墙开机自启
systemctl disable firewalld

# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

参数详解

  • systemctl stop:立即停止当前运行服务
  • systemctl disable:取消服务开机自启
  • setenforce 0:临时将SELinux改为宽容模式

4.3 开启内核网络转发(容器互通必备)

让服务器支持容器网桥转发、内网跨容器通信,是K8s网络基础依赖:

bash 复制代码
# 加载网桥过滤内核模块
modprobe br_netfilter
# 加载overlay分层文件系统模块(容器存储依赖)
modprobe overlay

# 写入K8s必备内核网络配置
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 生效所有内核配置
sysctl --system

参数详解

  • modprobe:加载Linux内核模块
  • cat > 文件:覆盖写入文件内容
  • sysctl --system:重新加载所有系统内核参数,无需重启
  • 三条网络参数:开启网桥转发、开启IPv4转发,保证Pod跨节点通信

五、安装容器运行时 Containerd(K8s 官方标配)

新版 K8s 不再默认使用 Docker,统一使用 Containerd,我们安装标准运行时,配置国内镜像加速,解决拉取超时问题。

5.1 安装 Containerd

bash 复制代码
# 安装yum工具依赖,用于添加软件源
yum install -y yum-utils

# 添加阿里云Docker/Containerd国内源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装containerd容器运行时
yum install -y containerd.io

# 开机自启并立即启动containerd
systemctl enable --now containerd

参数详解

  • yum install -y:静默安装,自动确认所有选项
  • yum-config-manager --add-repo:添加第三方软件源
  • systemctl enable --now:立即启动服务 + 设置开机自启

5.2 配置国内镜像 + 标准驱动

bash 复制代码
# 生成containerd默认配置文件
containerd config default > /etc/containerd/config.toml

# 修改为K8s强制要求的systemd驱动
sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

# 替换谷歌官方镜像源为阿里云国内源
sed -i 's#registry.k8s.io#registry.aliyuncs.com/google_containers#g' /etc/containerd/config.toml

# 重启服务使配置生效
systemctl restart containerd

参数详解

  • config default:输出containerd完整默认配置
  • sed -i 替换:批量修改配置文件关键参数
  • SystemdCgroup=true:K8s强制要求的资源管控驱动,否则集群启动失败

六、安装 K8s 三大核心工具

一次性装好:kubeadm(建集群)、kubelet(跑服务)、kubectl(管集群)

6.1 配置阿里云 K8s 国内源

bash 复制代码
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF

参数详解

  • name:软件源名称
  • baseurl:阿里云K8s稳定yum源地址
  • enabled=1:启用该软件源
  • gpgcheck=0:关闭密钥校验,避免证书报错

6.2 安装稳定版 K8s 工具集

bash 复制代码
# 安装指定版本K8s三件套,禁止版本冲突
yum install -y kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2 --disableexcludes=kubernetes

# kubelet开机自启
systemctl enable --now kubelet

参数详解

  • --disableexcludes=kubernetes:解除系统版本锁定,避免安装失败
  • 统一v1.28.2版本:保证三件套版本一致,杜绝版本不兼容报错

💡 此时 kubelet 显示报错、重启属于正常现象,因为集群还没初始化,找不到配置,无需处理。

七、初始化 Master 主节点(搭建集群核心)

只在主节点执行,一键搭建 K8s 控制平面,全程国内镜像,无超时、无失败。

7.1 初始化命令(核心参数全解)

注意:把下面 IP 换成你自己服务器的内网 IP!

bash 复制代码
kubeadm init \
--apiserver-advertise-address=192.168.3.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.2 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

逐行参数详解(新手必背)

  • --apiserver-advertise-address:指定Master节点通信内网IP,子节点通过这个IP连接主节点
  • --image-repository:指定K8s核心镜像拉取仓库,替换国内阿里云源,解决谷歌镜像拉取失败
  • --kubernetes-version:锁定集群版本,保证所有节点、组件版本统一
  • --service-cidr:集群内部Service虚拟IP网段,固定默认值即可
  • --pod-network-cidr:Pod容器IP网段,必须和后续Calico网络插件配置匹配

7.2 初始化成功后必配权限

否则普通用户无法操作 kubectl 命令,会提示权限不足:

bash 复制代码
# 创建kubectl配置文件目录
mkdir -p $HOME/.kube

# 拷贝集群管理员配置文件到当前用户目录
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# 授权当前用户拥有配置文件所有权
sudo chown $(id -u):$(id -g) $HOME/.kube/config

参数详解

  • mkdir -p:递归创建目录,目录存在不报错
  • cp -i:覆盖文件前提示确认,避免误覆盖
  • chown:修改文件所属用户、用户组
  • $(id -u):$(id -g):自动获取当前用户ID和组ID,适配任意服务器

7.3 单机专属配置(关键)

K8s 默认有污点机制,禁止 Master 管理节点跑业务容器,单机学习必须放开限制:

bash 复制代码
kubectl taint nodes --all node-role.kubernetes.io/control-plane-

参数详解

  • taint:节点污点管理命令,用于限制节点调度规则
  • --all:作用于所有节点
  • 末尾-:代表删除对应污点,允许Master节点调度业务Pod

八、安装 Calico 网络插件(集群变 Ready 关键)

初始化完集群节点为NotReady,核心原因是缺少网络组件,Pod之间无法互通、跨节点无法通信。

本篇提供永久可用离线YAML方案,无需依赖外网链接,100%部署成功:

新建 calico.yaml 文件,粘贴适配v1.28版本的完整配置(内置国内镜像),保存退出后执行部署:

bash 复制代码
# 应用网络插件配置到集群
kubectl apply -f calico.yaml

参数详解

  • kubectl apply:声明式创建/更新集群资源(企业标准)
  • -f:指定资源配置文件路径,支持本地/远程文件

等待 1-3 分钟,网络组件全部启动,查看启动状态:

bash 复制代码
# 查看kube-system命名空间下所有Pod状态
kubectl get pods -n kube-system

参数详解

  • get pods:查看集群Pod运行状态
  • -n:指定命名空间,k8s系统组件默认在kube-system命名空间

九、验证集群是否搭建成功

执行核心校验命令,节点显示Ready代表集群完全搭建成功

bash 复制代码
# 查看所有集群节点状态
kubectl get nodes

参数详解

  • get nodes:查看集群所有节点信息、状态、版本

成功标准:节点状态为 Ready,无报错、无异常。

十、实战 Demo:用 K8s 部署一个 Nginx(完整落地实验)

集群搭完必须跑服务验证!手把手实现:部署、访问、自愈、扩容,直观感受K8s生产核心能力。

10.1 部署 Nginx 服务

创建 Deployment 控制器,管理Nginx Pod,实现高可用:

bash 复制代码
# 部署nginx,指定2个副本容器
kubectl create deployment nginx-demo --image=nginx:alpine --replicas=2

参数详解

  • create deployment:创建无状态服务部署控制器
  • nginx-demo:自定义部署名称,可随意修改
  • --image:指定容器镜像名称+版本,alpine为轻量稳定版
  • --replicas=2:指定运行2个Pod副本,实现简单高可用

10.2 查看部署状态

bash 复制代码
# 查看所有业务Pod状态
kubectl get pods

# 查看所有部署控制器信息
kubectl get deploy

参数详解

  • get deploy:查看副本数、就绪数、运行状态

看到状态 Running 说明 Nginx 容器已经在 K8s 集群中正常运行。

10.3 暴露端口,外网可访问

Pod IP是动态临时IP,重启即变,必须通过Service暴露固定端口,实现稳定外网访问:

bash 复制代码
# 暴露服务端口,外网可访问
kubectl expose deployment nginx-demo --port=80 --type=NodePort

参数详解

  • expose deployment:为部署资源创建Service服务
  • --port=80:容器内部服务端口(Nginx默认端口)
  • --type=NodePort:节点端口模式,外网可通过服务器IP+随机端口访问

10.4 查看访问端口

bash 复制代码
# 查看所有服务端口信息
kubectl get svc

参数详解

  • get svc:查看集群所有Service服务、端口、IP

看到 80:xxxx/TCP,末尾随机端口即为外网访问端口。

浏览器访问:服务器公网IP:随机端口,即可看到 Nginx 欢迎页面。

10.5 体验 K8s 自愈能力(核心亮点)

手动删除Pod模拟容器故障,验证K8s自愈机制:

bash 复制代码
# 删除指定Pod(替换为你的Pod名称)
kubectl delete pod nginx-demo-xxxx

# 再次查看Pod状态
kubectl get pods

参数详解

  • delete pod:删除指定容器Pod

现象:删掉一个,立刻新建一个,始终维持2个副本,业务无中断,这就是K8s生产核心的故障自愈

10.6 动态扩容演示

模拟业务流量暴涨,一键扩容服务实例,无需停机、无需重装:

bash 复制代码
# 扩容到4个运行实例
kubectl scale deployment nginx-demo --replicas=4
kubectl get pods

参数详解

  • scale deployment:动态调整部署副本数量
  • --replicas=4:将运行容器实例数量调整为4个

秒级扩容完成,这就是 K8s 适配生产高并发的核心优势。

十一、新手常见报错快速修复

11.1 节点一直 NotReady

99% 是网络插件未启动成功,重新执行 kubectl apply -f calico.yaml,等待1-3分钟即可恢复。

11.2 镜像拉取失败

全文已替换为阿里云稳定镜像源+本地完整Calico配置,严格按文档操作可100%规避拉取超时、解析失败问题。

11.3 集群重装重置

bash 复制代码
# 一键重置集群所有配置
kubeadm reset -f
# 清空用户集群配置
rm -rf $HOME/.kube

参数详解

  • reset -f:强制重置集群,无需手动确认
  • rm -rf:强制删除目录及所有文件,彻底清空配置

十二、本篇总结

1、三大核心工具彻底分清:kubeadm 建集群、kubelet 后台干活、kubectl 命令管理,零基础也能理解分工逻辑;

2、企业学习统一使用 kubeadm 标准集群,摒弃 minikube 玩具环境,学习内容完全对齐生产;

3、本篇补齐所有命令参数详解,告别只会复制、不懂原理的误区,报错可自行排查;

4、全程国内镜像+本地离线Calico配置,彻底解决外网链接失效、镜像拉取失败问题,新手零踩坑;

5、通过Nginx完整Demo,实战验证K8s部署、外网访问、故障自愈、动态扩容四大生产核心能力;

6、至此拥有一套稳定、标准、可实战的生产级K8s集群,彻底告别Docker Compose单机部署。

相关推荐
Chase_______1 小时前
Java 基础语言 ① —— Java 运行机制与开发环境:从 javac 到 JVM 全流程解析
java·jvm·python
北风toto1 小时前
在 Axios 中发送 POST 请求并携带参数通常有以下两种方式
java
江湖有缘1 小时前
使用Docker部署Docker Compose文件管理工具Dockge
运维·docker·容器
苍煜1 小时前
Docker 私有仓库 Harbor 搭建与镜像推送(系列第六篇:企业私有镜像仓库实战)
运维·docker·容器
cui_ruicheng1 小时前
Linux线程(二):pthread 线程库与线程控制
java·开发语言·jvm
喵喵爱自由1 小时前
离线安装docker
运维·docker·容器
山北雨夜漫步1 小时前
LangGraph
java·前端·算法
http阿拉丁神猫1 小时前
Docker知识点汇总(11~12)
运维·docker·容器
jakeswang1 小时前
【AI面经】大模型半夜发短信骂客户?Agent 工具调用失控,你如何设计防护机制?
java·后端