Kubernetes 知识
-
date_range 23/01/2023 12:12
点击量:次infosortCNCFlabel
Kubernetes 核心知识体系
面向 P7/P8 架构师面试的 K8s 深度知识整理
一、CRD / Operator 核心机制
1.1 Reconcile 函数——所有 Operator 的核心
期望状态(Spec) vs 实际状态(Status) → 执行动作 → 收敛
CRD(Custom Resource Definition)本质上是在 etcd 中注册一种新的资源类型,让 API Server 能够识别并存储自定义资源对象。Operator 则是基于 Controller 模式的扩展——通过 Informer 机制监听 CRD 资源的变化事件(Add / Update / Delete),将事件放入 WorkQueue,由 Reconcile Loop 消费并驱动系统状态向期望状态收敛。
1.2 与 Java SPI 的类比
| 层级 | 机制 | 作用 |
|---|---|---|
| 应用层 | Java SPI | 动态加载 .jar 插件 |
| 平台层 | K8s CRD | 动态扩展 API,加载新资源类型 |
面试话术:
“SPI 让 Java 应用可以动态加载插件,CRD 让 K8s 平台可以动态扩展 API。我们在 PaaS 层用 CRD 定义了 TenantConfig 资源,Operator 自动根据租户配置创建对应的 Namespace、ResourceQuota、NetworkPolicy,实现了租户 onboard 自动化。”
二、RBAC 与 OPA 的互补关系
| 维度 | RBAC | OPA(Gatekeeper) |
|---|---|---|
| 控制层面 | 谁能操作什么资源 | 操作的内容是否合规 |
| 示例 | 开发者有权创建 Deployment | Deployment 是否设置了资源限制、是否使用了 latest 标签 |
“RBAC 和 OPA 是互补的——RBAC 控制’谁能操作什么资源’,OPA 控制’操作的内容是否合规’。比如开发者有权创建 Deployment(RBAC 允许),但 OPA 会检查这个 Deployment 是否设置了资源限制、是否使用了 latest 标签(策略合规)。”
三、配置管理
| 类型 | 用途 | 示例 |
|---|---|---|
| ConfigMap | 明文配置 | 数据库地址、端口号、功能开关 |
| Secret | 加密配置 | 密码、Token、证书 |
四、Elevate-SaaS 多租户隔离四层模型
第1层:Namespace 隔离(资源边界)
→ 每个租户一个 namespace
第2层:RBAC 隔离(权限边界)
→ 租户只能访问自己的 namespace
第3层:NetworkPolicy / Kube-OVN VPC 隔离(网络边界)
→ 租户之间网络不通
第4层:ResourceQuota 隔离(资源边界)
→ 每个租户限制 CPU/内存/存储上限
五、存储体系:PVC / PV / StorageClass
PVC = 租户说"我要一块 50G 的硬盘"(申请)
PV = 实际提供的硬盘(Longhorn 自动创建)
SC = StorageClass,定义用什么存储后端(Longhorn/Ceph/EBS)
调用链路:
PVC → 找匹配的 SC → SC 调用 CSI → CSI 让 Longhorn 创建实际的卷 → 绑定为 PV
六、K8s 请求全链路
用户请求
↓
Ingress / Gateway(Emissary)→ 外部流量入口
↓
Service(ClusterIP / NodePort)→ 服务发现 + 负载均衡
↓
Deployment / StatefulSet / DaemonSet → 管理 Pod 生命周期
↓
Pod(容器 + Sidecar)→ 跑你的代码
↓
ConfigMap(配置)+ Secret(密码)→ 注入环境变量
↓
PVC / PV(Longhorn)→ 持久化存储
↓
Namespace → 以上所有资源的隔离边界
↓
RBAC → 谁能操作这些资源
↓
CRD + Operator → 扩展以上所有(VirtualMachine、Vpc...)
七、Multus 多网卡方案
7.1 为什么需要 Multus
Kubernetes 默认每个 Pod(或 KubeVirt 的 VMI)只有一张网卡(eth0),由集群的主 CNI(比如 Calico、Flannel)管理。但 VNF 天然需要多张网卡——管理口、WAN 口、LAN 口各一张。
Multus 就是一个 “CNI 多路复用器”,它本身不做网络,而是让你在主 CNI 之外,再给 Pod/VM 额外挂多张网卡,每张网卡可以用不同的网络插件。
类比: 主 CNI 像每个房间标配的一个网口,Multus 就是一个多口交换机,让你在这个房间里再接几根额外的网线,每根线还可以来自不同的运营商。
7.2 工作流程
- 定义
NetworkAttachmentDefinition(NAD)CRD,描述额外网卡用什么插件、连哪个网段 - 在 Pod/VMI 的 annotation 里引用这些 NAD
- Multus 在 Pod 创建时依次调用各个 CNI 插件,把网卡都挂上
八、OVN / OVS 与服务链串接
8.1 核心概念
| 组件 | 角色 | 说明 |
|---|---|---|
| OVS(Open vSwitch) | 数据面引擎 | 软件交换机,跑在每个节点上,核心能力是可编程的流表 |
| OVN | 控制面大脑 | OVS 之上的逻辑网络抽象,提供逻辑交换机、逻辑路由器、ACL、NAT |
8.2 服务链串接:vRouter → vFirewall → vLB
思路一:OVS 流表手动编排(底层但精确)
# 用户流量进来 → 转给 vRouter 的 port
table=0, in_port=外部入口, actions=output:vRouter_port
# vRouter 处理完出来 → 转给 vFirewall
table=0, in_port=vRouter_out, actions=output:vFirewall_port
# vFirewall 处理完 → 转给 vLB
table=0, in_port=vFirewall_out, actions=output:vLB_port
# vLB 处理完 → 转给后端服务
table=0, in_port=vLB_out, actions=output:backend_port
思路二:OVN 逻辑拓扑编排(更高层抽象)
用户 ──▶ [LS-1] ──▶ vRouter ──▶ [LS-2] ──▶ vFirewall ──▶ [LS-3] ──▶ vLB ──▶ [LS-4] ──▶ 后端
每个 VNF 有两张网卡,分别接入前后两个逻辑交换机,流量自然就按拓扑顺序流过去了。OVN 会自动把这个逻辑拓扑编译成底层的 OVS 流表。
8.3 与 SDN 工作的关联
这跟紫金山实验室的 SDN 控制面是同一套思路——通过集中控制器(OVN Northd 相当于一个轻量 SDN Controller)下发转发规则到数据面(OVS)。区别在于 OpenStack Neutron + SFC 插件把这套流程产品化了,有标准的 Port Chain API;而在纯 Kubernetes + KubeVirt 环境下,目前还没有同等成熟度的 SFC 标准,需要自己用 OVN 逻辑拓扑或 OVS 流表来实现。
九、Saga 分布式事务编排
9.1 为什么需要 Saga
单体时代(一个数据库):
@Transactional
public void createOrder() {
orderDao.insert(order); // 写订单表
paymentDao.deduct(amount); // 扣款
inventoryDao.reduce(sku); // 减库存
logisticsDao.create(ship); // 创建物流
}
// 任何一步失败 → 数据库自动全部回滚
微服务时代(每个服务自己的数据库):
订单服务 → 订单数据库
支付服务 → 支付数据库
库存服务 → 库存数据库
物流服务 → 物流数据库
4 个数据库,没法用一个事务包住
9.2 Saga 模式核心逻辑
Saga = 每一步都有对应的”补偿动作”,失败时按反向顺序逐个补偿。
正向流程(每步成功就继续):
① 创建订单 → 成功
② 扣款 → 成功
③ 减库存 → 失败!
反向补偿(从失败点往回退):
③ 库存不用补偿(本来就没减成功)
② 退款(补偿扣款)
① 取消订单(补偿创建订单)
最终:所有操作都撤销,数据一致
类比: 你订了机票 ✅ → 订了酒店 ✅ → 买门票 ❌ 失败 → 自动退酒店 → 自动退机票 → 全部撤销,不用你操心。
9.3 为什么用 Argo Workflows
| 维度 | 传统方式(Java 硬编码) | Argo Workflows |
|---|---|---|
| 补偿逻辑 | 嵌套 try-catch 地狱,散落在各服务代码中 | YAML 声明式,每步独立容器 |
| 耦合度 | 补偿逻辑和业务逻辑耦合 | 补偿逻辑和业务逻辑分离 |
| 失败处理 | 补偿失败了没有重试机制 | 自动重试补偿(可配置次数) |
| 可观测性 | 看不到执行状态,排查困难 | UI 可视化每步状态 |
| 扩展性 | 新增一步要改大量代码 | 新增一步只加一段 YAML |
9.4 执行场景示例
场景1:全部成功 ✅
① 创建订单 → 200 OK, status=CREATED ✅
② 扣款 ¥15999 → 200 OK, status=SUCCESS ✅
③ 减库存 2台 → 200 OK, status=SUCCESS ✅
④ 创建物流 → 200 OK, status=CREATED ✅
Workflow 状态:Succeeded
场景2:第3步库存不足 ❌
① 创建订单 → 200 OK, status=CREATED ✅
② 扣款 ¥15999 → 200 OK, status=SUCCESS ✅
③ 减库存 2台 → INSUFFICIENT_STOCK ❌
→ exit 1 → Argo 检测到失败 → 触发反向补偿链
补偿(反向顺序):
③ 库存不用补偿(本来就没减成功)
② 退款 ¥15999 → 200 OK, status=REFUNDED ✅
① 取消订单 → 200 OK, status=CANCELLED ✅
Workflow 状态:Failed(但数据已补偿)
用户看到:下单失败,库存不足,钱已退回
场景3:第4步物流创建失败 ❌
① 创建订单 ✅
② 扣款 ✅
③ 减库存 ✅
④ 创建物流 ❌(物流系统宕机)
补偿:
④ 物流不用补偿(没创建成功)
③ 恢复库存 +2 ✅
② 退款 ¥15999 ✅
① 取消订单 ✅
最终:所有操作回滚,数据一致
9.5 Argo UI 可视化
全部成功时:
┌──────────────────────────────────────────┐
│ order-saga Succeeded │
│ │
│ [create-order] ✅ │
│ ↓ │
│ [ payment ] ✅ │
│ ↓ │
│ [ inventory ] ✅ │
│ ↓ │
│ [ shipment ] ✅ │
└──────────────────────────────────────────┘
库存不足失败时:
┌──────────────────────────────────────────┐
│ order-saga Failed │
│ │
│ [create-order] ✅ [compensate-order] ✅│
│ ↓ │
│ [ payment ] ✅ [compensate-payment]✅│
│ ↓ │
│ [ inventory ] ❌ INSUFFICIENT_STOCK │
│ │
│ 补偿链自动执行 ✅ │
└──────────────────────────────────────────┘
9.6 传统方式 vs Argo Workflows
传统方式(Java 代码硬编码补偿):
public void createOrder(OrderRequest req) {
try {
orderService.create(req);
try {
paymentService.pay(req);
try {
inventoryService.reduce(req);
try {
logisticsService.create(req);
} catch (Exception e) {
inventoryService.restore(req); // 补偿3
paymentService.refund(req); // 补偿2
orderService.cancel(req); // 补偿1
throw e;
}
} catch (Exception e) {
paymentService.refund(req); // 补偿2
orderService.cancel(req); // 补偿1
throw e;
}
} catch (Exception e) {
orderService.cancel(req); // 补偿1
throw e;
}
} catch (Exception e) {
throw new OrderFailedException(e);
}
}
// 问题:
// ❌ 嵌套 try-catch 地狱
// ❌ 补偿逻辑和业务逻辑耦合
// ❌ 补偿失败了怎么办?没有重试机制
// ❌ 看不到执行状态,排查困难
// ❌ 新增一步要改大量代码
9.7 面试话术
“我们用 Argo Workflows 实现了 Saga 分布式事务编排。传统方式把补偿逻辑硬编码在 Java 嵌套 try-catch 里,耦合度高且无法追踪。我们的方案是把 Saga 流程定义为 Argo Workflow YAML——每个业务步骤(创建订单、扣款、减库存、创建物流)是一个独立容器,每个步骤通过 onExit 关联对应的补偿容器(取消订单、退款、恢复库存、取消物流)。Argo 自动管理执行顺序,任一步骤失败自动触发反向补偿链。配合 Argo UI 可以可视化看到每一步的执行状态和补偿结果,MTTD 从原来的人工排查 30 分钟降到页面上一眼就能看到。整个 Saga 流程对微服务代码无侵入——每个服务只需要暴露正向 API 和补偿 API,编排逻辑完全由 Argo Workflow YAML 管理。”
“Argo Workflows 支持 DAG 和 Steps 两种编排模式。我们的 Saga 事务用 DAG 模式——通过 dependencies 声明步骤间的依赖关系,Argo 自动分析依赖图,没有依赖的步骤并行执行,有依赖的等前置完成。相比 Steps 串行模式,DAG 在复杂订单场景(风控+验证+支付+库存+优惠券+积分)中并行度更高,端到端耗时缩短 40%。”
十、自我介绍模板
“我是风清扬,9年后端/平台架构经验。核心项目有三个:
第一个是 Elevate-SaaS 多租户 PaaS 平台,服务 40+ 行业租户,基于 K8s + Dapr + NocoBase 构建元数据驱动的 aPaaS,实现了租户定制交付从 3 个月压缩到 1 天。
第二个是紫金山实验室的网络云融合平台,基于 SRv6/DetNet 技术的 SDN 控制面开发,实现了确定性网络与云原生架构的融合。
第三个是正在做的 AskOS 企业知识平台,基于 RAG + Agent 架构,多租户知识库管理。
技术栈方面,我对 K8s 生态有完整的实操经验——从裸机搭建 HA 集群、CNCF 全栈组件部署,到 Karmada 多云纳管、KubeVirt 虚拟化、Kube-OVN 网络,全部手操安装调试过。”
评论:
技术文章推送
手机、电脑实用软件分享
微信公众号:AndrewYG的算法世界