前言
云原生是后端开发的趋势,Kubernetes(K8s)是云原生的核心。
这篇文章用图解的方式,带你快速理解 K8s 的核心概念,不需要会操作,先理解原理。
一、什么是云原生?
1.1 传统部署 vs 云原生
传统部署:
服务器 → 装操作系统 → 装 JDK → 部署应用 → 配置 Nginx
问题:
- 环境不一致
- 扩容困难
- 运维成本高
云原生:
应用打包成容器 → 编排管理 → 自动扩缩容
特点:
- 容器化
- 微服务化
- DevOps
- 弹性伸缩
1.2 云原生技术栈
┌─────────────────────────────────────┐
│ 应用层(微服务) │
├─────────────────────────────────────┤
│ 容器层(Docker) │
├─────────────────────────────────────┤
│ 编排层(Kubernetes) │
├─────────────────────────────────────┤
│ 基础设施层(云) │
└─────────────────────────────────────┘
二、Kubernetes 核心概念
2.1 Pod(最小单元)
Pod 是什么?
Pod = 1个或多个容器 + 共享存储 + 网络命名空间
类比:
Pod ≈ 豆荚(把相关容器打包在一起)
示例:
┌─────────────────────────────────┐
│ Pod │
│ ┌─────────┐ ┌───────────┐ │
│ │ App │ │ Sidecar │ │
│ │Container│ │Container │ │
│ └─────────┘ └───────────┘ │
│ ↓ ↓ │
│ 共享网络 共享存储 │
└─────────────────────────────────┘
为什么需要 Pod ?
- 紧密耦合的容器放在一起
- 共享网络(localhost 互通)
- 共享存储(Volume)
2.2 Deployment(部署)
Deployment 是什么?
Deployment 管理一组 Pod,保证期望的副本数。
┌─────────────────────────────────┐
│ Deployment │
│ replicas: 3 │
├─────────────────────────────────┤
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ Pod │ │ Pod │ │ Pod │ │
│ └─────┘ └─────┘ └─────┘ │
└─────────────────────────────────┘
如果某个 Pod 挂了:
Deployment 会自动创建新的 Pod,保持 3 个副本
Deployment 的核心功能:
- 副本管理:保持指定数量的 Pod
- 滚动更新:平滑升级应用
- 回滚:出问题快速回退
2.3 Service(服务)
Service 是什么?
Service 为一组 Pod 提供统一的访问入口。
┌─────────────────────────────────┐
│ Service │
│ 192.168.1.100:80 │
├─────────────────────────────────┤
│ ↓ 负载均衡 ↓ │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ Pod │ │ Pod │ │ Pod │ │
│ │:8080│ │:8080│ │:8080│ │
│ └─────┘ └─────┘ └─────┘ │
└─────────────────────────────────┘
Service 的类型:
| 类型 | 说明 | 使用场景 |
|---|---|---|
| ClusterIP | 集群内部访问 | 内部服务 |
| NodePort | 节点 IP + 端口 | 外部访问测试 |
| LoadBalancer | 云厂商负载均衡 | 生产环境 |
| Ingress | HTTP 路由 | 多域名路由 |
2.4 ConfigMap & Secret(配置管理)
ConfigMap:存储配置信息(非敏感)
Secret:存储敏感信息(密码、密钥)
┌─────────────┐ ┌─────────────┐
│ ConfigMap │ │ Secret │
├─────────────┤ ├─────────────┤
│ DB_HOST │ │ DB_PASSWORD │
│ DB_PORT │ │ API_KEY │
│ LOG_LEVEL │ │ TLS_CERT │
└─────────────┘ └─────────────┘
↓ ↓
Pod Pod
(以环境变量或 (加密存储)
配置文件注入)
2.5 Volume(存储)
Pod 中的容器重启数据会丢失,Volume 用于持久化存储。
┌─────────────────────────────────┐
│ Pod │
│ ┌─────────┐ ┌───────────┐ │
│ │Container│ │ Volume │←────┼──→ 外部存储
│ │ (App) │ │ (数据) │ │ (NFS/云盘)
│ └─────────┘ └───────────┘ │
└─────────────────────────────────┘
即使 Pod 重建,数据依然在 Volume 中
2.6 Namespace(命名空间)
Namespace 用于隔离不同环境/团队/项目。
┌─────────────────────────────────────────┐
│ Kubernetes 集群 │
├─────────────────────────────────────────┤
│ Namespace: dev │ Namespace: prod │
│ ┌──────────────┐ │ ┌──────────────┐ │
│ │ Deployment │ │ │ Deployment │ │
│ │ Service │ │ │ Service │ │
│ │ ConfigMap │ │ │ ConfigMap │ │
│ └──────────────┘ │ └──────────────┘ │
│ │ │
│ 开发环境 │ 生产环境 │
│ 互相隔离 │ 互相隔离 │
└─────────────────────────────────────────┘
三、K8s 架构图解
3.1 整体架构
┌─────────────────────────────────────────────────────────┐
│ 控制平面(Master) │
├─────────────────────────────────────────────────────────┤
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ API │ │ Scheduler│ │Controller│ │
│ │ Server │ │ │ │ Manager │ │
│ └────┬─────┘ └──────────┘ └──────────┘ │
│ │ │
│ ┌────┴─────────────────────────────────────────────┐ │
│ │ etcd │ │
│ │ (集群状态存储) │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 工作节点(Node) │
├─────────────────────────────────────────────────────────┤
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Node 1 │ │ Node 2 │ │
│ ├──────────────────┤ ├──────────────────┤ │
│ │ Kubelet │ │ Kubelet │ │
│ │ Kube-Proxy │ │ Kube-Proxy │ │
│ │ Container Runtime│ │ Container Runtime│ │
│ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │
│ │ │ Pod 1 │ │ │ │ Pod 3 │ │ │
│ │ │ Pod 2 │ │ │ │ Pod 4 │ │ │
│ │ └─────────────┘ │ │ └─────────────┘ │ │
│ └──────────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────┘
3.2 组件职责
| 组件 | 职责 |
|---|---|
| API Server | 所有请求的入口,验证和转发 |
| Scheduler | 为新 Pod 选择运行的节点 |
| Controller Manager | 维护集群状态(副本数、节点状态等) |
| etcd | 分布式键值存储,保存集群状态 |
| Kubelet | 节点代理,管理 Pod 生命周期 |
| Kube-Proxy | 网络代理,实现 Service 功能 |
四、Pod 生命周期
创建 Pod → 调度到 Node → 拉取镜像 → 启动容器 → 运行中
↓
健康检查
↓
失败 ← 不通过 通过 → 正常运行
↓
重启策略
┌──────────┼──────────┐
Always OnFailure Never
↓ ↓ ↓
总是重启 失败时重启 不重启
五、K8s 工作流程
部署应用的完整流程
1. 编写 YAML 配置
deployment.yaml
service.yaml
configmap.yaml
2. 提交到 API Server
kubectl apply -f deployment.yaml
3. API Server 写入 etcd
4. Controller Manager 发现变化
- 创建 ReplicaSet
- 创建 Pod
5. Scheduler 调度 Pod
- 选择最合适的 Node
- 写入 etcd
6. Kubelet 在 Node 上执行
- 拉取镜像
- 创建容器
7. Kube-Proxy 配置网络
- 配置 iptables
- 实现 Service 负载均衡
六、学习路径建议
第一阶段:理解概念(1周)
- 理解 Pod、Deployment、Service 概念
- 了解 K8s 架构
- 不用会操作,先理解原理
第二阶段:本地练习(1-2周)
- 安装 Minikube 或 Kind
- 部署简单应用
- 熟悉 kubectl 命令
第三阶段:生产实践(1-2月)
- 学习 Helm 包管理
- 了解监控(Prometheus)
- 学习 CI/CD 集成
七、推荐资源
- 📚 Kubernetes 官方文档
- 📚 《Kubernetes 权威指南》
- 📚 K8s 进阶实战课
总结
K8s 核心概念:
✅ Pod:最小部署单元 ✅ Deployment:管理 Pod 副本 ✅ Service:服务发现和负载均衡 ✅ ConfigMap/Secret:配置管理 ✅ Volume:持久化存储 ✅ Namespace:资源隔离
建议:先理解概念,再动手实践,最后深入原理。
💡 互动:你对 K8s 有什么疑问?评论区聊聊!