Java进阶(3) | Kubernetes 入门:为什么需要它,核心概念与实战
本系列系统梳理了 Java 开发的详细知识点从基础语法到工程实践层层递进内容详实成体系建议先收藏再慢慢阅读方便日后随时回顾查阅。前言上一篇用 Docker Compose 把 Mini-SSP 的几个服务跑起来了。但 Compose 只能管理一台机器上的容器——如果服务要跑在几十台机器上、某个容器挂了要自动重启、流量大了要自动扩容Compose 就力不从心了。这时候就需要 Kubernetes简称 K8sK 和 s 中间 8 个字母。这篇文章讲清楚 K8s 解决什么问题、几个核心概念、以及怎么把 Mini-SSP 部署上去。1. 为什么需要 K8s1.1 Docker Compose 的天花板Docker Compose 能做的 在【一台机器】上启动多个容器管理它们的依赖和网络 Docker Compose 做不到的 - 容器挂了自动拉起来需要人工 docker restart - 把容器分散到【多台机器】上运行 - 流量大了自动多开几个容器流量小了自动减少 - 升级时不停机先起新的再下线旧的 - 某台机器宕机自动把上面的容器迁移到其他机器当你的应用从一台机器跑得动变成需要一群机器一起扛时就需要一个管家来统一调度这一群机器和上面的容器。K8s 就是这个管家——专业术语叫容器编排Container Orchestration。1.2 一个比喻Docker把货物装进集装箱单个容器 Docker Compose把几个集装箱在【一个码头】摆好单机多容器 Kubernetes调度【整个港口】成百上千个集装箱—— 哪个船装哪些箱子、箱子坏了换新的、 货量大了多调几艘船全自动管理1.3 核心思想声明式 自动调谐这是理解 K8s 最重要的一点。你不需要告诉它怎么做只需要告诉它我要什么状态它自己想办法达成并一直维持你声明我要 3 个 SSP 容器一直运行着 K8s 持续检查自动调谐 reconciliation 当前有 3 个→ 什么都不做 挂了 1 个只剩 2 个→ 自动启动 1 个新的补回 3 个 有人误删到只剩 1 个→ 自动再起 2 个 机器宕机导致少了→ 在其他机器上补齐你只管声明期望状态K8s 负责让实际状态永远向期望状态靠拢。这和你写 SQL 是一个道理——你说我要这些数据不用管数据库内部怎么取。2. 核心概念K8s 概念很多但入门只需要先搞懂四个Pod、Deployment、Service、Ingress。2.1 Pod最小部署单元Pod 是 K8s 里能部署的最小单位里面装一个或多个容器。为什么不直接管理容器要套一层 Pod 大多数情况1 个 Pod 1 个容器比如一个 SSP 应用 少数情况1 个 Pod 多个紧密关联的容器 比如主应用容器 一个日志收集容器 它们需要共享网络和存储绑在一个 Pod 里一起调度可以把 Pod 理解为容器的包装盒——K8s 调度、扩容、迁移的单位都是 Pod不是单个容器。一个关键点Pod 是用完即弃的挂了就重建一个新的IP 都会变。所以你不应该直接创建 Pod而是用下面的 Deployment 来管理。2.2 Deployment管理 Pod 的副本和更新直接创建的 Pod 不会自愈——挂了就没了。Deployment 是更高层的对象负责1. 维持指定数量的 Pod副本数 声明我要 3 个 → Deployment 保证始终有 3 个在跑 2. 自愈 某个 Pod 挂了 → Deployment 自动创建新的补上 3. 滚动更新 升级时先起新版本 Pod确认健康后再下线旧版本不停机 4. 回滚 新版本有问题一条命令回到上一个版本实际开发中部署应用基本都是写 Deployment几乎不会直接写 Pod。2.3 Service给 Pod 提供稳定的访问入口Pod 会被销毁重建IP 总在变那别人怎么稳定地访问它答案是 Service。问题 Deployment 管理 3 个 SSP PodIP 分别是 10.1.1.1、10.1.1.2、10.1.1.3 某个 Pod 挂了重建IP 变成 10.1.1.9 调用方怎么知道现在该访问哪个 IP Service 的解决方案 Service 提供一个【固定的虚拟 IP 域名】 调用方只访问 Service不关心后面具体是哪些 Pod Service 自动把请求负载均衡到背后健康的 Pod 上 调用方 → Service固定入口→ 自动转发 → Pod1 / Pod2 / Pod3Service 通过**标签label**找到它要管理的 Pod——这是 K8s 里最常出问题的地方标签对不上Service 就找不到 Pod后面示例会讲。2.4 IngressHTTP 路由入口Service 解决了集群内部怎么访问 PodIngress 解决集群外部的 HTTP 请求怎么进来、怎么路由到不同的 Service。多个服务可以共享一个外部 IP由 Ingress 根据 URL 分发——类似 Nginx 的反向代理。2.5 四者关系图3. 集群架构简单理解一个 K8s 集群由两类机器组成3.1 控制平面Control Plane—— 大脑负责决策和调度主要组件组件作用类比kube-apiserver所有操作的唯一入口接收命令前台接待etcd存储整个集群的状态键值数据库档案室kube-scheduler决定 Pod 应该调度到哪台机器调度员kube-controller-manager一堆控制循环让实际状态向期望状态靠拢监工3.2 工作节点Worker Node—— 干活的机器真正运行 Pod 的机器每个节点上有组件作用kubelet节点上的代理负责按指令启动/停止容器kube-proxy处理 Service 的网络转发规则容器运行时真正运行容器的程序现在用 containerd不再是 Docker Engine注意早期 K8s 用 Docker 作为容器运行时但从 K8s 1.242022 年 4 月起移除了 docker 适配层现在底层统一用 containerd。不过这不影响你——你的镜像还是用 Docker 构建K8s 照样能跑。3.3 工作流程你执行 kubectl apply -f deployment.yaml声明要 3 个 Pod ↓ 请求发到 kube-apiserver ↓ 状态存进 etcd期望3 个 Pod ↓ controller-manager 发现实际 0 个 ≠ 期望 3 个 ↓ scheduler 决定这 3 个 Pod 分别放到哪个 Node ↓ 对应 Node 上的 kubelet 启动容器 ↓ 3 个 Pod 跑起来状态写回 etcd4. 常用命令kubectlkubectl是操作 K8s 的命令行工具读作 “kube control”。# 查看资源kubectl get pods# 查看所有 Podkubectl get deployments# 查看所有 Deploymentkubectl get services# 查看所有 Servicekubectl get nodes# 查看所有节点# 查看详情排查问题最常用kubectl describe podpod名# 查看 Pod 的详细信息和事件kubectl logspod名# 查看 Pod 日志kubectl logs-fpod名# 持续跟踪日志# 进入 Pod 内部kubectlexec-itpod名--bash# 应用/删除配置声明式操作最核心kubectl apply-fdeployment.yaml# 应用配置创建或更新kubectl delete-fdeployment.yaml# 删除配置里的资源# 扩缩容kubectl scale deployment ssp--replicas5# 把 SSP 扩到 5 个副本# 滚动更新后回滚kubectl rollout undo deployment ssp# 回滚到上一个版本kubectl apply -f是最核心的命令——把期望状态写在 YAML 里应用上去K8s 负责达成。5. 把 Mini-SSP 部署到 K8s5.1 Deployment 配置# ssp-deployment.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:ssp# Deployment 的名字spec:replicas:3# 期望运行 3 个 Podselector:matchLabels:app:ssp# 管理带有 appssp 标签的 Podtemplate:# Pod 的模板metadata:labels:app:ssp# 给 Pod 打上 appssp 标签必须和上面的 selector 一致spec:containers:-name:sspimage:mini-ssp:1.0# 用上一篇构建的镜像ports:-containerPort:8080env:# 环境变量-name:SPRING_DATASOURCE_URLvalue:jdbc:mysql://mysql-service:3306/mini_ssp-name:SPRING_DATA_REDIS_HOSTvalue:redis-service最关键的坑——label 和 selector 必须匹配selector.matchLabels: appssp ← Deployment 说我管理 appssp 的 Pod template.metadata.labels: appssp ← Pod 被打上 appssp 标签 这两个对不上Deployment 就管不到自己创建的 Pod会反复创建新 Pod。 这是新手最常见的错误之一。5.2 Service 配置# ssp-service.yamlapiVersion:v1kind:Servicemetadata:name:ssp-servicespec:selector:app:ssp# 把请求转发给 appssp 标签的 Podports:-port:80# Service 暴露的端口targetPort:8080# 转发到 Pod 的 8080 端口type:ClusterIP# 仅集群内部可访问selector: appssp让 Service 自动找到所有带appssp标签的 Pod把请求负载均衡过去。Service 和 Deployment 通过同一个 label 关联起来不需要手动指定 IP。5.3 部署# 应用配置kubectl apply-fssp-deployment.yaml kubectl apply-fssp-service.yaml# 查看状态kubectl get pods# 应该看到 3 个 ssp-xxx Pod 在 Runningkubectl getservice# 看到 ssp-service# 测试自愈手动删一个 Podkubectl delete pod某个ssp-pod名kubectl get pods# 会发现 K8s 立即创建了一个新 Pod始终保持 3 个# 测试扩容kubectl scale deployment ssp--replicas5kubectl get pods# 变成 5 个删一个 Pod 后立即自动补回的现象就是 1.3 节自动调谐的直观体现——你声明了 3 个K8s 就死死维持 3 个。6. 什么时候该用 K8sK8s 很强大但也很复杂不是所有项目都需要场景建议单机小项目、个人博客不需要Docker Compose 足够几个服务、流量稳定Docker Compose 或简单的容器部署即可微服务、多实例、需要自动扩缩容适合 K8s大规模、高可用、多团队协作K8s 几乎是标配对你的 Mini-SSP 来说本地学习用 Docker Compose 完全够但 OPPO 这种规模的广告系统线上几乎一定跑在 K8s 上或公司自研的类似平台。理解 Pod/Deployment/Service 这套模型是看懂公司部署体系的基础。学习建议本地用Minikube或kind起一个单机 K8s 集群练手不用真的准备一堆服务器。把上面的 Mini-SSP 部署跑通理解声明式 自愈这个核心思想入门就够了。7. 小结主题关键要点为什么需要 K8sCompose 只能管单机K8s 管多机集群自动调度、自愈、扩缩容核心思想声明式 自动调谐你声明期望状态K8s 持续维持Pod最小部署单元1 个或多个容器用完即弃不直接创建Deployment管理 Pod 副本数、自愈、滚动更新、回滚Service给 Pod 提供稳定入口 负载均衡通过 label 关联 PodIngressHTTP 路由多个 Service 共享外部入口集群架构控制平面大脑 工作节点干活底层用 containerd核心命令kubectl apply/get/describe/logs/scale最常见的坑label 和 selector 不匹配Service 找不到 Pod从 Docker单容器→ Docker Compose单机多容器→ Kubernetes多机集群编排这是容器化部署的完整进阶路径。你现在已经走完了这条路的入门段。下一篇预告CI/CD 入门——用 GitHub Actions 自动构建镜像并部署 如果这篇文章对你有帮助别忘了点赞、收藏、关注三连关注我让你在 Java 学习的道路上不迷路持续为你带来成体系的 Java 干货~

