Kubernetes相关的名词解释Container(16)
什么是Container?
在 Kubernetes 中,Container(容器) 是一个核心概念,你可以将镜像(Image)类比为程序的“源代码”,而容器是这段“代码”运行时的进程。例如,一个 nginx:latest 镜像被运行时,就成为一个正在执行的容器。
容器是隔离的进程(通过 Linux Namespace 和 Cgroups 实现),包含独立的文件系统(由镜像提供)、资源限制和运行环境。
Container 的作用
-
运行应用:容器封装应用及其依赖,确保环境一致性(开发、测试、生产环境一致)。
-
资源隔离:通过 Cgroups 限制 CPU、内存等资源,避免进程间冲突。
-
快速启停:容器比虚拟机更轻量,秒级启动和销毁,适合动态扩缩容。
-
可移植性:镜像与容器解耦,使得应用可以跨平台(云、本地)运行。
Container 与容器运行时的关系
前面提到过容器运行时,比如containerd、docker、CRI-O等。容器运行时(Container Runtime) 是真正管理容器生命周期的组件,负责:
-
拉取镜像(如从 Docker Hub)。
-
创建/销毁容器(调用底层技术如
runc
)。 -
监控容器状态(如 CPU 使用率)。
Container 与镜像的关系
-
镜像是静态模板:
镜像是一个只读文件,包含应用代码、依赖库、环境变量等(类似“安装包”)。例如,ubuntu:22.04
镜像包含一个最小化的 Ubuntu 系统。 -
容器是动态实例:
容器基于镜像创建,运行时会在镜像顶层添加一个可写层(存储运行时数据)。多个容器可以共享同一个镜像(节省资源)。 -
生命周期:
-
镜像通过
docker build
或podman build
生成。 -
容器通过
kubectl create
或docker run
启动,停止后可写层默认销毁(除非使用持久化存储)。
-
总结图示
镜像(Image) → 容器运行时(Container Runtime) → 容器(Container)
(只读模板) (containerd/CRI-O/runc) (运行时进程 + 可写层)
Pod 和 Container 的设计哲学
Pod 与业务独立性的关系
-
Pod 是 Kubernetes 的最小调度单元,但它的核心设计目标不是“一个 Pod 对应一个业务”,而是:
“一个 Pod 封装一个或多个紧密耦合的容器,这些容器共享生命周期和资源,共同完成一个业务逻辑单元”。-
典型场景:
-
主容器 + Sidecar 容器:例如一个 Web 应用容器(主业务)和一个日志收集容器(Sidecar)。
-
多容器协作:如一个 Pod 中同时运行应用容器和数据库代理容器(二者需直接通过
localhost
通信)。
-
-
共享资源:Pod 内的容器共享网络命名空间(同一 IP)、存储卷(Volume)和 IPC 命名空间(可通过共享内存通信)。
-
一个 Pod 代表一个逻辑上的“服务实例”,它可能包含多个协作的容器来完成这个实例的功能。
Container 与应用独立性的关系
Container 是镜像的运行实例,它的设计目标是:
“一个 Container 封装一个独立的进程(应用),遵循单一职责原则”。
-
典型场景:
-
一个容器只运行一个主进程(如 Nginx、MySQL)。
-
容器之间通过明确接口(如网络或 Volume)通信,避免内部状态依赖。
-
Pod 和 Container 的类比关系
-
Pod 像一台物理机,而 Container 像这台机器上运行的进程:
-
同一 Pod 的容器就像同一台机器上的进程,共享网络和存储,通过
localhost
直接通信。 -
不同 Pod 的容器就像不同机器上的进程,需要通过 Service 或 Ingress 通信。
-
-
为什么需要 Pod 这一层?
因为有些“应用”需要多个进程(容器)紧密协作(例如需要共享本地文件或频繁本地通信),而容器本身是隔离的,Pod 提供了这种协作的抽象。
实际用例对比
场景 | 正确设计 | 错误设计 | 原因 |
---|---|---|---|
Web 应用 + 日志收集 | 一个 Pod(主容器 + Logstash Sidecar 容器) | 两个独立 Pod | Sidecar 需要共享主容器的日志文件 |
微服务 A 和 B | 两个独立 Pod(每个 Pod 一个容器) | 一个 Pod 两个容器 | 微服务应独立扩缩容 |
Nginx + PHP-FPM | 一个 Pod(Nginx 容器 + PHP 容器) | 一个容器内运行两个进程 | 违反单一职责,但需权衡运维复杂度 |
图例总结
下面用图例的方式加深一下容器运行时、容器、pod的关系。