ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenZiti 1.3 深度解析:Router Data Model 默认启用、HA 简化与 Raft 健康检查增强

OpenZiti 1.3 深度解析:Router Data Model 默认启用、HA 简化与 Raft 健康检查增强 零信任网络后端认证鉴权【免费下载链接】zitiThe parent project for OpenZiti. Here you will find the executables for a fully zero-trust, programmable network OpenZiti项目地址https://gitcode.com/gh_mirrors/zi/ziti点击查看免费下载本文基于 OpenZiti本仓库为zi/ziti官方发布文档 changelogs/CHANGELOG.1.3.md 编写结合仓库内控制器、路由器与公共模块源码展开解读覆盖 1.3.01.3.3 四个版本的完整变更。读完本文你将掌握Router Data Model 的启用机制与routerDataModel配置项语义、HA 模式下路由器的部署简化、/health-checks/controller/raft健康检查的判定逻辑含 429 状态码含义以及 1.3 系列各补丁版本的修复清单与依赖升级情况。一、1.3 版本总览一次以 HA 为核心的主题发布OpenZiti 1.3 系列由四个版本组成1.3.0特性版、1.3.1 / 1.3.2 / 1.3.3补丁版。其中 1.3.0 的核心变更高度聚焦于一条主线——控制器高可用HA能力的配套完善Router Data Model 默认启用控制器可以向路由器分发一份精简版数据模型让路由器本地完成部分授权/鉴权决策HA 配置简化路由器不再需要配置ha: enabled标志无论连接 HA 还是非 HA 控制器都能正常工作Controller Health Check HA 更新由社区贡献者 nenkoru 提交健康检查端点新增 Raft 与领导权信息。后续三个补丁版本则集中于修复 HA 引导、OIDC 认证、升级场景下的数据模型同步等问题。以下按主题逐一展开。二、Router Data Model从实验特性到默认启用2.1 背景为什么需要路由器数据模型在控制器 HA 工作推进的过程中OpenZiti 团队将一个关键能力逐步落地把控制器数据模型的一个精简子集分发到路由器上。该子集足够支撑路由器在本地完成部分授权authorization/ 认证authentication决策例如判定某个身份是否被服务策略Service Policy授予了 dial/bind 某个服务的权限以及相关的 Posture Check 校验。这块代码在仓库中已存在较长时间经过充分的测试与验证后在 1.3.0 中正式默认启用。从源码结构看该机制被设计为sender发送端运行于控制器与 receiver接收端运行于路由器双模式。在 common/router_data_model.go 的注释中明确说明RouterDataModel represents a sub-set of a controllers data model. Enough to validate an identitys access to dial/bind a service through policies and posture checks. Sender mode allows a controller to support an event cache that supports replays for routers connecting for the first time/after disconnects. Receiver mode does not maintain an event cache and does not support replays. It instead is used as a reference data structure for authorization computations.即Sender 模式控制器侧维护事件缓存event cache支持路由器首次连接或断线重连时的数据重放replayReceiver 模式路由器侧不缓存事件将数据模型作为本地授权计算的只读参考结构。2.2 数据模型包含哪些实体RouterDataModel结构体common/router_data_model.go通过并发安全的 map 维护以下九类实体字段含义Protobuf 类型ConfigTypes配置类型定义配置数据的 schema/类别DataState_ConfigTypeConfigs配置实例含 JSON 数据关联服务与身份DataState_ConfigIdentities身份含托管配置、服务配置、策略与 Posture 跟踪DataState_IdentityServices服务网络资源、是否强制加密、关联配置DataState_ServiceRouters路由器实体DataState_RouterServicePolicies服务策略dial/bind 授权规则DataState_ServicePolicyPostureChecks安全姿态校验项OS 版本、进程、域成员、MFA 等DataState_PostureCheckPublicKeys公共密钥DataState_PublicKeyRevocations吊销记录API_SESSION / IDENTITY / JTI 三类DataState_Revocation其中身份Identity结构还维护了ServiceAccess访问计数与PostureChecks引用计数用于在策略增删时增量更新“该身份能否 dial/bind 某服务”的判定结果见 common/router_data_model.go 中serviceAccess的DialPoliciesCount/BindPoliciesCount计数逻辑。2.3 控制器侧配置routerDataModelRouter Data Model 在控制器层面新增了配置项默认启用。注意它是 HA 功能的依赖项控制器以 HA 模式运行时不可关闭。完整配置示例继承自原发布文档并补充源码确认的默认值与约束routerDataModel: # Controls whether routers are told to enable functionality dependent on the router data model # Defaults to true enabled: true # How many model changes to buffer so that routers can be updated iteratively. If a router requests # data thats no longer available, it will receive the full data model logSize: 10000对应源码位于控制器配置解析 controller/config/config.go其行为细节如下配置项源码常量/默认值约束enabled默认true控制是否告知路由器启用依赖数据模型的功能HA 模式下不可禁用logSizeDefaultRouterDataModelLogSize 10000配置值必须 MinRouterDataModelLogSize10否则返回配置加载错误invalid routerDataModel.logSize %d, must be %dlistenerBufferSizeDefaultRouterDataModelListenerBufferSize 1000返回值给数据模型监听器的通道缓冲区大小必须 0其中logSize直接决定 sender 侧事件缓存环形缓冲的容量路由器采用迭代式增量更新时如果请求的数据索引已超出缓冲范围数据不再可用路由器将收到全量数据模型full data model以完成追赶。这三个常量定义在 controller/config/config.goMinRouterDataModelLogSize 10 DefaultRouterDataModelLogSize 10000 DefaultRouterDataModelListenerBufferSize 1000enabled标志的生效路径可从 controller/sync_strats/sync_instant.go 中看到端倪控制器通过Header_RouterDataModel布尔头向路由器宣告是否启用数据模型第 566 行msg.PutBoolHeader(int32(edge_ctrl_pb.Header_RouterDataModel), true)路由器侧则依据该头与Header_RouterDataModelIndex当前模型索引上报自己的同步位置第 716-721 行由 sender 决定增量重放还是全量下发。2.4 同步与订阅机制从全量快照到增量变更控制器侧通过InstantStrategy即时同步策略构建并维护RouterDataModelSender初始化时调用NewRouterDataModelSender(strategy.ae, logSize, bufferSize)controller/sync_strats/sync_instant.go其中logSize、bufferSize即来自上文routerDataModel配置启动时通过BuildAll从 bbolt 数据库一次性构建各实体集合BuildConfigTypes/BuildConfigs/BuildIdentities/BuildServices/BuildRouters/BuildPostureChecks/BuildServicePolicies/BuildPublicKeys见 controller/sync_strats/sync_instant.go并持续监听模型变更事件变更集DataState_ChangeSet通过Store写入事件缓存其中携带index与previousIndex路由器侧据此做gap 检测——若event.PreviousIndex ! currentIndex则抛出GapDetectedError触发重新同步common/router_data_model.go路由器侧接收端NewReceiverRouterDataModel不缓存事件仅将变更应用到本地参考结构并通过订阅者机制IdentitySubscription按身份推送策略/Posture 变更见 common/subscriber.go。路由器连接的控制器变更时路由器侧的networkControllersrouter/env/ctrls.go会注册CurrentIndexMessageType接收处理器handleRouterDataModelIndexUpdate第 471 行附近持续跟踪数据模型索引确保多控制器场景下只从一个控制器流式同步模型数据。2.5 测试与验证仓库为 Router Data Model 提供了较完整的测试覆盖common/router_data_model_test.go数据模型增删改与索引/回放逻辑测试common/router_data_model_diff_test.go模型差异对比测试tests/router_data_model_test.go端到端的数据模型一致性验证router/state/router_config_subscriber_test.go路由器侧配置订阅测试。此外 1.3.0 的变更列表中还包含了Router Data Model Chaos TestIssue #2550与多控制器下仅从一个控制器流式获取模型数据Issue #2599等加固项表明该特性在默认启用前经历了混沌/并发场景验证。三、HA 配置简化路由器不再需要ha: enabled1.3.0 对路由器配置做了重要简化对应 Issue #2566 Remove HA config flag from routerRouters no longer require theha: enabledflag be set in the configuration. Routers should work correctly whether connecting to HA or non-HA controllers.即路由器无论连接 HA 控制器还是普通单机控制器都不再需要、也不应配置ha: enabled标志旧配置中的该字段在新版本中已被移除。从路由器源码看1.3 之后路由器依赖的是控制器通过能力协商capability与 hello 流程下发的运行模式信息而非本地静态配置。关键注意事项来自原发布文档务必阅读If the controller a router is connected changes modes, specifically if the controller goes from supporting the router data model to not, or vice-versa, the router will shutdown so that it can restart with the correct mode.如果路由器所连接的控制器运行模式发生变化——例如从支持 Router Data Model 切换为不支持或反向切换——路由器会主动关闭shutdown以便以正确的模式重启。这一设计避免了路由器在错误模式下继续运行导致授权决策不一致的风险。升级或切换控制器模式时应预期到路由器的一次重启。四、Controller Health Check HA 更新查询 Raft 领导权该特性由社区贡献者nenkoru提交对应 Issue #2582 An endpoint to determine whether a node is a raft leader让控制器健康检查接口可以可选地返回 Raft 与领导权信息。4.1 使用方法与响应示例当请求路径带有/controller/raft后缀时响应体中将额外出现raft字段。原发布文档给出的完整示例默认管理端口 1280$ curl -k https://localhost:1280/health-checks/controller/raft { data: { checks: [ { healthy: true, id: bolt.read, lastCheckDuration: 0s, lastCheckTime: 2025-01-14T19:42:13Z } ], healthy: true }, meta: {}, raft: { isLeader: true, isRaftEnabled: true } }响应语义raft.isRaftEnabled当前控制器是否启用了 RaftHAraft.isLeader被查询的控制器当前是否为 Raft 领导者若请求不携带/controller/raft路径后缀响应与历史版本完全一致即不出现raft字段当 Raft 已启用但被查询的控制器不是领导者时接口返回 HTTP 429而非 200。4.2 源码实现细节该逻辑实现在 controller/webapis/controller-health.goif strings.HasSuffix(request.URL.Path, /controller/raft) { isRaftEnabled : self.appEnv.GetHostController().IsRaftEnabled() isLeader : self.appEnv.GetHostController().IsRaftLeader() if !isLeader isRaftEnabled { // this is uses 429 to be consistent with Vault. 503 seems like it would be more // appropriate, but it just needs to be not 200, so using 429 for consistency w.WriteHeader(429) } raftData : map[string]interface{}{} raftData[isRaftEnabled] isRaftEnabled raftData[isLeader] isLeader output[raft] raftData }代码注释明确解释了选择 429 的原因与 Vault 保持一致虽然 503 看起来更贴切但这里只需要一个非 200 的状态码故选用 429。因此该接口可直接用于负载均衡/网关的领导者探活只有返回 200 且isLeader: true的控制器节点才应承接写入类请求HA 集群的健康巡检结合bolt.read等既有检查项判断节点是否可读写观测 Raft 启用状态区分“非 HA 集群isRaftEnabledfalse”与“HA 集群中的非领导者isRaftEnabledtrue, isLeaderfalse”两种场景。底层IsRaftEnabled()/IsRaftLeader()分别定义于 controller/controller.go 与控制器 raft 模块 controller/raft/raft.goisLeader atomic.Bool随 Raft 观察事件更新。HA 集群的部署与 raft 配置可参考仓库文档 doc/ha 目录下的说明文件。五、1.3.x 补丁版本修复明细5.1 1.3.1HA 引导与集群事件修复Issue修复内容#2682HA 控制器在配置中设置db变量引导bootstrapping时发生 panic#2683全新安装时控制器无法保存对等peer配置#2684控制器启动时发出重复的集群cluster事件5.2 1.3.2升级场景与 OIDC 表单认证修复Issue修复内容#2692升级后路由器获得空的控制器ctrl列表#2689OIDC 表单数据认证要求表单中必须携带idquery string 中的authRequestID被忽略其中 #2692 与 Router Data Model 的升级路径直接相关升级时路由器若从控制器拿到空的控制器列表将导致无法建立控制通道该修复与 1.3.3 的 #2694 共同保证了路由器在多控制器配置下的健壮性。5.3 1.3.3多控制器场景的数据模型来源修正Issue修复内容#2694无论控制器如何配置只要路由器配置了多个控制器就应该使用路由器数据模型Router Data Model该修复明确了路由器侧数据模型来源的优先级以路由器自身配置的多控制器为准而不是跟随控制器的单点配置确保多控制器HA场景下路由器始终启用数据模型驱动的本地决策能力。六、依赖组件升级一览v1.3.0 版本范围1.3.0 同时升级了多个底层依赖涉及控制通道、存储、传输、身份管理等主要条目如下依赖组件版本范围说明openziti/agentv1.0.20 → v1.0.23本地代理/管理通信openziti/channel/v3v3.0.16 → v3.0.26控制通道实现openziti/edge-apiv0.26.35 → v0.26.38修复管理 API 删除操作对 404 的映射问题edge-api #138openziti/foundation/v2v2.0.52 → v2.0.56基础设施库openziti/identityv1.0.90 → v1.0.94身份管理openziti/metricsv1.2.61 → v1.2.65指标采集openziti/runzmdv1.0.55 → v1.0.59文档/命令渲染openziti/secretstreamv0.1.26 → v0.1.28密钥流加密openziti/storagev0.3.8 → v0.3.15存储层支持首个点号之后标识符段包含短横线storage #91openziti/transport/v2v2.0.153 → v2.0.159传输层openziti/zitiv1.2.2 → v1.3.0本仓库主模块七、1.3.0 同期修复的功能性问题节选除三大主题外1.3.0 还修复了一批影响面较广的问题按领域归类如下OIDC 认证#2674默认端口/localhost 下 well-known OIDC 配置返回 404#2659OIDC 登录在遇到不支持的媒体类型时 panic。内存与资源管理#2669路由器 API 会话跟踪器api session tracker内存泄漏。事件系统#2619为所有事件添加 source id#2639集群事件命名空间从fabric.cluster变更为cluster#2184新增控制器领导者连接状态事件#2548集群在可配置时长内无领导者时生成日志消息#2624从 connect 事件中移除 uri/params。HA 一致性#2586HA 模式控制器在配置变更后未在 bolt 数据库中更新绑定地址#2232非共识non-consensus控制器上的变更操作返回标准化 REST API 错误#2636启用 HA 冒烟测试smoketest。日志与鉴权#2644增强 mis-mapped external identity 的日志#2625ERT 被删除时 edge session 可能无法清理#2591拆分 Edge API 可能导致ziti edge login失败。八、升级与运维建议综合 1.3 系列变更给出以下实践建议升级前备份控制器数据库1.3.1 修复了 HA 引导与 peer 配置保存问题#2682/#2683升级路径上涉及数据模型重建BuildAll从 bbolt 全量构建建议在维护窗口操作移除路由器的ha: enabled配置1.3.0 起该标志已被移除#2566仍保留旧字段可能造成配置语义混乱预期模式切换引发的路由器重启当控制器在支持/不支持 Router Data Model 之间切换模式时已连接的路由器会主动 shutdown 重启——这是设计行为不是故障利用健康检查端点做领导者探测对 HA 集群的入口负载均衡建议定期请求/health-checks/controller/raft仅将200 isLeader: true的节点视为可写端点非领导者429用于只读或降级路由监控无领导窗口结合 #2548 的无领导者日志告警及时感知 Raft 集群异常关注数据模型同步日志路由器侧如出现GapDetectedError相关日志说明增量同步出现缺口已触发全量重同步属正常自愈路径若频繁出现可适当调大routerDataModel.logSize最低 10默认 10000。九、小结OpenZiti 1.3 是一次以控制器 HA 能力完善为纲领的版本Router Data Model 经长期验证后默认启用将授权决策下沉到路由器本地显著增强多控制器场景下的可用性路由器配置随之简化健康检查端点新增 Raft 领导权探测能力为 HA 集群的流量编排与可观测性提供了标准化接口。三个补丁版本则围绕升级路径、OIDC 认证与多控制器数据同步完成了关键修复。对于运行多控制器或计划向 HA 演进的生产环境1.3 是值得重点评估与升级的版本。赞分享零信任网络后端认证鉴权【免费下载链接】zitiThe parent project for OpenZiti. Here you will find the executables for a fully zero-trust, programmable network OpenZiti项目地址https://gitcode.com/gh_mirrors/zi/ziti点击查看免费下载相关推荐从撰写到投递免费开源简历生成器 Reactive Resume 完整指南从撰写到投递免费开源简历生成器 Reactive Resume 完整指南 写简历常常像写一份永远看不到成品的文档投出去之后石沉大海数据还留在别人的服务器上前端后端AI 应用MCP 服务dsh-pluginDapr 0.6.0 深度解析PubSub 作用域、Sidecar 健康检查与全面 TLS 安全增强Dapr 0.6.0 深度解析PubSub 作用域、Sidecar 健康检查与全面 TLS 安全增强 Dapr 0.6.0 是 Dapr 早期演进中的一个重要后端微服务云原生消息队列AI AgentEMQX Couchbase Connector 健康检查失败诊断增强解析EMQX Couchbase Connector 健康检查失败诊断增强解析 EMQX 企业版通过数据集成Data Integration框架将 MQTT 消后端物联网消息队列通信上一篇输入法词库转换终极指南让您的个人词库在不同输入法间自由迁移下一篇3个简单步骤用Windows Cleaner彻底解决电脑卡顿问题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表