相关新闻

Agent工程与LangChain:AI应用开发的新范式

Agent工程与LangChain:AI应用开发的新范式

1. Agent 工程崛起:LangChain 创始人的预言意味着什么2024年夏天,LangChain创始人Harrison Chase在一次闭门技术会议上抛出了一个震撼性观点:"到2026年,不会构建Agent系统的软件公司将被淘汰。"这句话迅速在开发者社区引…

2026/10/7 22:50:32 阅读更多 →
从不稳定高度图到可靠三维测量:工业 3D 视觉中的图像处理、全局平面校准与融合实践

从不稳定高度图到可靠三维测量:工业 3D 视觉中的图像处理、全局平面校准与融合实践

本文是一篇基于实际工程代码整理的技术复盘。它不逐个解释函数,而是围绕三个问题展开:怎样从复杂场景中找到可靠基面,怎样融合来自不同高度层的深度数据,以及怎样让算法跨过 C# 与 C++ 的边界后仍然稳定运行。 下文将承载目标结构的主体表面称为基体,将其上的凸起、器件或…

2026/9/22 11:20:30 阅读更多 →
windows系统使用glm将claude接入PyCharm2026

windows系统使用glm将claude接入PyCharm2026

接入claude必须国外地区ip,有时候不太方便,因此采用国内API平台,如智谱的glm。实际上也有很多API,不是一定要使用glm。 步骤一 创建智谱账号 官网注册一个账号,智谱。 在控制台,API部分,新建一…

