Kubernetes三大基础概念深度解析:容器、Pod、Namespace【20251202】002篇

内容分享12小时前发布
0 0 0

文章目录

第一章:理解 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
kubectl apply -f nginx-pod.yaml
Why:即使只有一个容器,也必须放在 Pod 中。


📘 示例 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,可通过
localhost
通信,无需服务发现。How
app
容器通过
localhost:8080
访问
server
容器。


📘 示例 4:Pod 的生命周期状态


kubectl get pod nginx-pod
# 输出可能为:
# STATUS: Pending / Running / Succeeded / Failed / Unknown

Why
Pending
可能因镜像拉取慢或资源不足;
CrashLoopBackOff
表示容器反复崩溃。How:用
kubectl describe pod
查看事件(Events)定位问题。


📘 示例 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
用于调度,
limits
防止资源滥用。How:超过内存限制会被 OOMKilled;CPU 超限会被限流。


📘 示例 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
信号等待
terminationGracePeriodSeconds
(默认 30s)强制发送
SIGKILL
Why:给应用留出优雅关闭时间(如保存状态、断开连接)。


📘 示例 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
kubectl get pods -n development
查看。Why:避免资源命名冲突。


📘 示例 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 用途

default
默认空间,不推荐存放生产应用

kube-system
系统组件(如 kube-dns、metrics-server)

kube-public
公共资源(如 cluster-info)

development
开发环境

staging
预发环境

production
生产环境

本节小结:Namespace 是 Kubernetes 的“组织架构图”,它让一个物理集群支持多个逻辑环境,是企业级使用的必备实践。


本章总结:三大概念的关系图


+-------------------+
|   Namespace       |  ← 组织单元(逻辑隔离)
|                   |
|   +------------+  |
|   |   Pod      |  |  ← 调度单元(共享网络/存储)
|   |            |  |
|   |  +------+  |  |
|   |  | 容器 |  |  |  ← 运行单元(进程封装)
|   |  +------+  |  |
|   +------------+  |
+-------------------+

容器 是“进程”Pod 是“逻辑主机”Namespace 是“部门/环境”


延伸思考

为什么 K8s 不直接调度容器,而要引入 Pod?

答:为了支持多容器协作、共享资源、统一生命周期管理。

可以跨 Namespace 挂载 PVC 吗?

答:不可以,PVC 是 Namespace 作用域的。

如何实现 Namespace 之间的网络策略隔离?

答:使用
NetworkPolicy
(需 CNI 支持,如 Calico)。


📚 本章参考

Kubernetes 官方文档:https://kubernetes.io/docs/concepts/《Kubernetes 权威指南》第 5 版CNCF 白皮书:《Kubernetes Best Practices》


📅 更新时间:2025-12-02
本章内容基于当前稳定版本编写,适用于 Kubernetes v1.25~v1.30。
未来如有重大变更,将同步更新。


🎯 下一章预告:从 Pod 到 Deployment —— 如何实现应用的自愈与滚动更新

© 版权声明

相关文章

暂无评论

none
暂无评论...