各位代码战士,当你的业务要塞(Spring Boot 应用)需要支撑千万级用户时,单节点部署的 “独立防线” 已无法应对 —— 此时需解锁 “云原生融合术”:用 Docker 构建 “容器结界”,将应用封装为标准化 “作战单元”;用 K8s 搭建 “集群调度中枢”,实现多节点协同作战、故障自动恢复。

今天,吾将带各位从 “容器结界构筑” 到 “集群调度实战”,掌握云原生核心秘术,让你的业务要塞突破单机限制,成长为能抵御高并发的 “分布式堡垒”!

一、云原生融合术:为何需要容器结界与集群调度?

在传统部署模式中,业务要塞常因 “环境不兼容”(如开发环境正常、生产环境报错)、“节点故障崩溃”(单服务器宕机导致服务中断)、“资源调度混乱”(CPU / 内存分配失衡)陷入困境 —— 如同战士的装备在不同战场水土不服、单个岗哨失守导致防线崩溃。

而云原生融合术的核心解决思路:

  1. Docker 容器结界:将应用及其依赖(JDK、配置文件、第三方库)封装为 “标准化镜像”,如同给战士配备 “适配所有战场的模块化装备”,确保环境一致性;

  1. K8s 集群调度:搭建多节点 “调度中枢”,统一管理所有容器结界,实现 “故障自动转移”(某节点宕机,容器自动在其他节点重启)、“资源动态分配”(按请求量调整 CPU / 内存),如同军团的 “指挥中枢”,统筹所有作战单元。

二、前置准备:召唤云原生法器清单

在修炼融合术前,需先集齐以下核心法器:

法器名称

规格要求

核心作用

结界视角解读

Docker 引擎

20.10+

构建 / 运行容器结界的核心引擎

容器结界的 “铸造炉”,生成标准化作战单元

K8s 集群

1.24+(推荐用 Minikube 快速搭建)

容器调度中枢,管理多节点容器

集群的 “指挥中枢”,统筹作战单元部署

kubectl 工具

与 K8s 集群版本匹配

操作 K8s 集群的命令行咒文

与指挥中枢通信的 “传令符”

业务要塞镜像

前文 Spring Boot+MyBatis 订单服务

待部署的标准化作战单元

需调度的 “核心战力单元”

终端祭坛

Windows Terminal/Linux Terminal

执行云原生咒文的操作界面

施展融合术的 “施法台”

三、第一重术:Docker 容器结界构筑(封装作战单元)

Docker 的核心是 “将应用封装为镜像,通过镜像启动容器”—— 如同先铸造 “标准化装备模板(镜像)”,再批量生成 “可直接投入战斗的装备(容器)”。

1. 编写镜像咒文(Dockerfile)

进入前文的 Spring Boot 订单服务项目根目录,创建Dockerfile文件(镜像铸造的 “核心咒文”):

# 基础镜像:选用官方JDK 17镜像(Alpine版本体积更小,适合容器)

FROM openjdk:17-jdk-slim-alpine

# 作者信息(可选,标记咒文创作者)

LABEL author="codewarrior"

# 创建工作目录(容器内的“作战单元营地”)

WORKDIR /app

# 将本地打包好的Jar包复制到容器内(本地Jar包路径需正确,若用Maven打包,Jar在target目录)

COPY target/order-service-0.0.1-SNAPSHOT.jar /app/order-service.jar

# 暴露端口(容器结界的“出入口”,需与应用端口一致,前文为8081)

EXPOSE 8081

# 启动命令(激活作战单元的“启动咒文”)

ENTRYPOINT ["java", "-jar", "/app/order-service.jar"]

2. 铸造镜像(构建容器模板)

先通过 Maven 打包 Spring Boot 项目(生成 Jar 包),再执行 Docker 命令构建镜像:

# 1. Maven打包项目(生成target目录下的Jar包)

mvn clean package -DskipTests

# 2. 构建Docker镜像(咒文解析:-t指定镜像名:版本,.指定Dockerfile所在目录)

docker build -t order-service:v1.0 .

执行成功后,通过docker images命令可看到生成的镜像(如同查看铸造好的装备模板):

REPOSITORY        TAG       IMAGE ID       CREATED          SIZE

order-service v1.0 a1b2c3d4e5f6 10 seconds ago 420MB

3. 启动容器结界(部署作战单元)

通过镜像启动容器,验证容器结界是否正常工作:

