第一章:Go构建多租户隔离云平台:Namespace级RBAC+Quota+NetworkPolicy三维沙箱实现
在Kubernetes原生多租户架构中,Namespace是逻辑隔离的基石。结合Go语言编写的控制平面组件,可动态协调RBAC策略、ResourceQuota与NetworkPolicy,形成纵深防御的租户沙箱。该方案不依赖外部服务网格或定制CRD,完全基于Kubernetes标准API对象实现租户间强隔离。
租户命名空间自动化初始化
通过Go控制器监听Tenant自定义资源(或直接解析租户注册请求),为每个租户创建独立Namespace,并同步注入三类核心对象:
RoleBinding绑定预置tenant-viewerRole,限制仅能读取本Namespace内Pod/Service等资源;ResourceQuota限定CPU(2核)、内存(4Gi)、Pod总数(20)等硬性配额;NetworkPolicy默认拒绝所有入站流量,仅允许来自同一Namespace的Pod通信。
RBAC策略精细化约束
以下Go代码片段用于生成租户专属RoleBinding(省略错误处理):
rb := &rbacv1.RoleBinding{
ObjectMeta: metav1.ObjectMeta{
Name: "tenant-access",
Namespace: tenantNS,
},
Subjects: []rbacv1.Subject{{
Kind: "ServiceAccount",
Name: "default",
Namespace: tenantNS,
}},
RoleRef: rbacv1.RoleRef{
Kind: "Role",
Name: "tenant-restricted",
APIGroup: "rbac.authorization.k8s.io",
},
}
clientset.RbacV1().RoleBindings(tenantNS).Create(context.TODO(), rb, metav1.CreateOptions{})
该Role需预先在集群范围定义,明确禁止secrets、configmaps等敏感资源访问。
配额与网络策略协同生效
典型租户隔离策略组合如下表所示:
| 对象类型 | 关键字段 | 安全意图 |
|---|---|---|
| ResourceQuota | hard.pods: "20" |
防止资源耗尽攻击 |
| NetworkPolicy | policyTypes: ["Ingress"] |
默认拒绝跨Namespace访问 |
| LimitRange | default.cpu: "100m" |
为无声明资源请求设置兜底值 |
所有策略均通过kubectl apply -f tenant-sandbox.yaml一次性部署,确保原子性生效。
第二章:Kubernetes多租户核心机制的Go语言建模与实现
2.1 基于client-go的Namespace生命周期管理与租户注册中心设计
Namespace作为Kubernetes中逻辑隔离的核心单元,天然适合作为租户边界载体。我们通过client-go的DynamicClient与Informer机制实现事件驱动的生命周期感知。
数据同步机制
监听Namespace创建/删除事件,自动向租户注册中心(etcd-backed CRD TenantRegistry)写入元数据:
informer := cache.NewSharedIndexInformer(
&cache.ListWatch{
ListFunc: func(options metav1.ListOptions) (runtime.Object, error) {
return clientset.CoreV1().Namespaces().List(context.TODO(), options)
},
WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
return clientset.CoreV1().Namespaces().Watch(context.TODO(), options)
},
},
&corev1.Namespace{}, 0, cache.ResourceEventHandlerFuncs{
AddFunc: onNamespaceAdded,
DeleteFunc: onNamespaceDeleted,
})
ListFunc初始化全量同步;WatchFunc建立长连接监听;onNamespaceAdded中提取labels["tenant-id"]作为注册键,确保租户ID与Namespace强绑定。
租户状态映射表
| TenantID | Namespace | Phase | LastSyncTime |
|---|---|---|---|
| t-789 | prod-789 | Active | 2024-06-15T08:22Z |
| t-123 | dev-123 | Pending | 2024-06-15T08:20Z |
架构协同流程
graph TD
A[API Server] -->|Watch Event| B[Informer]
B --> C{Is tenant-labeled?}
C -->|Yes| D[Sync to TenantRegistry]
C -->|No| E[Skip]
D --> F[Service Mesh注入策略]
2.2 RBAC策略的动态编排:Role/RoleBinding的Go运行时生成与校验
在多租户Kubernetes平台中,静态RBAC清单难以应对租户按需授权的场景。需在Go运行时动态构造Role与RoleBinding对象,并执行语义校验。
核心生成逻辑
func NewTenantRole(namespace, tenantID string) *rbacv1.Role {
return &rbacv1.Role{
ObjectMeta: metav1.ObjectMeta{
Name: fmt.Sprintf("tenant-%s-editor", tenantID),
Namespace: namespace,
},
Rules: []rbacv1.PolicyRule{{
Verbs: []string{"get", "list", "watch", "create", "update", "delete"},
APIGroups: []string{""},
Resources: []string{"pods", "services", "configmaps"},
}},
}
}
该函数生成命名空间级编辑角色,tenantID注入为名称前缀确保唯一性;Rules限定资源范围,避免越权——例如不开放secrets或nodes等高危资源。
校验流程
graph TD
A[构建Role对象] --> B[Validate APIVersion/Kind]
B --> C[Check resource verbs against whitelist]
C --> D[Ensure no cluster-scoped resources]
D --> E[Return error or valid Role]
授权安全边界(关键约束)
| 约束项 | 允许值 | 说明 |
|---|---|---|
Scope |
Namespaced only | 禁止ClusterRole混用 |
Resources |
pods, services, configmaps |
白名单制,拒绝*通配 |
Verbs |
get, list, create, … |
显式声明,禁用* |
动态生成后必须经Scheme.Default()和validation.ValidateRole()双重校验,方可提交至API Server。
2.3 ResourceQuota与LimitRange的声明式解析与配额实时收敛算法
Kubernetes通过ResourceQuota约束命名空间级总量,LimitRange规范Pod/Container级默认值与边界。二者协同构成两级配额治理闭环。
声明式解析流程
- 解析
ResourceQuota时提取hard与used字段,构建命名空间资源向量; LimitRange按type(Pod/Container/PersistentVolumeClaim)分类加载,默认值注入发生在准入控制阶段。
实时收敛核心机制
# 示例:LimitRange 强制容器级CPU限制
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-limits
spec:
limits:
- default:
cpu: "500m"
defaultRequest:
cpu: "200m"
type: Container
该配置使未显式声明CPU的容器自动获得requests=200m, limits=500m——由LimitRanger插件在MutatingAdmissionWebhook阶段注入,避免因缺失请求值导致调度失败。
| 维度 | ResourceQuota | LimitRange |
|---|---|---|
| 作用域 | Namespace | Namespace |
| 控制粒度 | 总量(如总CPU=4核) | 单实例默认值与上下限 |
| 收敛触发时机 | 资源创建/更新事件驱动 | Pod创建时Mutate阶段注入 |
graph TD
A[API Server接收Pod创建请求] --> B{LimitRanger准入}
B -->|注入默认值| C[生成带requests/limits的Pod]
C --> D[ResourceQuota校验]
D -->|超限则拒绝| E[返回403]
D -->|通过则更新used| F[etcd持久化used状态]
2.4 NetworkPolicy沙箱边界的Go控制器实现:命名空间间流量图谱建模
NetworkPolicy控制器需将Kubernetes原生策略转化为可计算的命名空间级有向流量图。核心在于构建NamespaceGraph结构,实时聚合跨命名空间的允许通信关系。
数据同步机制
控制器监听NetworkPolicy与Namespace事件,通过SharedInformer实现最终一致性同步。
// 构建命名空间间边:src → dst 表示 src 命名空间内Pod可访问 dst 命名空间服务
func (c *Controller) buildEdge(np *networkingv1.NetworkPolicy) []graph.Edge {
edges := make([]graph.Edge, 0)
for _, ingress := range np.Spec.Ingress {
for _, peer := range ingress.From {
if ns := peer.NamespaceSelector; ns != nil {
// 匹配目标命名空间(dst),当前策略所在命名空间为源(src)
dstNSs := c.nsIndexer.ListKeys() // 简化示意
for _, dst := range dstNSs {
edges = append(edges, graph.Edge{
Src: np.Namespace,
Dst: dst,
Weight: 1.0,
})
}
}
}
}
return edges
}
该函数解析ingress.from.namespaceSelector,将策略作用域(np.Namespace)作为流量源,匹配所有满足标签选择器的目标命名空间作为终点,生成带权重的有向边。Weight预留用于QoS或策略优先级扩展。
流量图谱拓扑结构
| 源命名空间 | 目标命名空间 | 协议/端口约束 | 策略来源 |
|---|---|---|---|
tenant-a |
core-db |
TCP/5432 | allow-db-access |
tenant-b |
core-db |
TCP/5432 | allow-db-access |
graph TD
A[tenant-a] -->|TCP/5432| C[core-db]
B[tenant-b] -->|TCP/5432| C
C -->|拒绝| D[tenant-c]
2.5 多租户元数据一致性保障:etcd事务封装与租户级watch事件过滤
在多租户Kubernetes控制平面中,租户元数据(如TenantNamespace、QuotaPolicy)需严格隔离且强一致。直接裸调用etcd Txn()易导致跨租户误写或漏监听。
数据同步机制
采用租户前缀隔离 + etcd事务原子封装:
func UpdateTenantResource(tenantID string, key, value string) error {
prefix := fmt.Sprintf("/tenants/%s/", tenantID)
txn := client.Txn(ctx).
If(clientv3.Compare(clientv3.Version(prefix+"config"), "=", 0)).
Then(clientv3.OpPut(prefix+"config", value, clientv3.WithLease(leaseID))).
Else(clientv3.OpGet(prefix+"config"))
resp, err := txn.Commit()
// ...
}
逻辑说明:
Compare(...Version, "=", 0)确保首次写入;WithLease绑定租户会话生命周期;prefix硬隔离避免键冲突。事务失败时自动回滚,无中间态。
租户级Watch过滤
Watch需按租户前缀+事件类型双重过滤:
| 过滤维度 | 示例值 | 作用 |
|---|---|---|
| Key前缀 | /tenants/acme/ |
隔离租户数据空间 |
| Event类型 | PUT, DELETE |
排除非变更事件(如NOP) |
graph TD
A[etcd Watch Stream] --> B{Key.startsWith<br>/tenants/acme/}
B -->|Yes| C{Event.Type == PUT/DELETE}
C -->|Yes| D[Notify TenantController]
C -->|No| E[Drop]
B -->|No| E
第三章:三维隔离策略协同引擎的设计与落地
3.1 RBAC-Quota-NetworkPolicy策略冲突检测的图论建模与Go实现
将Kubernetes中RBAC规则、ResourceQuota约束与NetworkPolicy流量策略统一建模为有向属性图(Directed Labeled Graph):节点表示主体(ServiceAccount)、资源(Pod/Service)、命名空间;边携带策略类型标签与作用域约束。
图结构核心要素
- 节点属性:
kind,namespace,name,labels - 边属性:
policyType: "rbac"|"quota"|"network",effect: "allow"|"deny"|"enforce",priority
冲突判定逻辑
// ConflictEdge 表示两类策略间潜在冲突的边
type ConflictEdge struct {
SourcePolicyID string // e.g., "rbac:ns1:admin"
TargetPolicyID string // e.g., "network:ns1:deny-external"
ConflictType string // "scope-overlap", "permission-inversion", "quota-bypass"
}
该结构用于构建策略依赖图,SourcePolicyID与TargetPolicyID通过命名空间与选择器标签进行拓扑可达性分析,ConflictType由边语义规则引擎动态推导。
策略冲突类型映射表
| 冲突类型 | 触发条件 | 检测复杂度 |
|---|---|---|
| scope-overlap | NetworkPolicy podSelector 与 RBAC resourceNames 交集非空 |
O(n·m) |
| permission-inversion | RoleBinding 允许 create/pods,但 NetworkPolicy 阻断所有出口 |
O(1) |
| quota-bypass | ResourceQuota 限制 pods=10,但多个 Role 共享同一 SA 导致隐式超配 |
O(k²) |
graph TD
A[RBAC Rule] -->|subject→role→verb→resource| B[Access Graph]
C[NetworkPolicy] -->|podSelector→egress| D[Traffic Graph]
E[ResourceQuota] -->|hard: pods=5| F[Capacity Graph]
B & D & F --> G[Unified Policy Graph]
G --> H{Conflict Detector}
H --> I["scope-overlap?"]
H --> J["permission-inversion?"]
H --> K["quota-bypass?"]
3.2 租户沙箱启动时序控制:三阶段准入钩子(Admission Webhook)的Go服务化封装
租户沙箱启动需在 Mutating → Validating → Post-Start 三个关键切面注入可控逻辑,我们将其抽象为可插拔的 Go 接口:
type AdmissionStage interface {
Name() string
Execute(ctx context.Context, req *admissionv1.AdmissionRequest) (*admissionv1.AdmissionResponse, error)
}
该接口统一了各阶段的调用契约,Name() 用于日志追踪与指标打标,Execute() 封装了租户上下文解析、配额校验、网络策略注入等业务逻辑。
三阶段职责对比
| 阶段 | 触发时机 | 典型操作 | 是否可修改对象 |
|---|---|---|---|
| Mutating | 对象创建/更新前 | 注入默认标签、Sidecar配置 | ✅ |
| Validating | Mutating后、持久化前 | 校验租户配额、命名空间白名单 | ❌ |
| Post-Start | Pod Ready后 | 初始化沙箱文件系统、加载密钥 | ❌(仅事件驱动) |
执行时序流程
graph TD
A[API Server接收请求] --> B[Mutating Webhook]
B --> C[Validating Webhook]
C --> D[etcd写入]
D --> E[Scheduler调度]
E --> F[Post-Start Hook监听PodReady]
服务化封装通过 StageChain 实现链式编排,支持按租户ID动态启用/跳过某阶段,提升多租户隔离弹性。
3.3 隔离策略变更的原子性交付:基于Kubernetes API Server Subresource的PATCH语义增强
传统 PUT 替换方式易导致隔离策略(如 NetworkPolicy 的 spec.podSelector)在更新中途出现短暂不一致。Kubernetes v1.22+ 支持对 status 和自定义 subresource(如 /scale, /apply) 的精准 PATCH,而 isolation.k8s.io/v1alpha1 CRD 可注册 spec.isolationMode 为可 PATCH 子资源。
原子性 PATCH 请求示例
# PATCH /apis/isolation.k8s.io/v1alpha1/namespaces/default/policies/web-policy/spec.isolationMode
Content-Type: application/strategic-merge-patch+json
{
"isolationMode": "strict"
}
逻辑分析:该请求仅修改子资源字段,API Server 在 etcd 层执行单 key 更新(
/registry/isolation.k8s.io/policies/.../spec.isolationMode),规避了全量对象反序列化与校验开销,确保变更不可分割。Content-Type指定战略合并语义,支持字段级增量覆盖。
关键优势对比
| 特性 | 全量 PUT | Subresource PATCH |
|---|---|---|
| 原子性 | ❌(多字段竞态) | ✅(单字段 etcd 写入) |
| 客户端冲突处理 | 需重试整个 spec | 仅重试目标子资源字段 |
graph TD
A[客户端发起 PATCH] --> B[API Server 路由至 subresource handler]
B --> C[校验 isolationMode 字段合法性]
C --> D[直接写入 etcd 对应 subresource path]
D --> E[广播事件至所有 watch 该 subresource 的控制器]
第四章:生产级高可用与可观测性增强实践
4.1 租户级指标采集:Prometheus Exporter的Go定制开发与多租户标签注入
为实现租户隔离的可观测性,需在指标暴露层动态注入 tenant_id、environment 等维度标签。
核心设计原则
- 指标注册与租户上下文解耦
- 标签注入在采集阶段完成,而非查询时重写
- 支持运行时热加载租户配置
多租户指标注册示例
// 构建带租户标签的GaugeVec
tenantGauge := prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Namespace: "app",
Subsystem: "cache",
Name: "hit_ratio",
Help: "Cache hit ratio per tenant",
},
[]string{"tenant_id", "cluster", "shard"}, // 显式声明租户维度
)
该定义确保每个指标样本天然携带租户标识;tenant_id 作为第一标签,利于Prometheus按租户高效分片查询与权限控制。
标签注入流程
graph TD
A[HTTP /metrics 请求] --> B{解析请求头 X-Tenant-ID}
B -->|存在| C[绑定租户上下文]
B -->|缺失| D[返回400或默认租户]
C --> E[调用 Collect() 注入 labels]
E --> F[序列化为文本格式]
关键配置项对照表
| 配置项 | 类型 | 说明 |
|---|---|---|
tenant_header |
string | 提取租户ID的HTTP头名,默认 X-Tenant-ID |
default_tenant |
string | 未提供租户头时的兜底值 |
label_whitelist |
[]string | 允许透传至指标的额外标签列表 |
4.2 沙箱异常自愈:基于Controller Runtime的Quota超限自动降级与告警联动
当沙箱资源配额(如 CPU、内存、Pod 数量)被突破时,传统方案依赖人工介入或静态驱逐策略,响应滞后且缺乏上下文感知。我们基于 Controller Runtime 构建闭环自愈控制器,实时监听 ResourceQuota 状态变更。
自愈触发逻辑
控制器监听 ResourceQuota 的 status.hard 与 status.used 差值,当 used > hard * 0.95 时触发降级流程:
if quota.Status.Used != nil && quota.Spec.Hard != nil {
if isQuotaExceeded(quota.Status.Used, quota.Spec.Hard, 0.95) {
degradeSandbox(quota.Namespace) // 启动沙箱降级:缩容非关键 Pod、禁用 CronJob
sendAlert(quota.Namespace, "QUOTA_EXCEEDED_CRITICAL")
}
}
该逻辑在
Reconcile方法中执行;degradeSandbox()调用client.Patch()原地更新沙箱标签sandbox-status=degraded,驱动下游组件执行轻量级保活策略。
降级动作映射表
| 动作类型 | 触发条件 | 生效范围 |
|---|---|---|
| Pod 缩容 | 内存使用率 > 95% | 标签 tier=dev |
| CronJob 暂停 | CPU 配额超限持续 2min | 全沙箱命名空间 |
| 日志采样降频 | Pod 数量超限 | app=collector |
告警联动路径
graph TD
A[Quota Watch] --> B{超限阈值触发?}
B -->|是| C[执行降级操作]
B -->|是| D[推送 AlertManager]
C --> E[更新 Status.Conditions]
D --> F[飞书/钉钉告警 + Runbook Link]
4.3 网络策略灰度发布:NetworkPolicy版本管理与租户流量金丝雀验证框架
为实现租户隔离策略的安全演进,需将 NetworkPolicy 视为可版本化、可观测、可回滚的声明式资源。
版本化策略定义示例
# networkpolicy-v1.2-canary.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: tenant-a-web-to-db
labels:
policy.k8s.io/version: "1.2" # 语义化版本标识
policy.k8s.io/phase: "canary" # 灰度阶段标签
spec:
podSelector:
matchLabels: {app: web}
ingress:
- from:
- namespaceSelector:
matchLabels: {tenant: a}
ports: [{protocol: TCP, port: 5432}]
逻辑分析:通过
labels注入version与phase元数据,使策略具备生命周期上下文;phase: canary触发金丝雀控制器仅对 5% 租户流量生效(基于 Istio VirtualService + Envoy metadata 匹配)。
金丝雀验证流程
graph TD
A[策略v1.2标记为canary] --> B{匹配租户标签+流量权重}
B -->|5% 流量| C[应用新策略]
B -->|95% 流量| D[保持v1.1策略]
C --> E[采集连接拒绝率/延迟P99]
E --> F[自动判定:达标→升级全量;失败→回滚]
验证指标看板(关键字段)
| 指标项 | 目标阈值 | 数据来源 |
|---|---|---|
| 连接拒绝率 | kube-proxy logs | |
| 跨租户误通率 | 0% | eBPF trace audit |
| 策略生效延迟 | APIServer watch |
4.4 租户资源审计日志:结构化审计事件的Go中间件与WAL持久化设计
审计事件结构定义
审计事件采用强类型 AuditEvent 结构,嵌入租户上下文与操作元数据:
type AuditEvent struct {
TenantID string `json:"tenant_id" db:"tenant_id"`
ResourceID string `json:"resource_id" db:"resource_id"`
Operation string `json:"operation" db:"operation"` // "CREATE"/"UPDATE"/"DELETE"
Actor string `json:"actor" db:"actor"`
Timestamp time.Time `json:"timestamp" db:"timestamp"`
Payload []byte `json:"payload,omitempty" db:"payload"` // JSON-marshaled delta
}
逻辑分析:
TenantID为分区键,确保多租户数据物理隔离;Payload保留原始变更快照(非冗余字段),支持事后精准回溯;db标签统一支撑 WAL 写入与后续归档查询。
WAL写入中间件核心流程
graph TD
A[HTTP Handler] --> B[auditMiddleware]
B --> C{Validate TenantCtx}
C -->|OK| D[Build AuditEvent]
D --> E[AppendToWAL]
E --> F[Return 200]
C -->|Missing| G[Reject 400]
持久化保障机制
- WAL 文件按租户+天分片(如
wal/tenant_a/20240520.bin) - 同步刷盘 + CRC32校验,崩溃后可重放不丢事件
- 异步压缩归档至对象存储(S3兼容),保留7天热日志
| 字段 | 类型 | 说明 |
|---|---|---|
TenantID |
string | 路由分片与权限校验依据 |
Operation |
string | 枚举值,驱动审计策略匹配 |
Timestamp |
time.Time | 精确到毫秒,用于时序分析 |
第五章:总结与展望
技术栈演进的实际影响
在某大型电商平台的微服务重构项目中,团队将原有单体架构迁移至基于 Kubernetes 的云原生体系。迁移后,平均部署耗时从 47 分钟缩短至 92 秒,CI/CD 流水线失败率下降 63%。关键变化在于:容器镜像统一采用 distroless 基础镜像(仅含运行时依赖),配合 Kyverno 策略引擎实现自动化的镜像签名验证与 Pod 安全策略注入。以下为生产环境近三个月的稳定性对比数据:
| 指标 | 迁移前(单体) | 迁移后(K8s) | 变化幅度 |
|---|---|---|---|
| 平均故障恢复时间(MTTR) | 28.4 分钟 | 3.1 分钟 | ↓89.1% |
| 日均有效发布次数 | 0.7 次 | 14.3 次 | ↑1943% |
| 容器启动成功率 | 92.6% | 99.98% | ↑7.38% |
多模态可观测性落地实践
团队未采用单一 APM 工具,而是构建了分层采集体系:
- 应用层:OpenTelemetry SDK 注入 Java/Go 服务,自定义
http.status_code标签粒度细化至业务状态码(如200.success_order、400.invalid_sku_id); - 基础设施层:eBPF 程序实时捕获 TCP 重传、DNS 解析延迟等网络指标,通过 BCC 工具链直接输出至 Loki;
- 关联分析:使用 Grafana Tempo 实现 trace-id 跨服务串联,并在 Prometheus 中建立
rate(http_request_duration_seconds_count{job=~"order|payment"}[5m])与node_network_transmit_packets_dropped_total的相关性告警规则。
# 生产环境中验证 eBPF 数据准确性的校验脚本
kubectl exec -it prometheus-0 -- \
curl -s "http://localhost:9090/api/v1/query?query=avg_over_time(node_network_transmit_packets_dropped_total{instance='10.244.3.12:9100'}[1h])" | \
jq '.data.result[0].value[1]'
边缘计算场景的持续交付挑战
在智能工厂 IoT 项目中,需向 237 台边缘网关(ARM64 架构,无公网 IP)推送固件更新。团队放弃传统 OTA 方案,改用 GitOps 模式:Flux v2 控制器监听私有 Git 仓库的 edge-firmware/releases/ 目录,当检测到新 tag(如 v2.4.1-20240522)时,自动触发 HelmRelease 渲染,生成包含加密固件哈希值的 ConfigMap。网关端轻量代理(
未来三年关键技术拐点
- Rust 在基础设施组件中的渗透率:当前 Envoy、Linkerd、TiKV 等核心组件已实现 Rust 模块占比超 40%,预计 2026 年 CI/CD 工具链中 Rust 编写的构建器(如 cargo-make 替代 Makefile)将成为默认选项;
- LLM 驱动的运维闭环:某金融客户已上线实验性系统——将 Prometheus 告警事件输入微调后的 CodeLlama-7b 模型,自动生成修复建议并调用 Ansible Playbook 执行回滚,平均响应时间压缩至 8.3 秒;
- 硬件级安全启动链延伸:NVIDIA BlueField DPU 已支持将 SGX Enclave 状态哈希写入 Kubernetes NodeStatus,使集群准入控制可验证 GPU 内存隔离完整性。
Mermaid 图表展示了跨云多集群策略同步流程:
graph LR
A[Git 仓库 policy/main] -->|Webhook| B(Flux Controller)
B --> C{策略类型判断}
C -->|NetworkPolicy| D[Kubernetes API Server]
C -->|OPA Constraint| E[Gatekeeper Webhook]
C -->|Fleet Bundle| F[Cluster Registry]
D --> G[上海集群]
E --> H[深圳集群]
F --> I[AWS us-east-1]
G --> J[自动注入 Istio Sidecar]
H --> K[启用 mTLS 双向认证]
I --> L[同步镜像缓存索引] 