2026/10/6 23:57:42 阅读更多 →

最新新闻

Word一键批量添加图章:VBA宏自动化处理全流程详解

Word一键批量添加图章:VBA宏自动化处理全流程详解

做招投标、合同、人事通知的朋友,对“批量盖章”这四个字应该都不陌生。几十份Word文档,每份都要在落款处加上单位图章,如果靠手工——打开文档、插入图片、改大小、拖位置、保存——一份大概要一两分钟,五十份就会耗掉你整个下午…

2026/10/14 5:41:16 阅读更多 →
大模型对话系统的工程化落地:从Demo到可交付客服机器人的关键实践

大模型对话系统的工程化落地:从Demo到可交付客服机器人的关键实践

这个系列我已经写了四篇,前几篇从大模型的基本概念、提示词设计、接口调用,一直讲到如何把一个能“聊天”的demo拼出来。但很多人真正卡住的位置,其实不是“能不能聊起来”,而是“怎么把一个能聊的东西变成一个能交付、能上线、能…

2026/10/14 5:41:16 阅读更多 →
基于YOLOv5的DNF自动脚本:从目标检测到技能释放全链路解析

基于YOLOv5的DNF自动脚本:从目标检测到技能释放全链路解析

简介:这是一份面向游戏自动化与计算机视觉学习者的YOLOv5实战项目包,聚焦DNF场景下的目标识别与自动操作,适合具备Python基础、希望深入理解YOLOv5工程落地与游戏辅助脚本开发的开发者参考。资源共94个文件,以32个py源码、34个pyc…

