文章目录
-
- 前言
- [一、先搞懂:三种 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单机部署。