前言

很多刚接触 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)

才是完整的云原生技术路线。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