ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ACI架构深度解析:从EPG到Contract的SDN策略驱动实践

ACI架构深度解析:从EPG到Contract的SDN策略驱动实践 1. ACI 到底是个什么东西第一次听到 ACI 这个词很多人会以为是某个新出的前端框架或者云服务缩写。其实在数据中心和网络工程圈子里ACI 指的是Application Centric Infrastructure中文一般叫“以应用为中心的基础设施”。它是某家主流网络设备厂商推出的一套软件定义网络SDN架构方案核心思路是把网络策略的制定单位从传统的“IP 地址、VLAN、端口”换成“应用”本身。说白了以前我们配网络脑子里想的是一台台交换机、一条条 ACL、一个个 VLAN 号。而 ACI 想让你换个脑子你先描述“这个应用需要哪些服务、谁能访问谁、走什么路径”剩下的底层网络配置由控制器自动算出来下发。这个控制器就是 ACI 的大脑叫APICApplication Policy Infrastructure Controller。这套东西解决的核心问题是大规模数据中心里网络策略跟业务应用严重脱节。传统网络里加一个新业务可能要改十几台交换机的配置改完还得祈祷别把别的业务搞挂。ACI 把策略集中到 APIC 上用一套对象模型来描述改一处就全局生效。适合谁来了解如果你是数据中心网络运维、云平台工程师、或者正在做多租户隔离方案的人ACI 是绕不开的一个话题。哪怕你所在的环境不用它理解它的“策略驱动”思路对你设计任何网络自动化方案都有参考价值。我下面会从整体设计、核心对象、实操流程、踩坑经验几个角度把 ACI 拆开讲清楚。2. 整体设计与思路拆解2.1 为什么要把“应用”作为策略中心传统网络配置的粒度是设备级的。你要在核心交换机上写一条 ACL得先想清楚源 IP、目的 IP、端口号然后登录设备敲命令。问题在于业务部门跟你说“我要上一个新系统”你根本不知道这个系统对应哪些 IP。你得等服务器上架、IP 分配完、应用部署好才能回头配网络。这个顺序是反的。ACI 的做法是反过来先定义应用轮廓Application Profile里面包含这个应用需要的所有网络连接关系。比如“Web 层能访问 App 层App 层能访问 DB 层外部只能访问 Web 层的 443 端口”。这些描述不依赖具体 IP而是用EPGEndpoint Group来抽象。EPG 可以理解为一组具有相同网络策略的终端集合比如“Web 服务器组”。这里的关键转变是策略从“IP 到 IP”变成了“组到组”。组里的成员可以动态变化策略本身不用改。2.2 底层靠什么实现策略自动下发APIC 把用户定义的策略翻译成底层交换机的配置靠的是VXLAN隧道和COOP协议。每台接入交换机Leaf会把本地终端的 MAC、IP 信息通过 COOP 上报给 APIC 和 Spine 交换机。Spine 相当于一个分布式数据库知道哪个终端挂在哪个 Leaf 上。当 Web 层要访问 App 层时Leaf 交换机查一下本地有没有目的终端的表项。如果没有就封装成 VXLAN 包发给 SpineSpine 再转发给正确的 Leaf。整个过程对服务器完全透明服务器看到的还是普通以太网帧。这种设计的好处是终端可以在任意 Leaf 下接入IP 地址不用变策略自动跟随。虚拟机迁移、容器漂移都不会导致策略失效。坏处是 Spine 层需要维护全网的终端表项规模特别大时对硬件资源有要求。2.3 跟传统 VLAN 方案的对比对比维度传统 VLAN 方案ACI 方案策略单位VLAN ACLEPG Contract配置方式逐台设备 CLIAPIC 集中定义终端移动需重新配 VLAN自动跟随多租户隔离靠 VLAN 划分靠 Tenant VRF自动化能力弱依赖脚本强原生 API学习曲线平缓陡峭这张表不是要证明 ACI 全面优于传统方案。实际上如果你只有几十台服务器、一个业务系统传统 VLAN 方案更简单直接。ACI 的价值在规模上——当你有上千台虚拟机、几十个业务系统、多个租户需要隔离时集中策略管理的优势才会显现。3. 核心对象模型与实操要点3.1 从 Tenant 到 EPG 的层级关系ACI 的对象模型是一棵树根是Tenant租户。Tenant 下面可以分VRF虚拟路由转发实例、Bridge Domain桥接域、Application Profile应用轮廓。Application Profile 下面才是EPG。EPG 里挂的是具体的终端可以是物理服务器、虚拟机、容器。这个层级不是随便设计的。Tenant 对应一个业务单元或客户VRF 对应一个独立的路由表Bridge Domain 对应一个二层广播域。这样设计的好处是不同 Tenant 之间默认完全隔离连路由都不通。如果你需要两个 Tenant 互通必须显式配置共享服务或外部连接。新手最容易犯的错把所有东西都塞在一个 Tenant 里。这样虽然省事但失去了多租户隔离的意义。建议至少按业务系统分 Tenant哪怕初期只有一个业务。3.2 Contract 才是策略的核心EPG 本身不定义“谁能访问我”它只定义“我包含哪些终端”。真正的访问控制靠Contract契约。Contract 由Provider EPG和Consumer EPG组成。Provider 提供某种服务Consumer 消费这个服务。Contract 里定义FilterFilter 里才是具体的端口和协议。举个例子Web EPG 作为 Provider提供一个 ContractFilter 允许 TCP 443。App EPG 作为 Consumer绑定这个 Contract。这样 App 层就能访问 Web 层的 443 端口。反过来Web 层要访问 App 层需要另一个 ContractProvider 是 App EPGConsumer 是 Web EPG。这种“双向分别定义”的方式一开始会觉得啰嗦但它强制你理清每个方向的访问关系。传统 ACL 里经常出现“源和目的写反了”的低级错误在 Contract 模型里基本不会发生因为方向是由 Provider/Consumer 角色决定的。3.3 实操中必须注意的几个参数Bridge Domain 的 ARP 泛洪设置默认情况下BD 内的 ARP 请求会泛洪到所有 Leaf。如果 BD 里终端很多泛洪会消耗大量带宽。可以开启ARP Flooding的优化选项让 APIC 代答 ARP。但要注意如果终端有静态 ARP 或者特殊网络行为代答可能导致问题。VRF 的 Route Leaking不同 VRF 之间默认不通。如果确实需要互通比如共享服务 VRF 要被多个业务 VRF 访问需要配置 Route Leaking。这个操作在 APIC 界面上叫“Shared Services”底层是通过在 Leaf 上导入导出路由实现的。配置时要注意路由环路建议只做单向导入。EPG 的静态路径绑定物理服务器接入时需要把 EPG 绑定到具体的 Leaf 端口和 VLAN。这里有个坑同一个端口不能同时绑定两个不同 EPG 的相同 VLAN。如果你需要在一个端口上跑多个 EPG必须用不同的 VLAN 封装或者改用 VMM Domain 方式接入。4. 完整实操流程与配置示例4.1 初始化 APIC 集群APIC 通常三台起步组成集群。每台 APIC 需要配置管理 IP、集群 IP、以及跟 Spine 互联的接口。初始化时通过 CLI 或者初始 GUI 完成。# 通过 CLI 配置 APIC 基础参数示例 adminapic1:~ configure apic1# setup # 按提示输入管理 IP、网关、集群名称等 # 三台 APIC 的集群名称必须一致三台 APIC 都配置完后登录任意一台的 GUI在 System Controllers 里应该能看到三台都是“Fully Fit”状态。如果有一台显示“Not Fit”检查集群 IP 是否互通、时间是否同步。时间同步非常重要。APIC 集群内部用证书认证时间偏差超过几分钟就会导致节点掉出集群。建议所有 APIC 和交换机都指向同一个 NTP 源。4.2 创建 Tenant 和 VRF登录 APIC GUI路径是 Tenants Add Tenant。输入 Tenant 名称比如“Prod”。然后在 Tenant 下面创建 VRF名称比如“Prod-VRF”。VRF 里需要设置Policy Control Enforcement默认是“Enforced”表示策略强制生效。如果设为“Unenforced”所有流量都放行一般只在排障时临时用。创建 Bridge Domain 时需要绑定一个 VRF。BD 的L3 Configuration里可以开启“Limit IP Learning To Subnet”防止学习到不该学的 IP。子网网关地址也在这里配比如“10.1.1.1/24”。4.3 定义 Application Profile 和 EPG在 Tenant 下面创建 Application Profile比如“WebApp”。然后在里面创建 EPG比如“Web-EPG”、“App-EPG”、“DB-EPG”。每个 EPG 需要绑定一个 Bridge Domain。如果三个 EPG 在同一个 BD 里它们默认二层互通。如果要隔离需要分到不同 BD。EPG 创建完后需要把终端挂进去。两种方式静态路径适用于物理服务器。选择 Leaf 和端口指定 VLAN。比如 Leaf101 的 eth1/10VLAN 100。VMM Domain适用于虚拟机。需要先集成虚拟化管理平台然后 EPG 绑定 VMM Domain虚拟机的端口组会自动关联。# 通过 APIC REST API 创建 EPG 的示例JSON 格式 POST /api/mo/uni/tn-Prod/ap-WebApp/epg-Web-EPG.json { fvAEPg: { attributes: { dn: uni/tn-Prod/ap-WebApp/epg-Web-EPG, name: Web-EPG, rn: epg-Web-EPG, status: created }, children: [ { fvRsBd: { attributes: { tnFvBDName: Web-BD } } } ] } }4.4 配置 Contract 和 Filter先创建 Filter比如“Allow-HTTPS”里面加一条规则源端口任意目的端口 443协议 TCP。然后创建 Contract比如“Web-Contract”把 Filter 绑进去。最后在 Web-EPG 上把 Web-Contract 设为 Provider在 App-EPG 上把 Web-Contract 设为 Consumer。这里有个细节Contract 的作用域是 Tenant 内。如果两个 EPG 在不同 Tenant需要配置Inter-Tenant Contract或者通过 Shared Services 方式。Inter-Tenant Contract 需要在两个 Tenant 里都创建 Contract然后通过 Export/Import 关联。4.5 验证策略是否生效配置完后在 APIC 的Operational标签页里可以看 EPG 的终端学习情况。如果终端已经上线应该能看到 MAC、IP、所在 Leaf 和端口。然后在Contracts里看 Provider/Consumer 的绑定关系是否正确。实际测试时从 App 层服务器 ping Web 层的 443 端口应该通。从 Web 层 ping App 层的 22 端口如果不通说明 Contract 没放行这是符合预期的。如果该通的不通先检查 EPG 的静态路径 VLAN 是否和服务器实际 VLAN 一致再看 Contract 的 Filter 方向有没有写反。5. 常见问题与排查技巧实录5.1 终端学不到 MAC/IP 怎么办这是最常见的问题。终端明明上线了APIC 里就是看不到。排查顺序如下检查物理连接Leaf 端口是否 upVLAN 是否放行。检查 EPG 绑定静态路径的 VLAN 和端口是否正确。如果是 VMM Domain检查虚拟机端口组是否绑到了正确的 EPG。检查 BD 的网关如果终端需要跨子网通信BD 的网关地址必须配且终端网关指向这个地址。检查 COOP 状态在 Leaf 上用show coop命令看跟 Spine 的连接是否正常。如果 COOP 断了终端信息传不到 APIC。我遇到过一次终端能 ping 通网关但 APIC 里就是没表项。最后发现是 Leaf 和 Spine 之间的 IS-IS 邻居没起来COOP 虽然显示 up但底层路由不通。所以排查时不要只看 COOP 状态要确认底层路由。5.2 Contract 配了但不生效Contract 不生效通常有三个原因EPG 没绑定 BDEPG 必须绑定 Bridge Domain否则策略无法下发。Filter 方向反了Filter 里的源端口和目的端口是相对于 Provider 的。比如 Provider 是 Web 服务器监听 443那么 Filter 应该是“目的端口 443”。如果写成“源端口 443”就反了。VRF 的 Policy Control 设成了 Unenforced这样所有 Contract 都被忽略流量全通。检查 VRF 的设置。5.3 多租户环境下路由不通不同 Tenant 之间默认完全隔离。如果需要互通比如 Tenant A 的 Web 层要访问 Tenant B 的 DB 层需要配置Shared Services。具体做法是在 Tenant B 里创建一个 VRF设为 Shared。然后在 Tenant A 的 VRF 里导入 Tenant B 的路由。配置时注意只导入需要的子网不要全导入否则容易出环路。5.4 常见问题速查表现象可能原因排查命令/操作APIC 看不到终端端口 down / VLAN 错 / COOP 断show interface、show coopContract 不生效Filter 方向反 / VRF Unenforced检查 Filter 源目的端口跨 Leaf 不通Spine 路由问题 / VXLAN 隧道 downshow isis adjacency、show vxlan虚拟机迁移后不通VMM Domain 未同步 / EPG 未更新检查 VMM 集成状态APIC 集群节点掉出NTP 不同步 / 证书过期show ntp status、检查证书5.5 几个我踩过的坑坑一BD 子网配大了。比如配了 /16结果 APIC 认为整个 /16 都是本地子网导致本该走路由的流量被二层泛洪。建议 BD 子网按实际需求配一般 /24 足够。坑二静态路径的 VLAN 和服务器不一致。服务器上配的是 VLAN 100Leaf 端口上绑的是 VLAN 200结果就是终端学不到。这个错误很隐蔽因为端口是 up 的但流量就是不通。坑三Contract 的 Filter 用了“Any”。虽然省事但等于没做策略。生产环境建议明确端口和协议哪怕多写几条。坑四忽略 APIC 的 API 速率限制。用脚本批量创建 EPG 时如果并发太高APIC 会返回 429 错误。建议加个延时或者用 APIC 的批量 API。6. 自动化与扩展思路6.1 用 Python 脚本批量管理 ACIAPIC 提供了完整的 REST API用 Python 的 requests 库就能操作。我一般会封装一个简单的客户端类处理认证、重试、错误码。import requests import json import time class AciClient: def __init__(self, apic_ip, username, password): self.base fhttps://{apic_ip}/api self.session requests.Session() self.session.verify False self.login(username, password) def login(self, username, password): payload { aaaUser: { attributes: { name: username, pwd: password } } } resp self.session.post( f{self.base}/aaaLogin.json, datajson.dumps(payload) ) resp.raise_for_status() self.token resp.json()[imdata][0][aaaLogin][attributes][token] def get(self, dn): resp self.session.get(f{self.base}/mo/{dn}.json) return resp.json() def post(self, dn, payload): resp self.session.post( f{self.base}/mo/{dn}.json, datajson.dumps(payload) ) if resp.status_code 429: time.sleep(2) return self.post(dn, payload) return resp.json()这个类处理了 token 认证和 429 重试。实际用的时候可以把创建 Tenant、VRF、BD、EPG 的操作都封装成方法传入 YAML 配置文件实现声明式管理。6.2 跟现有自动化平台集成ACI 的 API 可以跟 Ansible、Terraform 等工具集成。Ansible 有专门的 aci 模块Terraform 也有 aci provider。如果你已经在用这些工具管理基础设施可以把 ACI 的策略也纳入版本控制。我个人的习惯是所有 ACI 配置都通过 Terraform 管理APIC GUI 只用来查看状态和排障。这样每次变更都有记录回滚也方便。6.3 监控和告警APIC 本身有 SNMP、Syslog、REST API 三种监控数据出口。我一般用 Prometheus 的 snmp_exporter 采集 Leaf 和 Spine 的接口流量、CPU、内存用 APIC 的 API 采集 Tenant 和 EPG 的健康状态。告警规则里重点关註COOP 邻居状态、IS-IS 邻居状态、APIC 集群健康度、EPG 终端数量突变。7. 一些个人体会ACI 这套东西刚上手时确实容易被各种对象和术语绕晕。但一旦理解了“Tenant 是隔离边界、EPG 是策略单位、Contract 是访问规则”这个核心逻辑后面的操作就顺了。我建议新手不要一上来就搭全套生产环境先用三台虚拟机装 APIC 模拟器配一个最简单的 Web-App-DB 三层架构把 Contract 的 Provider/Consumer 关系跑通。这个过程走一遍比看十篇文档都管用。另外ACI 的排障跟传统网络差别很大。传统网络你登录设备看路由表、看 ACL 计数就行。ACI 里策略是集中定义的但执行是分布式的所以排查时要同时看 APIC 的策略状态和 Leaf 的底层表项。我一般会先在 APIC 里确认策略绑定关系再去 Leaf 上用show zoning-rule看策略有没有真正下发。如果 APIC 显示正常但 Leaf 没有对应规则多半是 EPG 没绑定 BD 或者 Leaf 跟 APIC 的连接断了。最后说一个实际经验ACI 的版本升级要谨慎。不同大版本之间的对象模型可能有变化升级前一定要在实验室环境验证一遍。我见过一次升级后 Contract 的 Filter 顺序变了导致部分流量被误阻断。升级前备份 APIC 配置升级后逐项验证关键 Contract这个流程不能省。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进