Docker Compose 和 Kubernetes 到底是什么关系?Pod、容器、Service 一次讲透
前言
很多刚接触 Docker 和 Kubernetes(K8s)的同学,都会遇到下面这些问题:
-
Docker Compose 和 K8s 有什么区别?
-
什么叫多实例(Pod)?
-
三个 Pod 对应三个容器吗?
-
一个容器对应几个服务?
-
容器、Pod、Service 到底是什么关系?
-
为什么企业都在说 Deployment、Service、Ingress?
刚开始学习时,这些概念经常混在一起,导致越学越乱。
本文将结合实际项目场景,用最通俗的大白话,从 Docker Compose 一路讲到 Kubernetes,彻底理清它们之间的层级关系。
一、先理解什么是「服务(Service)」
很多人上来就研究 Pod 和容器,其实应该先理解:
什么是服务?
服务(Service)本质上就是:
对外提供某种功能的程序。
例如一个健康管理系统:
健康管理系统
├── 前端服务
├── 后端服务
├── MySQL服务
└── Redis服务
前端负责:
页面展示
用户交互
后端负责:
登录
注册
健康记录
食谱管理
MySQL负责:
数据存储
Redis负责:
缓存
所以:
服务 = 功能模块
而 Docker、K8s 只是这些服务的运行方式。
二、Docker 中的服务与容器
在 Docker 世界里:
一个服务 ≈ 一个容器
例如:
frontend-container
backend-container
mysql-container
redis-container
对应:
前端服务
后端服务
MySQL服务
Redis服务
关系图:
服务
↓
容器
因此很多中小公司部署项目时:
前端一个容器
后端一个容器
MySQL一个容器
Redis一个容器
就已经足够了。
三、Docker Compose 是什么?
假设你的项目有:
Vue
SpringBoot
MySQL
Redis
如果不用 Compose:
docker run mysql
docker run redis
docker run backend
docker run frontend
容器越来越多,管理越来越麻烦。
于是 Docker 推出了:
Docker Compose
它本质上是:
多个 docker run 的集合
例如:
services:
mysql:
image: mysql:8
redis:
image: redis:7
backend:
image: health-back:v1
frontend:
image: health-front:v1
启动:
docker compose up -d
所有容器一次启动。
因此:
Docker Compose
=
单机版容器编排工具
四、Docker Compose 为什么不够用?
假设你的系统用户越来越多:
10万人访问
100万人访问
单台服务器已经扛不住了。
于是企业开始使用:
多台服务器
例如:
服务器A
服务器B
服务器C
这时候:
Docker Compose
只能管理一台服务器
就显得力不从心。
于是 Kubernetes(K8s)诞生了。
五、Kubernetes(K8s)是什么?
K8s 可以理解为:
集群版 Docker Compose
或者:
企业级容器编排平台
Docker Compose:
管理一台服务器
K8s:
管理整个服务器集群
例如:
Node1
Node2
Node3
K8s 可以自动:
部署
扩容
缩容
恢复
升级
六、什么是 Pod?
K8s 不直接管理容器。
它管理:
Pod
Pod 是 Kubernetes 最小调度单位。
可以理解为:
Pod = 容器的外壳
关系:
Pod
└── Container
例如:
backend-pod
└── backend-container
因此:
K8s管理Pod
Pod管理容器
七、一个 Pod 对应几个容器?
这是新手最容易搞混的问题。
大多数情况下:
1个Pod
=
1个容器
例如:
backend-pod
└── springboot-container
所以很多教程直接说:
Pod ≈ 容器
对于初学者来说,这样理解没有问题。
八、什么是多实例(多 Pod)?
假设你的后端服务:
health-back
平时:
100人访问
没问题。
但突然:
10000人访问
一个实例压力太大。
于是部署:
backend-pod-1
backend-pod-2
backend-pod-3
这三个 Pod 运行的是:
同一个后端项目
只是同时运行了三份。
因此:
3个Pod
=
3个实例
=
3个副本
九、k8s中,三个 Pod 对应三个容器吗?
通常情况下:
答案是:
是
例如:
backend-pod-1
└── springboot-container
backend-pod-2
└── springboot-container
backend-pod-3
└── springboot-container
所以:
3个Pod
≈
3个容器
十、一个容器等于一个服务吗?
很多人会产生下面的理解:
服务 = Pod = 容器
实际上:
服务 ≠ Pod ≠ 容器
它们只是经常对应。
例如:
后端服务
可能对应:
3个Pod
3个容器
因此:
一个服务
可以对应多个Pod
一个Pod
通常对应一个容器
关系:
服务
↓
多个Pod
↓
多个容器
十一、Deployment 是什么?
Deployment 可以理解为:
Pod管理员
例如:
replicas: 3
表示:
我要3个Pod
Deployment 自动创建:
backend-pod-1
backend-pod-2
backend-pod-3
如果:
backend-pod-2
挂了
Deployment 会自动重建。
因此:
Deployment
=
Pod管理器
十二、Service 是什么?
这里的 Service 指:
K8s中的Service资源
不是业务服务。
例如:
backend-pod-1
backend-pod-2
backend-pod-3
每个 Pod IP 都可能变化。
于是 K8s 创建:
backend-service
统一入口:
backend-service:8080
访问:
backend-service
K8s 自动转发到:
Pod1
Pod2
Pod3
因此:
Service
=
固定入口
=
负载均衡
=
服务发现
十三、Ingress 是什么?
假设系统有:
frontend-service
backend-service
admin-service
用户访问:
www.xxx.com
如何找到对应服务?
Ingress 负责:
域名路由
例如:
www.xxx.com
↓
frontend
api.xxx.com
↓
backend
admin.xxx.com
↓
admin
所以:
Ingress
=
K8s版Nginx反向代理
十四、一张图看懂整体关系
Internet
│
▼
Ingress
│
▼
backend-service
│
▼
Deployment
│
▼
┌─────────────┐
│ backend-pod1│
│ springboot │
└─────────────┘
┌─────────────┐
│ backend-pod2│
│ springboot │
└─────────────┘
┌─────────────┐
│ backend-pod3│
│ springboot │
└─────────────┘
总结
记住下面这张关系图即可:
业务服务
│
▼
Deployment
│
▼
Pod
│
▼
Container
以及:
Docker Compose
=
单机版容器编排
Kubernetes
=
集群版容器编排
Deployment
=
Pod管理员
Pod
=
容器运行单元
Container
=
真正运行程序的地方
Service
=
固定入口+负载均衡
Ingress
=
域名入口
对于个人开发者来说:
Docker
↓
Docker Compose
已经足够使用。
对于企业项目来说:
Docker
↓
Docker Compose
↓
Kubernetes
↓
Ingress
↓
Service Mesh(Istio)
才是完整的云原生技术路线。
更多推荐



所有评论(0)