Pod
最小的调度单元,包含一个或多个共享网络和存储的容器。Pod 不是容器,是容器的包装和调度原子。同一个 Pod 内的容器通过 localhost 通信,共享卷。
不是"一个系统",是五个不同抽象层级的知识体系
一句话:K8s 不是直接操作容器,而是通过一层资源对象抽象来管理容器——你声明"我想要什么状态",K8s 负责让你的集群变成那个状态。
# 典型应用部署的最小 YAML 结构
apiVersion: apps/v1
kind: Deployment # 声明"我要管理 Pod"
metadata:
name: my-app
spec:
replicas: 3 # 维持 3 个副本
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app # Service 通过这个 label 找到 Pod
spec:
containers:
- name: app
image: my-app:1.0
envFrom:
- configMapRef:
name: app-config # 配置分离
---
apiVersion: v1
kind: Service # 声明"为这组 Pod 提供稳定访问点"
metadata:
name: my-app
spec:
selector:
app: my-app # 匹配 Pod 的 label
ports:
- port: 80
targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress # 声明"外部流量从哪进来"
metadata:
name: my-app
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
backend:
service:
name: my-app
port: 80
一句话:控制平面是 K8s 的大脑和神经系统,负责接收指令、存储状态、做出调度决策、维持期望状态。
用户 kubectl apply
↓
kube-apiserver(接收请求,验证,写入 etcd)
↓
etcd(持久化状态变更)
↓
各 Controller Watch 到变更 → 采取行动
↓
kube-scheduler 发现未绑定 Pod → 选择 Node → 绑定
↓
目标 Node 的 kubelet 通过 CRI 创建容器
↓
kube-proxy 更新网络规则
一句话:K8s 不直接运行容器——它通过标准化的 CRI(Container Runtime Interface) 调用容器运行时,运行时再利用 Linux 内核机制实现隔离。
容器 ≠ 虚拟机
容器 = 一组被 namespace 隔离 + cgroup 限制的 Linux 进程
运行时调用链:
kubelet --(gRPC/CRI)--> containerd --(OCI/runc)--> runc --(clone syscall + namespace/cgroup setup)--> 容器进程
一句话:K8s 给每个 Pod 一个独立的 IP(IP-per-Pod),所有 Pod 可以在不经过 NAT 的情况下直接通信,Service 在这个扁平网络之上提供虚拟 IP 和负载均衡。
外部流量
→ Ingress Controller (NodePort/LoadBalancer)
→ 根据 Host/Path 路由到 Service ClusterIP
→ kube-proxy 的 iptables/IPVS 规则 DNAT 到 Pod IP
→ CNI 插件路由到目标 Pod 的 veth 接口
→ 容器进程处理请求
核心设计原则:
- Pod IP 可路由但短命(重建会变)
- Service ClusterIP 是虚拟的、稳定的
- 所有 Pod ↔ Pod 通信不经 NAT(扁平网络)
一句话:K8s 的所有操作都围绕声明式配置 + 控制器循环——你描述期望状态,系统持续收敛。
kubectl apply -f(声明式,推荐)、kubectl get/describe/logs(查询)、kubectl exec(进容器调试)。所有命令最终都是 REST API 调用。kubectl describe pod <name>(看 Events 定位问题)→ kubectl logs <pod>(看容器日志)→ kubectl exec -it <pod> -- sh(进容器排查)。80% 的问题靠这三条。命令式(Imperative):告诉系统"怎么做"
kubectl run nginx --image=nginx
kubectl scale deployment nginx --replicas=3
→ 适合临时调试,不推荐用于生产
声明式(Declarative):告诉系统"要什么状态"
kubectl apply -f deployment.yaml
→ 配置就是代码,可版本控制,可审计,可回滚
→ 控制器持续对比 spec 和 status,自动纠偏
kubectl apply 或 Helm 部署到集群。永远不要手敲 kubectl run 或 kubectl edit 到生产环境。