文章目录
第一章:理解 Kubernetes 最基础的三大概念 —— 容器、Pod、Namespace引言:为什么是这三个概念?一、容器(Container)—— 应用的“最小运行单元”✅ 3W1H 框架解析📘 示例 1:一个最简单的容器运行命令📘 示例 2:容器 vs 虚拟机📘 示例 3:容器镜像的分层结构📘 示例 4:容器的生命周期📘 示例 5:容器的资源限制📘 示例 6:容器的网络通信📘 示例 7:容器的日志与调试📘 示例 8:容器的安全隔离📘 示例 9:容器的健康检查📘 示例 10:容器的可移植性验证
二、Pod —— Kubernetes 的“最小调度单元”✅ 3W1H 框架解析📘 示例 1:最简单的单容器 Pod📘 示例 2:多容器 Pod(应用 + Sidecar)📘 示例 3:Pod 的网络共享📘 示例 4:Pod 的生命周期状态📘 示例 5:Init 容器(初始化任务)📘 示例 6:Pod 的资源请求与限制📘 示例 7:Pod 的健康探针📘 示例 8:Pod 的终止过程📘 示例 9:Pod 的标签与选择器📘 示例 10:Pod 的 nodeName 与 nodeSelector
三、Namespace —— 集群的“逻辑隔离单元”✅ 3W1H 框架解析📘 示例 1:创建 Namespace📘 示例 2:在指定 Namespace 中创建 Pod📘 示例 3:跨 Namespace 通信📘 示例 4:Namespace 的资源配额📘 示例 5:Namespace 的作用域📘 示例 6:为 Namespace 设置默认资源限制📘 示例 7:RBAC 与 Namespace📘 示例 8:Namespace 的清理📘 示例 9:Namespace 的标签📘 示例 10:Namespace 的用途总结
本章总结:三大概念的关系图延伸思考
当然可以!以下是一篇
精品书籍级别的章节内容,题为:
第一章:理解 Kubernetes 最基础的三大概念 —— 容器、Pod、Namespace
📅 更新于 2025-12-02
面向零基础读者,以 3W1H(What, Why, Where, How) 为框架,结合 真实场景 + 5~10 个高质量示例,深入浅出讲解 Kubernetes 的三大基石概念。
引言:为什么是这三个概念?
在 Kubernetes 的庞大体系中,成百上千的 API 对象令人望而生畏。但所有复杂都始于简单。容器、Pod、Namespace 是理解 Kubernetes 的“元起点”——它们分别代表了:
运行的单元(容器)调度的单元(Pod)组织的单元(Namespace)
掌握这三者,就如同掌握了编程中的“变量、函数、模块”,是通往云原生世界的第一把钥匙。
一、容器(Container)—— 应用的“最小运行单元”
✅ 3W1H 框架解析
| 维度 | 内容 |
|---|---|
| What(是什么) | 容器是一种轻量级、可移植的软件打包技术,将应用及其依赖打包在一起,实现“一次构建,到处运行”。 |
| Why(为什么用) | 解决“在我机器上能跑”的问题,实现环境一致性、快速启动、资源隔离。 |
| Where(用在哪里) | 几乎所有现代应用部署场景:Web 服务、数据库、批处理任务等。 |
| How(如何工作) | 基于 Linux 的 cgroups(资源限制)和 namespaces(环境隔离)技术,由容器运行时(如 containerd)管理。 |
📘 示例 1:一个最简单的容器运行命令
docker run -d --name my-nginx nginx:1.21
说明:启动一个 Nginx 容器,监听 80 端口。Why:无需安装 Nginx,无需配置环境,一条命令即可运行。
📘 示例 2:容器 vs 虚拟机
| 特性 | 虚拟机 | 容器 |
|---|---|---|
| 启动时间 | 秒级~分钟级 | 毫秒级~秒级 |
| 资源开销 | 高(完整 OS) | 低(共享内核) |
| 隔离性 | 强(硬件级) | 中等(进程级) |
| 可移植性 | 一般 | 极高(镜像标准) |
Why:容器更适合微服务架构中“快速迭代、弹性伸缩”的需求。
📘 示例 3:容器镜像的分层结构
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y curl
COPY app.py /app/
CMD ["python", "/app/app.py"]
说明:每一层都是只读的,最终叠加成一个镜像。Why:分层机制实现缓存复用,提升构建和拉取效率。
📘 示例 4:容器的生命周期
docker create my-image # 创建(Created)
docker start my-container # 启动(Running)
docker stop my-container # 停止(Stopped)
docker rm my-container # 删除(Deleted)
Why:容器是“一次性的”,不推荐在容器内修改数据——符合“不可变基础设施”理念。
📘 示例 5:容器的资源限制
docker run -m 512m --cpus=0.5 nginx
说明:限制内存 512MB,CPU 0.5 核。Why:防止某个容器“吃光”主机资源,影响其他服务。
📘 示例 6:容器的网络通信
docker run --network=host nginx # 使用主机网络
docker run --network=bridge nginx # 使用桥接网络(默认)
Why:容器默认隔离网络,需显式配置才能互通。
📘 示例 7:容器的日志与调试
docker logs my-container
docker exec -it my-container /bin/sh
Why:容器无状态,日志必须通过外部收集(如 ELK),调试需进入容器内部。
📘 示例 8:容器的安全隔离
docker run --user 1000:1000 nginx
说明:以非 root 用户运行,降低安全风险。Why:避免容器内进程拥有主机 root 权限,防止提权攻击。
📘 示例 9:容器的健康检查
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost/ || exit 1
Why:让编排系统(如 K8s)知道容器是否“活着”。
📘 示例 10:容器的可移植性验证
# 在开发机构建
docker build -t myapp:v1 .
# 推送到镜像仓库
docker push my-registry.com/myapp:v1
# 在生产环境拉取并运行
docker run my-registry.com/myapp:v1
Why:无论 Linux 发行版、CPU 架构(需兼容),只要支持容器运行时,就能运行。
✅ 本节小结:容器是现代应用的“标准集装箱”,它解决了环境一致性问题,是 Kubernetes 的运行基础。
二、Pod —— Kubernetes 的“最小调度单元”
✅ 3W1H 框架解析
| 维度 | 内容 |
|---|---|
| What(是什么) | Pod 是 Kubernetes 中最小的可部署单元,是一组共享网络和存储的容器集合。 |
| Why(为什么用) | 容器不能单独调度,必须打包成 Pod 才能被 K8s 管理;支持多容器协作(如 sidecar 模式)。 |
| Where(用在哪里) | 所有部署到 K8s 的应用,最终都以 Pod 形式存在。 |
| How(如何工作) | K8s 调度器将 Pod 调度到节点上,kubelet 负责在节点上创建容器;Pod 内容器共享 IP 和 volume。 |
📘 示例 1:最简单的单容器 Pod
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
How:Why:即使只有一个容器,也必须放在 Pod 中。
kubectl apply -f nginx-pod.yaml
📘 示例 2:多容器 Pod(应用 + Sidecar)
apiVersion: v1
kind: Pod
metadata:
name: app-with-logging
spec:
containers:
- name: app
image: busybox
command: ['sh', '-c', 'echo "Hello" > /logs/app.log && sleep 3600']
volumeMounts:
- name: log-volume
mountPath: /logs
- name: sidecar
image: busybox
command: ['sh', '-c', 'tail -f /logs/app.log']
volumeMounts:
- name: log-volume
mountPath: /logs
volumes:
- name: log-volume
emptyDir: {}
Why:Sidecar 模式是 K8s 的经典设计,用于日志收集、监控、代理等。How:两个容器共享 卷,实现文件共享。
emptyDir
📘 示例 3:Pod 的网络共享
apiVersion: v1
kind: Pod
metadata:
name: app-db-local
spec:
containers:
- name: app
image: busybox
command: ['sh', '-c', 'while true; do wget -qO- http://localhost:8080; sleep 5; done']
- name: server
image: python:3.9
command: ['sh', '-c']
args:
- echo "print('Hello')" > app.py && python -m http.server 8080
ports:
- containerPort: 8080
Why:两个容器在同一 Pod,可通过 通信,无需服务发现。How:
localhost 容器通过
app 访问
localhost:8080 容器。
server
📘 示例 4:Pod 的生命周期状态
kubectl get pod nginx-pod
# 输出可能为:
# STATUS: Pending / Running / Succeeded / Failed / Unknown
Why: 可能因镜像拉取慢或资源不足;
Pending 表示容器反复崩溃。How:用
CrashLoopBackOff 查看事件(Events)定位问题。
kubectl describe pod
📘 示例 5:Init 容器(初始化任务)
apiVersion: v1
kind: Pod
metadata:
name: init-demo
spec:
initContainers:
- name: init-db
image: busybox
command: ['sh', '-c', 'until nslookup mydb; do echo "waiting for mydb"; sleep 2; done']
containers:
- name: app
image: nginx
Why:确保数据库就绪后再启动应用,避免启动失败。How:Init 容器按顺序运行,全部成功后主容器才启动。
📘 示例 6:Pod 的资源请求与限制
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
Why: 用于调度,
requests 防止资源滥用。How:超过内存限制会被 OOMKilled;CPU 超限会被限流。
limits
📘 示例 7:Pod 的健康探针
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
readinessProbe:
httpGet:
path: /ready
port: 8080
periodSeconds: 5
Why:Liveness 探测失败 → 重启容器;Readiness 探测失败 → 不转发流量。How:避免将请求发给“未启动完成”或“已卡死”的应用。
📘 示例 8:Pod 的终止过程
kubectl delete pod my-pod
How:
Pod 状态变为 发送
Terminating 信号等待
SIGTERM(默认 30s)强制发送
terminationGracePeriodSeconds Why:给应用留出优雅关闭时间(如保存状态、断开连接)。
SIGKILL
📘 示例 9:Pod 的标签与选择器
metadata:
labels:
app: frontend
env: dev
# Service 通过 selector 选择 Pod
selector:
app: frontend
env: dev
Why:标签是 K8s 的“组织语言”,用于服务发现、调度、监控等。
📘 示例 10:Pod 的 nodeName 与 nodeSelector
spec:
nodeName: node-1
# 或
nodeSelector:
disktype: ssd
Why:控制 Pod 调度到特定节点(如 GPU 节点、SSD 节点)。How:结合节点标签使用。
✅ 本节小结:Pod 是 Kubernetes 的“原子单位”,它封装了容器的运行环境,是所有高级控制器(Deployment、StatefulSet)的基石。
三、Namespace —— 集群的“逻辑隔离单元”
✅ 3W1H 框架解析
| 维度 | 内容 |
|---|---|
| What(是什么) | Namespace 是 Kubernetes 中用于隔离资源的虚拟集群,同一集群内可有多个 Namespace。 |
| Why(为什么用) | 实现多租户隔离、环境隔离(dev/staging/prod)、权限控制、资源配额管理。 |
| Where(用在哪里) | 所有企业级 K8s 集群都应使用 Namespace 进行组织。 |
| How(如何工作) | 资源名称在 Namespace 内唯一;跨 NS 资源不可直接引用;支持 RBAC 和 ResourceQuota。 |
📘 示例 1:创建 Namespace
apiVersion: v1
kind: Namespace
metadata:
name: development
kubectl apply -f ns-dev.yaml
kubectl get namespaces
Why:将开发环境与生产环境隔离。
📘 示例 2:在指定 Namespace 中创建 Pod
apiVersion: v1
kind: Pod
metadata:
name: dev-pod
namespace: development
spec:
containers:
- name: nginx
image: nginx:1.21
How: 查看。Why:避免资源命名冲突。
kubectl get pods -n development
📘 示例 3:跨 Namespace 通信
# backend 在 default NS
apiVersion: v1
kind: Service
metadata:
name: backend
namespace: default
---
# frontend 在 frontend NS,调用 backend
command: ['sh', '-c', 'curl http://backend.default.svc.cluster.local']
Why:跨 NS 调用需使用全限定域名(FQDN)。How:格式为
<svc>.<ns>.svc.cluster.local
📘 示例 4:Namespace 的资源配额
apiVersion: v1
kind: ResourceQuota
metadata:
name: quota
namespace: development
spec:
hard:
pods: "10"
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
Why:防止开发环境“吃光”集群资源。How:超过配额后无法创建新 Pod。
📘 示例 5:Namespace 的作用域
kubectl get pods # 默认 default NS
kubectl get pods -A # 所有 NS
kubectl get pods -n kube-system # 指定 NS
Why: 存放系统组件,不应随意修改。
kube-system
📘 示例 6:为 Namespace 设置默认资源限制
apiVersion: v1
kind: LimitRange
metadata:
name: limit-range
namespace: development
spec:
limits:
- default:
cpu: 200m
memory: 512Mi
type: Container
Why:避免开发者忘记设置 limits。How:新 Pod 会自动继承默认 limits。
📘 示例 7:RBAC 与 Namespace
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: development
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
Why:限制用户只能查看 dev 环境的 Pod。How:结合 RoleBinding 实现权限控制。
📘 示例 8:Namespace 的清理
kubectl delete namespace development
How:删除 NS 会级联删除其下所有资源。Why:快速清理测试环境。
📘 示例 9:Namespace 的标签
metadata:
labels:
team: frontend
env: staging
Why:可用于批量操作,如
kubectl get pods -l env=staging
📘 示例 10:Namespace 的用途总结
| Namespace | 用途 |
|---|---|
|
默认空间,不推荐存放生产应用 |
|
系统组件(如 kube-dns、metrics-server) |
|
公共资源(如 cluster-info) |
|
开发环境 |
|
预发环境 |
|
生产环境 |
✅ 本节小结:Namespace 是 Kubernetes 的“组织架构图”,它让一个物理集群支持多个逻辑环境,是企业级使用的必备实践。
本章总结:三大概念的关系图
+-------------------+
| Namespace | ← 组织单元(逻辑隔离)
| |
| +------------+ |
| | Pod | | ← 调度单元(共享网络/存储)
| | | |
| | +------+ | |
| | | 容器 | | | ← 运行单元(进程封装)
| | +------+ | |
| +------------+ |
+-------------------+
容器 是“进程”Pod 是“逻辑主机”Namespace 是“部门/环境”
延伸思考
为什么 K8s 不直接调度容器,而要引入 Pod?
答:为了支持多容器协作、共享资源、统一生命周期管理。
可以跨 Namespace 挂载 PVC 吗?
答:不可以,PVC 是 Namespace 作用域的。
如何实现 Namespace 之间的网络策略隔离?
答:使用
(需 CNI 支持,如 Calico)。
NetworkPolicy
📚 本章参考:
Kubernetes 官方文档:https://kubernetes.io/docs/concepts/《Kubernetes 权威指南》第 5 版CNCF 白皮书:《Kubernetes Best Practices》
📅 更新时间:2025-12-02
本章内容基于当前稳定版本编写,适用于 Kubernetes v1.25~v1.30。
未来如有重大变更,将同步更新。
🎯 下一章预告:从 Pod 到 Deployment —— 如何实现应用的自愈与滚动更新


