全局加速的副作用
接入后所有出向流量都改道
容器内的内网调用、云元数据访问、数据库连接一并被送进加速链路,表现为接口变慢、连接超时,甚至把实例凭据暴露给第三方链路。开关只有开与关两种粒度,无法只对某类流量生效。
分流引擎在容器网络命名空间内逐层匹配规则,为每条连接决定走加速出口还是直连。本文给出六个维度的完整优先级、规则文件写法、典型配置示例与命中审计方式。所有示例配置基于 v2.4.1 的规则格式,可直接作为部署基线。
全局加速和按域名分流都只解决了部分问题。分流引擎要做的是把「哪些流量走哪个出口」变成一份可版本管理、可审计的显式配置。
接入后所有出向流量都改道
容器内的内网调用、云元数据访问、数据库连接一并被送进加速链路,表现为接口变慢、连接超时,甚至把实例凭据暴露给第三方链路。开关只有开与关两种粒度,无法只对某类流量生效。
只看得到域名,看不到发起方
域名表无法覆盖镜像仓库、CDN 短链与解析结果动态变化的场景;同一域名在不同工作负载里的意图也不相同。缺少进程、镜像与标签这些维度,规则会迅速膨胀且互相冲突。
无法回答「这条流量走了哪个出口」
当合规要求按租户、按命名空间区分出口时,单一全局配置不产生任何归属证据。缺少命中记录,审计只能靠事后抓包反推,结论不可复现。
优先级数字越小越先匹配。命中任一维度后立即停止向下遍历,后面的规则不再评估。默认动作固定为 999,作为兜底。
| 优先级 | 匹配维度 | 匹配对象 | 规则写法示例 | 命中后动作 |
|---|---|---|---|---|
| 100 | 标签 | 容器或工作负载 label | kl.route=proxy | 整容器强制走代理 |
| 200 | 镜像名 | 容器镜像引用 | registry.cn-hangzhou.aliyuncs.com/acme/* | 该镜像的出向流量走代理 |
| 300 | 进程名 | 容器内发起连接的进程 | npm | pip | gradle | 仅构建类进程走代理 |
| 400 | 域名 | 连接目标域名 | *.npmjs.org | 命中域名走代理,其余直连 |
| 500 | IP 段 | 目标地址 | 10.0.0.0/8, 172.17.0.0/16 | 内网地址段保持直连 |
| 600 | 端口 | 目标端口 | 443, 8443 | 仅匹配端口走代理 |
| 999 | 默认动作 | 以上均未命中的流量 | default: direct | 兜底直连 |
云厂商实例元数据服务位于链路本地地址段 169.254.0.0/16。该网段被送入代理出口意味着实例凭据要经过第三方链路:轻则元数据请求超时、业务取不到实例身份,重则构成凭据外泄。引擎为该网段保留强制直连路径,无论是否被其它规则覆盖都不会改写其出口。请勿为该网段编写任何指向 proxy 的规则。
规则文件为 YAML,挂载到容器的 /etc/kl/rules.yaml。文件顶层只有 default 与 rules 两项,rules 为有序列表,顺序即优先级顺序。
default: direct # 兜底动作:未命中任何规则时直连
rules:
# 优先级 100 · 标签:调度侧的显式意图,最高优先级
- label: kl.route=proxy
action: proxy
# 优先级 200 · 镜像名:同类镜像整体划到加速出口
- image: "registry.cn-hangzhou.aliyuncs.com/acme/*"
action: proxy
# 优先级 300 · 进程名:只把构建类进程放进加速链路
- process: "npm|pip|gradle"
action: proxy
# 优先级 400 · 域名:支持 *. 前缀通配
- domain: "*.npmjs.org"
action: proxy
# 优先级 500 · IP 段:逗号分隔,内网地址段保持直连
- cidr: "10.0.0.0/8,172.17.0.0/16"
action: direct
# 优先级 600 · 端口:逗号分隔,仅匹配端口走代理
- port: "443,8443"
action: proxy
direct 或 proxy,对应优先级 999。缺省时按 direct 处理。label、image、process、domain、cidr、port。同一条规则里混合多个字段不会被解析。image 与 domain 支持 * 通配;process 支持 | 分隔的多个候选;cidr 与 port 支持逗号分隔的多个取值。direct 或 proxy,表示命中后该连接的出口。/etc/kl/rules.yaml,由 --config /etc/kl/rules.yaml 指定。文件内容变化后进程重新加载规则表,加载失败时保留上一份可用规则。规则文件是纯文本,适合与业务代码一起进版本库、评审后发布。修改规则不需要重建镜像或重启业务容器,先在预发环境用同一份文件验证命中情况,再灰度到生产。完整发布流程见 快连VPN 部署文档。
下面三段配置覆盖最常见的三类需求:构建加速、多出口审计、内网强制直连。均为完整可读版本,可直接改写为部署基线。
构建容器内除了依赖下载,还会访问内网制品库与云元数据。用镜像名规则把构建流量整体划到加速出口,同时保留内网直连路径:
rules.yaml · CI 构建default: direct
rules:
# 构建容器整体走加速
- image: "registry.cn-hangzhou.aliyuncs.com/acme/builder/*"
action: proxy
# 内网制品库保持直连,避免绕行
- cidr: "10.0.0.0/8,172.17.0.0/16"
action: direct
# 云元数据必须直连
- cidr: "169.254.0.0/16"
action: direct
未给构建容器打标签时,镜像名规则即可生效;若该镜像还有需要直连的使用场景,改用标签规则显式指定,避免影响同一镜像的其它引用。相关场景说明见 场景方案。
集群内不同命名空间需要走不同出口时,用标签区分出口组。每条命中都会产生决策记录,可用于回答「这条流量走了哪个出口」:
rules.yaml · 多出口default: direct
rules:
# 出口 A:研发命名空间
- label: kl.route=proxy
action: proxy
note: "出口A / egress-a"
# 出口 B:测试命名空间走另一条链路
- label: kl.route=proxy-b
action: proxy
note: "出口B / egress-b"
# 生产命名空间显式直连
- label: kl.route=direct
action: direct
note 字段为可选备注,用于在审计输出中标注出口归属,示例值仅为口径说明。命名空间维度的隔离原理见 容器网络隔离。
作为其它规则的基础底稿,建议每个环境都保留这一段,避免新增规则时把内网与元数据地址误送进加速链路:
rules.yaml · 强制直连底稿default: proxy # 默认走加速,其余显式例外
rules:
# 内网地址段直连
- cidr: "10.0.0.0/8,172.16.0.0/12,172.17.0.0/16,192.168.0.0/16"
action: direct
# 链路本地与云元数据直连,任何情况下不改写
- cidr: "169.254.0.0/16"
action: direct
# 集群内部服务地址直连
- domain: "*.svc.cluster.local,*.internal.corp"
action: direct
这一段把默认动作改为 proxy,因此所有内网类目标都必须显式列出。规则越完备越需要定期复核,复核方式见 常见问题。
每条连接在确定出口的同时产生一条决策记录,包含规则编号、命中维度、动作与时间戳四个字段,用于解释分流行为与核对配置。
docker exec kl-proxy kl-ctl status
| 字段 | 含义 | 排查用途 |
|---|---|---|
| rule | 命中的规则编号与优先级 | 判断命中的是不是预期那条规则 |
| dimension | 命中维度:label / image / process / domain / cidr / port / default | 定位是哪一层规则生效 |
| action | 该连接的出口动作:proxy 或 direct | 确认流量最终走了哪条链路 |
| at | 决策时间戳 | 与业务侧日志对齐,定位变更引入的时间点 |
审计记录中只有规则编号、命中维度、动作与时间戳,不包含访问域名、目标 IP、会话内容与账号标识,因此可用于导出与交付。日志白名单范围、崩溃转储关闭与内存中的密钥生命周期说明见 零日志隐私栈。
若命中结果与预期不符,先核对容器标签与规则文件是否匹配,再确认维度顺序是否符合 优先级表;镜像启动参数与规则挂载方式见 部署文档。
引擎按「标签 → 镜像名 → 进程名 → 域名 → IP 段 → 端口 → 默认动作」的顺序逐层匹配,命中任一维度即停止向下遍历,对应优先级 100、200、300、400、500、600、999。标签放在最前,是因为它代表调度侧的显式意图:同一个镜像可能同时被需要加速和需要直连的工作负载引用,只有容器或工作负载级的标签能区分这两种用法。
未命中任何维度的流量走配置里的默认动作,即 default: direct。默认动作可以改成 proxy,但建议保持 direct:这样新增流量必须被显式规则覆盖,规则遗漏时表现为「没走加速」而不是「被静默代理」,排查成本更低。
169.254.0.0/16 是云厂商实例元数据服务所在的链路本地地址段。把它送进代理出口意味着把实例凭据交给第三方链路:轻则元数据请求超时导致业务取不到实例身份,重则构成凭据外泄。引擎为该网段保留强制直连路径,即使其它规则命中也不改写其出口。
规则文件以只读卷挂载到 /etc/kl/rules.yaml,进程按固定间隔比对文件内容,检测到变更后重新加载规则表并输出一次加载事件,无需重建容器,也不需要重启业务容器。加载失败时保留上一份可用规则并在状态输出中给出原因码。