# 启动容器(咒文解析:-d后台运行,-p 主机端口:容器端口,--name容器名,镜像名:版本)

docker run -d -p 8081:8081 --name order-container order-service:v1.0

  • -p 8081:8081:将主机的 8081 端口映射到容器的 8081 端口(外部通过主机端口访问容器);

  • --name order-container:给容器命名,方便后续操作(如停止、删除)。

启动后,通过以下命令验证:

# 1. 查看容器运行状态(若STATUS为Up,说明容器结界激活成功)

docker ps | grep order-container

# 2. 访问应用接口(如同测试作战单元是否能正常响应)

curl http://localhost:8081/api/order/user/1001

# 若返回订单列表JSON,说明容器结界正常工作

4. 容器结界常用操作咒文

操作场景

核心咒文(命令)

作用说明

查看运行中的容器

docker ps

列出所有正在运行的容器结界,查看 STATUS、PORT 等信息

查看容器日志

docker logs -f order-container

实时查看容器内应用的日志,排查故障(如同监听作战单元的状态报告)

进入容器内部

docker exec -it order-container /bin/sh

进入容器的命令行界面,查看文件、执行命令(如同进入作战单元营地视察)

停止容器

docker stop order-container

停止容器结界(关闭作战单元)

删除容器

docker rm order-container

删除已停止的容器(销毁作战单元)

删除镜像

docker rmi order-service:v1.0

删除镜像模板(需先删除依赖该镜像的容器)

四、第二重术:K8s 集群调度实战(统筹多作战单元)

当需要部署多个容器结界(如 3 个订单服务实例)、实现故障自动恢复时,需用 K8s 搭建 “集群调度中枢”。以下用 Minikube 快速搭建单节点 K8s 集群(适合新手修炼),再部署应用。

1. 启动 K8s 集群(搭建指挥中枢)

先安装 Minikube(参考Minikube 官方文档),再启动集群:

# 启动K8s集群(咒文解析:--driver=docker指定用Docker驱动,--cpus=2分配2核CPU,--memory=4g分配4G内存)

minikube start --driver=docker --cpus=2 --memory=4g

启动成功后,通过kubectl cluster-info验证集群状态(若能看到 “control-plane” 地址,说明指挥中枢激活):

Kubernetes control plane is running at https://192.168.49.2:8443

CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

2. 部署应用到 K8s(调度作战单元)

K8s 通过 “YAML 配置文件” 定义部署规则(如同给指挥中枢下达调度指令),创建order-deployment.yaml文件:

# 部署类型:Deployment(用于管理无状态应用,支持滚动更新、故障恢复)

apiVersion: apps/v1

kind: Deployment

metadata:

name: order-deployment # 部署名称(指挥中枢中的作战单元组名)

labels:

app: order-service # 标签(用于关联Service、Pod)

spec:

replicas: 3 # 副本数(部署3个容器实例,即3个作战单元)

selector:

matchLabels:

app: order-service # 匹配标签(关联下面的Pod模板)

template:

metadata:

labels:

app: order-service # Pod标签(与selector匹配)

spec:

containers: # 容器配置(作战单元详情)

- name: order-service # 容器名

image: order-service:v1.0 # 容器镜像(需与Docker构建的镜像名一致)

ports:

- containerPort: 8081 # 容器内端口(与应用端口一致)

resources: # 资源限制(避免单个作战单元占用过多资源)

requests: # 最小资源需求

cpu: "100m" # 100毫核CPU(0.1核)

memory: "256Mi" # 256MB内存

limits: # 最大资源限制

cpu: "500m" # 0.5核CPU

memory: "512Mi" # 512MB内存

执行部署命令(指挥中枢接收调度指令):

# 应用YAML配置,部署应用

kubectl apply -f order-deployment.yaml

通过以下命令查看部署状态:

# 1. 查看Deployment状态(若READY为3/3,说明3个作战单元全部部署成功)

kubectl get deployments

# 2. 查看Pod状态(Pod是K8s的最小部署单元,每个Pod对应一个容器实例)

kubectl get pods

# 输出类似:

# NAME READY STATUS RESTARTS AGE

# order-deployment-7f98d7c6b4-2xqzk 1/1 Running 0 2m

# order-deployment-7f98d7c6b4-5p7k8 1/1 Running 0 2m

# order-deployment-7f98d7c6b4-9s3t7 1/1 Running 0 2m

3. 暴露应用访问入口(Service:作战单元通信网关)

