🎓 总站 🏠 本课目录 01 概论 02 虚拟化 03 云原生 04 K8s基础 05 K8s进阶 06 消息队列 07 分布式存储 08 分布式文件系统 09 并行编程 10 Spark
云计算技术 · 第5章

Kubernetes 深入与服务网格

深入调度(亲和性/污点)、StatefulSet、配置管理、持久化存储 PV/PVC/StorageClass,以及 Istio 服务网格的 Sidecar、流量管理、mTLS 与金丝雀发布。

📚 学习进度
0%

🎯学习目标

  • 掌握资源请求与限制、调度器预选/优选原理;
  • 理解节点亲和性、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

对比ResourceQuotaLimitRange
作用范围命名空间总量单个 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 的属性,表示可以容忍某节点的污点。

💡 一句话区分亲和性 = Pod 主动选择节点("我想去哪");污点/容忍 = 节点排斥 Pod("谁不能来",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 身份在重建后保持不变。

特性DeploymentStatefulSet
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(配置解耦)

对比ConfigMapSecret
存储内容非敏感配置(DB_HOST、LOG_LEVEL、nginx.conf)敏感信息(密码、Token、TLS 证书)
编码明文键值对Base64 编码(注意:非加密,需配合 etcd 加密)
使用方式环境变量注入 / 卷挂载为文件 / 命令行参数挂载为 tmpfs(内存卷),不写入节点磁盘
💡 ConfigMap 热更新环境变量方式:改后需重启 Pod 才生效;卷挂载方式:kubelet 周期性同步(约 1 分钟)自动更新文件,无需重启(应用需自行实现配置热加载,如 watch 文件变化)。

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)

Pod使用存储 PVC存储请求(声明) PV存储资源 底层存储云盘/NFS/Ceph 绑定
图1 · K8s 存储三层架构:Pod → PVC(请求)→ PV(资源)→ 底层存储,PVC 与 PV 绑定
概念全称说明
PVPersistentVolume集群级存储资源,由管理员预创建或动态供给
PVCPersistentVolumeClaimPod 对存储的请求声明(大小、访问模式)
StorageClass定义存储类型和供给策略,支持动态创建 PV

访问模式与回收策略

访问模式缩写说明
ReadWriteOnceRWO单节点读写(最常用)
ReadOnlyManyROX多节点只读
ReadWriteManyRWX多节点读写(需 NFS/CephFS 等共享存储)
回收策略说明
RetainPVC 删除后 PV 保留(手动回收)
DeletePVC 删除后 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)——语言绑定、侵入性强。

服务网格(Service Mesh)是专门处理服务间通信的基础设施层,通过在每个服务旁部署轻量级网络代理(Sidecar),以透明方式处理服务发现、负载均衡、故障恢复、指标采集和安全通信。——William Morgan, Buoyant CEO, 2017
对比传统 SDK 方式Service Mesh
通信逻辑嵌入业务代码下沉到基础设施
语言语言绑定(Java SDK 不能用于 Go)语言无关(Sidecar 代理)
升级需修改并重新部署所有服务升级代理不影响业务代码
策略每个服务单独实现熔断/限流统一策略管理

Istio 架构(控制面 + 数据面)

Istio 由 Google、IBM、Lyft 共同开发,是最流行的 Service Mesh 实现。

控制面 istiodPilot(下发规则) · Citadel(证书/mTLS) · Galley(配置) 数据面(每个 Pod 注入 Envoy Sidecar) Pod A 业务容器 EnvoySidecar Pod B 业务容器 EnvoySidecar mTLS 加密
图2 · Istio 架构:控制面 istiod 下发规则/签发证书;数据面 Envoy Sidecar 拦截所有流量,服务间走 mTLS
组件功能
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 连接 → 应用代码无需修改,加密对应用透明

金丝雀发布:v2 流量比例逐步提升 阶段1v1 100% / v2 0% 阶段2v1 90% / v2 10% 阶段3v1 50% / v2 50% 阶段4v1 0% / v2 100% Istio 通过修改 VirtualService 权重实现,异常可秒级回滚
图3 · 金丝雀发布:v2 流量从 0% → 10% → 50% → 100% 渐进切换,观察指标无异常再放量

金丝雀发布(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 测试按条件(用户/地区)分流
💡 Istio 金丝雀优势流量权重精确到 1%;基于请求内容(Header/Cookie/URL)路由;修改 VirtualService 实时生效;回滚零成本(权重调回 100% v1)。

重点例题

例题1:说明 Sidecar 的作用 问:Service Mesh 中 Sidecar 代理起什么作用?为什么比传统 SDK 好? 答:Sidecar(如 Envoy)部署在每个 Pod 旁,拦截所有进出流量,把服务发现、负载均衡、熔断、重试、mTLS 加密、监控等通信逻辑从业务代码下沉到基础设施层。相比传统 SDK 的优势:① 语言无关(不绑定 Java/Go);② 升级代理不动业务代码;③ 统一策略管理;④ 对应用透明无侵入。
例题2:StatefulSet 部署 3 副本 Redis
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。
例题3:金丝雀 vs 蓝绿 vs 滚动更新怎么选? 答:追求最低风险、最快回滚且能精确控流量 → 金丝雀(按权重逐步放量,Istio 调权重秒级回滚);资源充足、要求干净切换 → 蓝绿(两套环境切路由);资源有限、可接受中等风险 → 滚动更新(逐步替换,但回滚需重新 rollout,较慢)。

🎯自测(点击展开)

Requests 和 Limits 分别在什么时候起作用?
Requests 是调度依据(保底,节点须满足);Limits 是运行上限(CPU 超限流、内存超 OOM)。
污点/容忍和亲和性有什么本质区别?
亲和性是 Pod 主动选节点("我想去哪");污点是节点排斥 Pod("谁不能来"),Pod 用 Toleration 声明豁免。
StatefulSet 相比 Deployment 多了什么?
稳定的网络标识(有序固定名 + 稳定 DNS)、每 Pod 独立 PVC(重建后存储保留)、有序启停。适合数据库等有状态应用。
ConfigMap 和 Secret 的区别?
ConfigMap 存非敏感配置(明文);Secret 存敏感信息(Base64 编码,非加密,挂载为 tmpfs 内存卷)。
PV、PVC、StorageClass 三者关系?
PVC 是 Pod 的存储请求声明,PV 是实际存储资源,二者绑定;StorageClass 定义供给策略,支持动态自动创建 PV。
Istio 的 mTLS 为什么对应用透明?
Citadel 自动签发证书,Envoy Sidecar 自动建立 mTLS 连接,加密在 Sidecar 完成,业务代码无需任何修改。

📝强化题库

选择题点选即时判分;填空题输入后"检查"或"显示答案"。

已答 0/0答对 0正确率
已答 0/0答对 0