Kubernetes 深入与服务网格
深入调度(亲和性/污点)、StatefulSet、配置管理、持久化存储 PV/PVC/StorageClass,以及 Istio 服务网格的 Sidecar、流量管理、mTLS 与金丝雀发布。
🎯学习目标
- 掌握资源请求与限制、调度器预选/优选原理;
- 理解节点亲和性、Pod 亲和/反亲和、污点与容忍;
- 掌握 StatefulSet 与 Deployment 区别、Headless Service、VolumeClaimTemplates;
- 理解 ConfigMap 与 Secret 的配置解耦;
- 掌握持久化存储三层架构(PV / PVC / StorageClass)与动态供给;
- 理解 Service Mesh 与 Istio 架构、Sidecar、流量管理、mTLS、金丝雀发布。
1资源请求与限制(Requests & Limits)
| 配置 | 作用 | 说明 |
|---|---|---|
| Requests(请求) | 调度依据(保底资源) | 调度器以此选择节点,节点剩余资源须 ≥ Pod 的 Request |
| Limits(限制) | 运行最大上限(熔断资源) | 容器运行时的上限,超出 CPU 限流、内存 OOM |
ResourceQuota 与 LimitRange
| 对比 | ResourceQuota | LimitRange |
|---|---|---|
| 作用范围 | 命名空间总量 | 单个 Pod / 容器 |
| 功能 | 限制总资源、对象数量 | 设置默认值、范围约束 |
2调度器原理与亲和性 ⭐
调度(Scheduling)是将未绑定节点的 Pod 分配到合适 Worker 节点的过程,kube-scheduler 通过两阶段筛选完成。
| 阶段 | 名称 | 说明 |
|---|---|---|
| 阶段1 | 预选(Filtering / Predicates) | 排除不满足条件的节点,得到候选列表 |
| 阶段2 | 优选(Scoring / Priorities) | 对候选节点评分(0~100),选最高分 |
常见预选规则
PodFitsResources(剩余资源 ≥ Request)、PodFitsHostPorts(端口无冲突)、MatchNodeSelector(标签匹配)、NoTaintUnlessTolerated(污点需被容忍)、CheckNodeMemoryPressure(无内存压力)。
常见优选规则
LeastRequestedPriority(剩余资源最多优先,分散调度)、BalancedResourceAllocation(CPU/内存更均衡)、NodeAffinityPriority、InterPodAffinityPriority。
亲和性
| 类型 | 含义 |
|---|---|
| 节点亲和性(Node Affinity) | Pod 声明对特定节点的偏好(基于节点标签),是 nodeSelector 的增强版 |
| Pod 亲和性(Pod Affinity) | 希望与特定标签的 Pod 调度到同节点/区域(如 Web 与 Redis 部署在一起,提升通信效率) |
| Pod 反亲和性(Pod Anti-Affinity) | 不希望与特定 Pod 在同节点/区域(高可用分散部署,单点故障不影响整体) |
| 模式 | 约束类型 | 效果 |
|---|---|---|
| requiredDuringScheduling... | 硬约束 | 必须满足,否则无法调度 |
| preferredDuringScheduling... | 软约束 | 优先满足,不满足仍可调度到其他节点 |
3污点与容忍(Taints & Tolerations)
污点(Taint)是节点的属性,表示节点拒绝特定 Pod;容忍(Toleration)是 Pod 的属性,表示可以容忍某节点的污点。
| Effect 效果 | 说明 |
|---|---|
| NoSchedule | 不调度新 Pod(已运行的不受影响) |
| PreferNoSchedule | 尽量不调度,但不保证 |
| NoExecute | 不调度新 Pod,且驱逐已运行的不匹配 Pod |
典型场景:GPU 节点 Taint 为 gpu=true:NoSchedule,只有需要 GPU 的 Pod 才容忍;Master 节点默认 Taint node-role.kubernetes.io/master:NoSchedule,避免业务 Pod 调度到 Master。
4StatefulSet 有状态应用管理 ⭐
StatefulSet 为每个 Pod 提供稳定的网络标识和持久化存储,确保 Pod 身份在重建后保持不变。
| 特性 | Deployment | StatefulSet |
|---|---|---|
| Pod 名称 | 随机后缀(web-7d9f8c-xk2l3) | 有序固定(web-0, web-1, web-2) |
| 网络标识 | 无稳定标识 | 稳定 DNS 名称(web-0.web-svc) |
| 存储 | 重建后存储丢失 | 每 Pod 绑定独立 PVC,重建后保留 |
| 启停顺序 | 并行 | 有序(0→1→2 启动,2→1→0 停止) |
| 适用场景 | 无状态(Web API) | 有状态(数据库、消息队列) |
核心组件
- Headless Service(
clusterIP: None):普通 Service 有 ClusterIP 做负载均衡;Headless 不分配 IP,直接返回后端 Pod 的 IP 列表,配合 StatefulSet 生成稳定 DNS 记录pod-name.service-name。 - VolumeClaimTemplates:Deployment 所有 Pod 共享一个 PVC(通常只读);StatefulSet 需要每个 Pod 有自己独立的 PVC(自动化存储绑定)。
5ConfigMap 与 Secret(配置解耦)
| 对比 | ConfigMap | Secret |
|---|---|---|
| 存储内容 | 非敏感配置(DB_HOST、LOG_LEVEL、nginx.conf) | 敏感信息(密码、Token、TLS 证书) |
| 编码 | 明文键值对 | Base64 编码(注意:非加密,需配合 etcd 加密) |
| 使用方式 | 环境变量注入 / 卷挂载为文件 / 命令行参数 | 挂载为 tmpfs(内存卷),不写入节点磁盘 |
Secret 类型:Opaque(通用,默认)、kubernetes.io/tls(TLS 证书 tls.crt + tls.key)、kubernetes.io/dockerconfigjson(Registry 认证)、kubernetes.io/service-account-token(SA Token)。
6持久化存储 PV / PVC / StorageClass ⭐
容器文件系统是临时的——重启或删除后数据丢失。有状态应用需持久化存储。K8s 存储三层架构:Pod → PVC(存储请求)→ PV(存储资源)→ 底层存储(云盘/NFS/Ceph)。
| 概念 | 全称 | 说明 |
|---|---|---|
| PV | PersistentVolume | 集群级存储资源,由管理员预创建或动态供给 |
| PVC | PersistentVolumeClaim | Pod 对存储的请求声明(大小、访问模式) |
| StorageClass | — | 定义存储类型和供给策略,支持动态创建 PV |
访问模式与回收策略
| 访问模式 | 缩写 | 说明 |
|---|---|---|
| ReadWriteOnce | RWO | 单节点读写(最常用) |
| ReadOnlyMany | ROX | 多节点只读 |
| ReadWriteMany | RWX | 多节点读写(需 NFS/CephFS 等共享存储) |
| 回收策略 | 说明 |
|---|---|
| Retain | PVC 删除后 PV 保留(手动回收) |
| Delete | PVC 删除后 PV 和底层存储一并删除 |
| Recycle | 已弃用(清空数据后重用) |
静态 vs 动态供给
静态供给:管理员手动预创建 PV → 开发者创建 PVC → K8s 寻找匹配 PV 绑定。问题:需提前创建大量 PV、大小不一定匹配、无法自动化。
动态供给:StorageClass 定义供给者(Provisioner),PVC 匹配某 StorageClass 时自动创建对应 PV。
# 动态供给流程
PVC 请求(storageClassName: fast-ssd, 100Gi)
→ StorageClass(provisioner: aws-ebs)
→ 自动创建 100Gi EBS 卷
→ 创建 PV 并绑定 PVC
→ Pod 使用 PVC
7Service Mesh 与 Istio ⭐
随着微服务数量增长,服务间通信面临流量管理、安全、可观测性挑战。传统方式在每个服务中嵌入 SDK(Spring Cloud、Hystrix)——语言绑定、侵入性强。
| 对比 | 传统 SDK 方式 | Service Mesh |
|---|---|---|
| 通信逻辑 | 嵌入业务代码 | 下沉到基础设施 |
| 语言 | 语言绑定(Java SDK 不能用于 Go) | 语言无关(Sidecar 代理) |
| 升级 | 需修改并重新部署所有服务 | 升级代理不影响业务代码 |
| 策略 | 每个服务单独实现熔断/限流 | 统一策略管理 |
Istio 架构(控制面 + 数据面)
Istio 由 Google、IBM、Lyft 共同开发,是最流行的 Service Mesh 实现。
| 组件 | 功能 |
|---|---|
| istiod | 统一控制面(合并了 Pilot/Citadel/Galley) |
| Pilot | 服务发现、流量管理规则下发 |
| Citadel | 证书管理、mTLS 加密 |
| Galley | 配置验证和分发 |
| Envoy | 数据面代理(Sidecar),所有流量经过它 |
8Sidecar 代理(Envoy)与流量管理
Sidecar 模式:Istio 通过自动注入(Injection)为每个 Pod 添加一个 Envoy 代理容器,所有进出 Pod 的网络流量都被 Envoy 拦截和处理。
Envoy:Lyft 开发的高性能 L4/L7 代理,CNCF 毕业项目,是 Istio 数据面核心。能力:L7 路由(基于 HTTP 头/路径/权重)、负载均衡、熔断、重试、超时、自动 mTLS、可观测性(Prometheus 指标 + Jaeger 追踪)。
流量管理
- VirtualService(路由规则):决定请求到达 Service 后,去哪个版本的 Pod。
- DestinationRule:定义子集(Subsets,把一个 Service 的 Pod 划分为 v1、v2)与 TrafficPolicy(负载均衡策略、连接池、熔断)。
9mTLS 安全与金丝雀发布
Istio 安全:mTLS
mTLS(Mutual TLS)是双向 TLS 认证。传统 TLS 只有客户端验证服务端证书,mTLS 要求双方互相验证身份。流程:Citadel 为每个服务自动签发 X.509 证书 → Envoy 自动用证书建立 mTLS 连接 → 应用代码无需修改,加密对应用透明。
金丝雀发布(Canary Release)
渐进式发布策略:先将少量流量导向新版本,观察无异常后逐步扩大,直到全量切换。Istio 通过修改 VirtualService 权重实现:
# 阶段1: v1=100%, v2=0% → 部署 v2,不导流量
# 阶段2: v1=90%, v2=10% → 10% 流量到 v2,观察指标
# 阶段3: v1=50%, v2=50% → 扩大到 50%
# 阶段4: v1=0%, v2=100% → 全量切换到 v2
| 策略 | 原理 | 风险 | 回滚速度 |
|---|---|---|---|
| 滚动更新 | 逐步替换旧 Pod | 中等 | 慢(需回滚 Deployment) |
| 蓝绿部署 | 两套完整环境切换 | 低 | 快(切换路由) |
| 金丝雀发布 | 按比例分流 | 最低 | 最快(调整权重) |
| A/B 测试 | 按条件(用户/地区)分流 | 低 | 快 |
⭐重点例题
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: redis-svc # 关联 Headless Service
replicas: 3 # web-0, web-1, web-2 有序固定
selector:
matchLabels: { app: redis }
template:
metadata:
labels: { app: redis }
spec:
containers:
- name: redis
image: redis:7
volumeMounts:
- name: data
mountPath: /data
volumeClaimTemplates: # 每个 Pod 独立 PVC
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 5Gi
关键:StatefulSet 提供有序固定的 Pod 名(redis-0/1/2)、稳定 DNS、每 Pod 独立 PVC(重建后数据保留),配合 Headless Service。
🎯自测(点击展开)
Requests 和 Limits 分别在什么时候起作用?
污点/容忍和亲和性有什么本质区别?
StatefulSet 相比 Deployment 多了什么?
ConfigMap 和 Secret 的区别?
PV、PVC、StorageClass 三者关系?
Istio 的 mTLS 为什么对应用透明?
📝强化题库
选择题点选即时判分;填空题输入后"检查"或"显示答案"。