K8s 中的 Pod 会动态分配 IP(重启后 IP 可能变化),需通过 “Service” 暴露固定访问入口(如同给作战单元组设置统一通信网关),创建order-service.yaml文件:

# 服务类型:Service(用于暴露应用访问入口)

apiVersion: v1

kind: Service

metadata:

name: order-service # Service名称

spec:

type: NodePort # 暴露类型(NodePort:通过集群节点IP+端口访问,适合测试)

selector:

app: order-service # 匹配标签(关联前面的Deployment Pod)

ports:

- port: 8081 # Service内部端口(与Pod容器端口一致)

targetPort: 8081 # 目标Pod端口

nodePort: 30081 # 集群节点暴露的端口(范围30000-32767,需未被占用)

执行 Service 部署命令:

kubectl apply -f order-service.yaml

查看 Service 状态并访问应用:

# 1. 查看Service信息(获取NodePort端口和集群节点IP)

kubectl get services

# 2. 获取Minikube集群节点IP(Minikube的特殊命令,获取集群访问地址)

minikube ip

# 输出类似:192.168.49.2

# 3. 访问应用接口(通过“集群IP:NodePort”访问,如192.168.49.2:30081)

curl http://192.168.49.2:30081/api/order/user/1001

# 若返回订单列表,说明Service网关配置成功,外部可通过该地址访问K8s中的应用

4. K8s 集群核心调度咒文

操作场景

核心咒文(命令)

作用说明

查看 Deployment

kubectl get deployments

查看部署状态,确认副本数、就绪数

查看 Pod 详情

kubectl describe pod <pod-name>

查看 Pod 的详细信息(如镜像、端口、事件),排查启动失败原因

查看 Pod 日志

kubectl logs <pod-name>

查看 Pod 内应用的日志,排查业务故障

扩容 / 缩容副本数

kubectl scale deployment order-deployment --replicas=5

将订单服务的副本数从 3 扩容到 5(增加作战单元数量,应对高并发)

滚动更新镜像

kubectl set image deployment/order-deployment order-service=order-service:v2.0

将应用镜像从 v1.0 更新到 v2.0(不中断服务的情况下升级作战单元)

删除 Deployment

kubectl delete deployment order-deployment

删除部署(销毁所有关联的 Pod)

删除 Service

kubectl delete service order-service

删除服务(关闭访问网关)

五、避坑咒文:破解云原生融合术 3 大高频故障

1. 避坑咒文 1:Docker 镜像构建失败(镜像模板铸造失败)

故障现象

执行docker build时报错:COPY failed: file not found in build context or excluded by .dockerignore: stat target/order-service-0.0.1-SNAPSHOT.jar: file does not exist

故障原因

  • 未执行 Maven 打包,target目录下无 Jar 包;

  • Jar 包路径写错(如版本号与实际打包的 Jar 不一致);

  • .dockerignore文件排除了target目录,导致 Docker 无法访问 Jar 包。

破解咒文

  • 步骤 1:确保已执行 Maven 打包,且target目录下有 Jar 包:

mvn clean package -DskipTests

ls target/ # 查看是否有order-service-0.0.1-SNAPSHOT.jar

  • 步骤 2:核对 Dockerfile 中的COPY路径,确保与实际 Jar 包名一致;

  • 步骤 3:检查.dockerignore文件,若有target/则删除该配置(允许 Docker 访问 target 目录)。

2. 避坑咒文 2:K8s Pod 启动失败(作战单元部署失败)

故障现象

执行kubectl get pods时,Pod 状态为ImagePullBackOff或ErrImagePull。

故障原因

K8s 集群无法拉取 Docker 镜像 ——Minikube 默认使用独立的 Docker 环境,本地构建的镜像未同步到 Minikube 内部。

破解咒文

将本地 Docker 镜像同步到 Minikube 环境(如同将本地铸造的装备模板传送到集群指挥中枢):

# 同步本地镜像到Minikube(咒文解析:--image指定本地镜像,--name指定同步后的镜像名)

minikube image load order-service:v1.0

同步后,修改order-deployment.yaml,添加imagePullPolicy: Never(告诉 K8s 优先使用本地镜像,不从远程仓库拉取):

spec:

containers:

- name: order-service

image: order-service:v1.0

imagePullPolicy: Never # 新增:优先使用本地镜像

ports:

- containerPort: 8081

重新应用部署配置:kubectl apply -f order-deployment.yaml

