数据主权过去常被简化成一个下拉框:把工作负载部署到某个国家或地区的云区域,数据就算“留在本地”。但真正的问题并不只是服务器摆在哪里,而是谁有法律、运营或技术能力被要求交出数据。这个变化正在重塑云原生基础设施设计:架构师需要同时考虑地理位置、控制平面、加密密钥、运维权限、审计链路和跨境依赖。
主权不只是机房位置
传统云原生设计喜欢把“区域”当作合规边界:数据库在本国区域,备份也在本国区域,访问入口走本地负载均衡器。这仍然重要,但已经不够。
更关键的问题包括:
- 云厂商的控制平面是否在境外运行?
- 谁能访问快照、日志、备份和对象存储?
- 加密密钥由客户、云厂商还是第三方托管?
- 支持工程师是否可以跨境进入生产环境排障?
- IaC、CI/CD、监控、告警和工单系统是否把敏感元数据发到境外?
换句话说,数据主权从“数据驻留”升级成了“可被强制访问面的治理”。如果一个境外主体可以通过控制平面、密钥服务或运维通道间接拿到数据,那么单纯选择本地区域并不能消除风险。
云原生架构要重新画边界
在 Kubernetes、服务网格、托管数据库和多云平台普及之后,数据路径变得更分散。应用容器可能在本地集群里,镜像仓库、CI Runner、日志平台、APM SaaS、备份控制器却在另一个司法辖区。
因此,主权架构通常要从几个层面拆开设计:
- 数据平面:业务数据、文件、数据库、缓存、消息队列实际存放和流动的位置。
- 控制平面:谁能创建资源、读取配置、导出快照、修改路由和访问策略。
- 密钥平面:加密密钥在哪里生成、谁能轮换、谁能解封。
- 运维平面:管理员、SRE、供应商支持人员如何登录、审计和提权。
- 可观测平面:日志、指标、Trace 是否包含个人数据、租户 ID、IP、请求体或业务字段。
一个常见改造方向是:业务数据留在受监管环境,控制权限尽量本地化,密钥由客户控制;跨境系统只接收脱敏、聚合或不可逆处理后的数据。
可以这样实践:用策略阻止敏感工作负载跨区域部署
下面是一个可以改造的 Kubernetes 示例:用命名空间标签标记主权边界,再用 Kyverno 策略阻止带有敏感标记的工作负载部署到非本地主权节点池。假设你的节点已经用 topology.kubernetes.io/region 标注区域,例如 eu-central-sovereign。
先创建一个命名空间:
apiVersion: v1
kind: Namespace
metadata:
name: payments-prod
labels:
data.sovereignty/class: regulated
再应用一条 Kyverno 策略:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-sovereign-region-for-regulated-data
spec:
validationFailureAction: Enforce
background: true
rules:
- name: regulated-workloads-need-sovereign-node-selector
match:
any:
- resources:
kinds:
- Deployment
namespaceSelector:
matchLabels:
data.sovereignty/class: regulated
validate:
message: "Regulated workloads must target the sovereign region node pool."
pattern:
spec:
template:
spec:
nodeSelector:
topology.kubernetes.io/region: eu-central-sovereign
应用方式:
kubectl apply -f namespace.yaml
kubectl apply -f sovereign-policy.yaml
然后,一个缺少本地区域 nodeSelector 的 Deployment 会被拒绝。可以这样修正:
apiVersion: apps/v1
kind: Deployment
metadata:
name: payments-api
namespace: payments-prod
spec:
replicas: 2
selector:
matchLabels:
app: payments-api
template:
metadata:
labels:
app: payments-api
spec:
nodeSelector:
topology.kubernetes.io/region: eu-central-sovereign
containers:
- name: app
image: nginx:1.27
ports:
- containerPort: 80
这不是完整的数据主权方案,但它把一个关键原则变成了可执行控制:敏感工作负载不能只靠人工约定部署到正确位置。
还要管住密钥、日志和供应链
只限制 Pod 调度还远远不够。云原生系统里,数据泄露面经常藏在“辅助系统”中。
可以采用这些工程做法:
- 客户托管密钥:优先使用 Customer Managed Keys,关键场景评估外部 KMS、HSM 或 Bring Your Own Key。
- 日志最小化:禁止把请求体、身份标识、支付字段、医疗字段写入集中日志。
- 分区备份:备份、快照、恢复演练也必须遵守同一主权边界。
- 本地化运维访问:生产访问通过堡垒机、Just-in-Time 权限和强审计控制。
- 策略即代码:用 OPA、Kyverno、Terraform Policy 或云平台原生策略阻止违规资源创建。
例如,可以用一个简单的 shell 检查集群中哪些敏感命名空间缺少主权节点选择器:
kubectl get deploy -A -o json \
| jq -r '
.items[]
| select(.metadata.namespace as $ns
| $ns != "kube-system")
| select(.spec.template.spec.nodeSelector["topology.kubernetes.io/region"] != "eu-central-sovereign")
| [.metadata.namespace, .metadata.name, "missing sovereign nodeSelector"]
| @tsv
'
运行前需要安装 jq,并把 eu-central-sovereign 改成你的受控区域名称。这个检查不能替代准入控制,但适合放进 CI 或定期审计任务。
落地时的取舍清单
数据主权设计会带来成本:可用区选择变少,跨区域灾备更复杂,SaaS 工具可用性下降,运维流程也会变慢。架构上不要追求口号式“绝对主权”,而要把风险拆成可审计、可执行的控制项。
落地前可以问五个问题:
- 数据、密钥、备份、日志和元数据分别在哪里?
- 哪些组织或供应商能被要求交出这些内容?
- 控制平面是否可以绕过数据平面的本地限制?
- 跨境依赖拿到的是原始数据、脱敏数据还是聚合数据?
- 违规部署、错误日志和越权访问能否被自动阻止或快速发现?
真正成熟的主权云原生架构,不是把所有东西搬进某个国家的机房,而是让每一条访问路径、每一把密钥、每一份副本都有明确的管辖边界和技术约束。