Kubernetes 速查手册
速查向 · 核心概念、Pod 与控制器、网络与 Service、存储、调度、生产实践与排障
1. 架构与核心组件
1.1 整体架构
K8s 是 Master(控制面)+ Node(工作节点) 的主从架构。
| 组件 | 所在 | 职责 |
|---|---|---|
| kube-apiserver | Master | 唯一入口,所有请求都走它;认证/鉴权/准入控制;读写 etcd |
| etcd | Master | 分布式 KV 存储,保存集群全部状态 |
| kube-scheduler | Master | 为新 Pod 选择合适节点(预选 + 优选) |
| kube-controller-manager | Master | 运行各种控制器,调谐期望状态与实际状态 |
| cloud-controller-manager | Master | 对接云厂商(LB、存储) |
| kubelet | Node | 管理本节点 Pod 生命周期,调用 CRI 起容器,上报状态 |
| kube-proxy | Node | 实现 Service 的负载均衡与转发规则(iptables/IPVS) |
| 容器运行时 | Node | containerd / CRI-O(Docker 已被弃用) |
核心设计哲学:声明式 API + 控制器循环(Reconcile)——你声明期望状态,控制器不断把实际状态拉齐到期望状态。
1.2 一次 Pod 创建的完整流程
kubectl apply→ apiserver 认证鉴权 → 写入 etcd(Pod 处于 Pending)。- scheduler 监听发现未调度的 Pod → 执行预选(过滤不合格节点)和优选(打分)→ 绑定到节点。
- 目标节点的 kubelet 监听到绑定 → 调用 CRI 拉镜像、创建容器。
- 调用 CNI 分配网络,CSI 挂载存储。
- 状态上报 apiserver → Pod 变 Running。
2. Pod 与工作负载
2.1 Pod 基础
- 最小调度单元,含一个或多个容器,共享网络命名空间(同一 IP)和存储卷。
- 为什么不用容器直接调度?——有些容器需紧密协作(sidecar、init、ambassador)且共享网络/卷。
- Init 容器:主容器启动前顺序执行,用于初始化依赖;失败会按重启策略重试。
- Pause 容器(sandbox):每个 Pod 第一个创建的容器,持有网络命名空间,业务容器加入它。
- 静态 Pod:kubelet 直接管理,不由 apiserver 调度(常见于控制面组件)。
2.2 探针 Probe
| 探针 | 作用 | 失败后果 |
|---|---|---|
| livenessProbe | 存活检测 | 重启容器 |
| readinessProbe | 就绪检测 | 从 Service Endpoints 摘除,不接流量 |
| startupProbe | 启动检测 | 成功前禁用其他探针(适合慢启动应用) |
检查方式:exec(执行命令)、httpGet、tcpSocket、grpc。
常见坑:livenessProbe 超时时间设太短会导致容器反复重启;慢启动应用应加 startupProbe。
2.3 生命周期与重启策略
- 生命周期钩子:
postStart(容器启动后)、preStop(终止前,常用于优雅下线:sleep + 注销)。 - restartPolicy:
Always(默认)/OnFailure/Never。 - 优雅退出:删除 Pod 时,kubelet 先执行 preStop,再发 SIGTERM,超过
terminationGracePeriodSeconds(默认 30s)后 SIGKILL。
2.4 控制器对比(高频)
| 控制器 | 特点 | 适用 |
|---|---|---|
| Deployment | 管理 ReplicaSet,支持滚动更新/回滚;Pod 有随机名 | 无状态服务 |
| ReplicaSet | 保证 Pod 副本数;一般由 Deployment 管理 | 底层,少直接用 |
| StatefulSet | 稳定网络标识(pod-0/1/2)、稳定存储、有序部署/扩缩 | 有状态(DB、MQ) |
| DaemonSet | 每个(或指定)节点跑一个 Pod | 日志采集、监控 Agent |
| Job | 跑完即结束的一次性任务 | 批处理 |
| CronJob | 按 cron 定时创建 Job | 定时任务 |
易混点:修改 Deployment 的 Pod 模板会触发新的 ReplicaSet(滚动更新);
kubectl rollout undo 就是切回旧 RS。2.5 Deployment 滚动更新
- maxSurge:更新时可超出期望副本数的最大值(默认 25%)。
- maxUnavailable:更新时不可用副本上限(默认 25%)。
- 两者不能同时为 0。
- 滚动更新过程中,Ready 的 Pod 达到阈值才继续下一批。
3. Service 与网络
3.1 Service 四种类型
| 类型 | 说明 |
|---|---|
| ClusterIP | 默认,仅集群内可访问的虚拟 IP |
| NodePort | 每个节点开一个端口(30000-32767)暴露服务 |
| LoadBalancer | 云厂商提供外部 LB(需 Cloud Provider) |
| ExternalName | DNS CNAME 映射到外部域名 |
3.2 Service 实现原理
- 为 Pod 提供稳定访问入口(Pod IP 会变,Service IP 不变)。
- 通过 Label Selector 关联 Pod,动态维护 Endpoints(就绪的 Pod IP 列表)。
- kube-proxy 有 iptables / IPVS / userspace 三种模式:
- iptables:规则线性匹配,大规模下性能差。
- IPVS:内核哈希表,性能好,支持多种调度算法(rr、wrr、lc)。
- ClusterIP 是虚拟 IP,只存在于转发规则中,ping 不通,无法 ARP。
3.3 DNS 解析
- CoreDNS 为 Service 提供域名:
<svc>.<ns>.svc.cluster.local。 - 同命名空间可省:
svc-name。 - Headless Service(
clusterIP: None):不分配 VIP,DNS 直接返回所有 Pod IP,StatefulSet 常配它。
3.4 Ingress
- 七层 HTTP/HTTPS 路由(按域名/路径转发),需配合 Ingress Controller(Nginx Ingress、Traefik)才生效。
- Ingress 只是规则定义,Controller 才是真正干活的组件。
- 作用:一个 LB 暴露多个服务,避免为每个服务建 LoadBalancer。
3.5 CNI 与网络模型
- 三条规则:每个 Pod 一个 IP;所有 Pod 可直接互通无需 NAT;Node 与 Pod 互通。
- 常见 CNI:Calico(BGP,性能好)、Flannel(VXLAN 简单)、Cilium(eBPF,可替代 kube-proxy)。
- Overlay(VXLAN 封装,跨子网但略损性能)vs Underlay(BGP 路由,性能好依赖网络设备)。
4. 配置与存储
4.1 ConfigMap 与 Secret
- ConfigMap:存非敏感配置,可挂载为文件或注入环境变量。
- Secret:存敏感信息,值是 base64 编码(不是加密),需开启 etcd 加密或外部 KMS。
- 两者更新后,环境变量方式不会自动更新,卷挂载方式会(有延迟)。
4.2 Volume 类型
| 类型 | 生命周期 | 说明 |
|---|---|---|
| emptyDir | 随 Pod 销毁 | 同 Pod 容器间共享临时数据 |
| hostPath | 随宿主机 | 挂载节点目录,生产慎用 |
| ConfigMap/Secret | - | 配置文件挂载 |
| PersistentVolume | 独立于 Pod | 持久化存储 |
4.3 PV / PVC / StorageClass
- PV:集群管理员提供的存储资源(真实存储)。
- PVC:用户对存储的请求(大小、访问模式),由绑定机制匹配 PV。
- StorageClass:定义动态供给模板,PVC 无需预先建 PV 即可自动创建。
- 访问模式:RWO(单节点读写)、ROX(多节点只读)、RWX(多节点读写,需 NFS/CephFS 等)、RWOP。
- 回收策略:Retain(保留)/ Delete(删除)/ Recycle(已废弃)。
常见坑:RWO 不等于"单 Pod",而是单节点可读写;同一节点的多个 Pod 可同时挂载。
5. 调度与资源
5.1 requests 与 limits
- requests:调度依据,保证资源下限;limits:运行上限。
- CPU 超 limits → 被限流(throttle),不杀进程。
- 内存超 limits → OOMKilled。
- QoS 等级:Guaranteed(requests=limits,最高优先级,最后被驱逐)> Burstable > BestEffort。
为什么 CPU 是压缩资源、内存不是?CPU 可被限流共享,内存不可压缩,超了只能杀。
5.2 高级调度
| 机制 | 作用 |
|---|---|
| nodeSelector | 按节点标签简单选择 |
| nodeAffinity | 节点亲和(required/preferred),表达能力更强 |
| podAffinity / podAntiAffinity | Pod 与 Pod 靠近 / 远离(同拓扑域) |
| Taint & Toleration | 污点是节点拒绝 Pod,容忍是 Pod 声明可接受 |
| TopologySpreadConstraints | 按拓扑域(如可用区)均匀分布 Pod |
污点效果:NoSchedule(不调度新的)、PreferNoSchedule(尽量不)、NoExecute(驱逐已有 Pod)。
5.3 驱逐与抢占
- 节点压力驱逐:节点内存/磁盘不足时,kubelet 按 QoS 和优先级驱逐 Pod。
- 污点驱逐:NoExecute 污点会赶走不能容忍的 Pod。
- 抢占(Preemption):高优先级 Pod 调度不进去时,驱逐低优先级 Pod。
- PDB(PodDisruptionBudget):限制自愿中断时最少可用 Pod 数。
6. 安全与生产实践
6.1 RBAC
- 四个对象:Role/ClusterRole(权限定义)+ RoleBinding/ClusterRoleBinding(绑定到主体)。
- Role 是命名空间级,ClusterRole 是集群级。
- 主体:User / Group / ServiceAccount。
- 权限遵循最小权限原则。
6.2 HPA / VPA
- HPA:水平扩缩,按 CPU/内存/自定义指标增加 Pod 数量。
- VPA:垂直扩缩,调整 Pod 的 requests/limits(需重启 Pod)。
- Cluster Autoscaler:按需增删节点。
6.3 常见排障
| 现象 | 常见原因 |
|---|---|
| Pending | 资源不足、无匹配节点、亲和/污点不满足、PVC 未绑定 |
| ImagePullBackOff | 镜像名错、私有仓库无 imagePullSecret、网络不通 |
| CrashLoopBackOff | 应用启动失败、配置错误、liveness 探针误杀 |
| OOMKilled | 内存超 limits、内存泄漏 |
| Evicted | 节点资源压力驱逐 |
| Terminating 卡住 | finalizer 未处理、preStop 卡住、节点失联 |
排障命令顺序:kubectl get pod -o wide → describe pod(看 Events)→ logs [-p] → exec 进容器 → 看节点 describe node。
7. 速查清单
| 主题 | 一句话答案 |
|---|---|
| 核心组件 | apiserver / etcd / scheduler / controller-manager + kubelet / kube-proxy |
| 设计哲学 | 声明式 API + 控制器调谐(Reconcile) |
| Pod 创建流程 | apiserver 写 etcd → scheduler 绑定 → kubelet 起容器 |
| Pause 容器 | 持有 Pod 网络命名空间,业务容器加入 |
| 三种探针 | liveness 重启 / readiness 摘流量 / startup 保护慢启动 |
| Deployment vs StatefulSet | 无状态滚动更新 vs 有状态稳定标识有序 |
| DaemonSet | 每节点一个,日志/监控 Agent |
| Service 原理 | Label 选 Pod 生成 Endpoints,kube-proxy 做转发 |
| ClusterIP | 虚拟 IP,仅存在转发规则,ping 不通 |
| IPVS vs iptables | IPVS 哈希表性能好,大规模首选 |
| Headless Service | clusterIP None,DNS 返回所有 Pod IP |
| Ingress | 七层路由规则,需 Ingress Controller 生效 |
| PV / PVC / SC | 存储资源 / 存储请求 / 动态供给模板 |
| requests vs limits | 调度依据 vs 运行上限;CPU 限流,内存 OOM |
| QoS | Guaranteed > Burstable > BestEffort |
| 污点与容忍 | 节点拒绝 vs Pod 接受 |
| HPA | 按指标扩缩 Pod 数量 |
| Secret 安全 | 仅 base64 编码,非加密,需 etcd 加密 |