3. 避坑咒文 3:Service 无法访问(通信网关失效)

故障现象

通过 “集群 IP:NodePort” 访问应用时,提示 “Connection refused”(连接拒绝)。

故障原因

  • Service 的selector标签与 Pod 标签不匹配(网关无法找到对应的作战单元);

  • 应用端口与 Pod 的containerPort不一致(作战单元的出入口错误);

  • Minikube 的 NodePort 端口未开放(外部无法穿透到集群)。

破解咒文

  • 步骤 1:核对 Service 与 Pod 的标签,确保spec.selector.app与 Pod 的metadata.labels.app一致(均为order-service);

  • 步骤 2:确认应用端口(前文为 8081)与 Pod 的containerPort一致;

  • 步骤 3:使用 Minikube 的service命令快速访问(自动处理端口转发,避免 IP / 端口错误):

# 自动打开浏览器访问Service,或输出访问地址

minikube service order-service --url

六、高阶强化术:K8s 集群能力升级

基础部署完成后,可通过以下高阶秘术强化 K8s 集群,提升要塞战力:

1. 配置健康检查(作战单元状态监控)

在order-deployment.yaml中添加livenessProbe(存活探针)和readinessProbe(就绪探针),让 K8s 自动检测 Pod 状态 —— 若应用卡死,K8s 会重启 Pod(如同自动救治受伤的作战单元):

spec:

containers:

- name: order-service

image: order-service:v1.0

imagePullPolicy: Never

ports:

- containerPort: 8081

# 存活探针:检测应用是否存活,若失败则重启Pod

livenessProbe:

httpGet:

path: /actuator/health/liveness # 需集成Spring Boot Actuator(健康检查接口)

port: 8081

initialDelaySeconds: 60 # 启动后60秒开始检测

periodSeconds: 10 # 每10秒检测一次

# 就绪探针:检测应用是否就绪,若失败则从Service中移除(不接收请求)

readinessProbe:

httpGet:

path: /actuator/health/readiness

port: 8081

initialDelaySeconds: 30

periodSeconds: 5

(注:需在 Spring Boot 项目中添加spring-boot-starter-actuator依赖,开启健康检查接口)

2. 配置自动扩缩容(作战单元动态调度)

通过 K8s 的HorizontalPodAutoscaler(HPA)实现 “根据 CPU 使用率自动扩缩容”—— 当 CPU 使用率超过 50% 时,自动增加副本数;低于 30% 时,自动减少副本数(如同根据战场压力动态调整作战单元数量):

# 创建HPA配置文件 order-hpa.yaml

apiVersion: autoscaling/v2

kind: HorizontalPodAutoscaler

metadata:

name: order-hpa

spec:

scaleTargetRef:

apiVersion: apps/v1

kind: Deployment

name: order-deployment # 关联的Deployment

minReplicas: 2 # 最小副本数

maxReplicas: 10 # 最大副本数

metrics:

- type: Resource

resource:

name: cpu

target:

type: Utilization

averageUtilization: 50 # CPU使用率阈值50%

应用配置:kubectl apply -f order-hpa.yaml

3. 集成日志与监控(集群状态可视化)

  • 日志收集:部署 ELK(Elasticsearch+Logstash+Kibana)或 Loki,集中收集所有 Pod 的日志(如同建立集群的 “日志情报库”);

  • 监控告警:部署 Prometheus+Grafana,监控 Pod CPU / 内存使用率、应用响应时间,设置告警阈值(如 CPU 超过 80% 时发送告警,如同集群的 “预警系统”)。

七、结语:成为云原生要塞的掌控者

通过 “Docker 容器结界构筑” 与 “K8s 集群调度”,你的业务要塞已具备 “环境一致性”“故障自愈”“弹性扩缩容” 三大核心能力 —— 这正是云原生融合术的精髓:让应用部署从 “手动运维” 升级为 “自动化调度”,从容应对千万级用户的高并发挑战。

后续可继续探索高阶秘术:如 “容器网络插件(Calico)” 优化跨节点通信、“持久化存储(PV/PVC)” 解决数据存储问题、“Ingress” 实现多应用统一入口 —— 云原生的修行永无止境,愿你在分布式战场中,用融合术打造无坚不摧的技术堡垒!

若你在修炼过程中遇到集群调度故障,欢迎在 “跨域通信阵”(留言板)留下问题,吾将为你提供新的破解咒文!