2026/10/14 5:41:16 阅读更多 →
AIVA虚拟助理开发实战:意图识别、技能路由与上下文管理

AIVA虚拟助理开发实战:意图识别、技能路由与上下文管理

简介:AIVA(A.I. Virtual Assistant)是一套面向开发者的通用虚拟助理项目,基于 Node.js 构建,融合自然语言处理能力,可对接 Slack、Telegram、Facebook 等主流平台,并以机器人形式实现功能泛化—…

2026/10/14 5:41:16 阅读更多 →
本地跑 Codex 更简单,一键安装包封装全部依赖

本地跑 Codex 更简单,一键安装包封装全部依赖

前言 很多想体验 Codex 的开发者,卡在前期环境部署环节。手动安装 Node.js、配置依赖,还要敲大量命令行,对于新手十分不友好,很容易出现各种报错。 Codex 一键安装包把环境配置、依赖安装、客户端部署全部打包封装。不需要手动配…

2026/10/14 5:41:16 阅读更多 →
Redis缓存设计与性能优化:穿透、击穿、雪崩及一致性实战

Redis缓存设计与性能优化:穿透、击穿、雪崩及一致性实战

做后端这几年,凡是线上Redis出问题,十有八九都是缓存设计阶段埋的雷。要么是缓存穿透直接打爆数据库,要么是热key把单节点CPU跑满,再要么就是一批key同时过期,后端服务瞬间卡死。今天这篇不聊Redis命令手册&#xff0c…

2026/10/14 5:40:16 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →