恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
kubernetes-ingress 中基于 ConfigMap 的 NGINX Plus Zone Sync 状态同步配置详解
首页
资讯中心
/
kubernetes-ingress 中基于 ConfigMap 的 NGINX Plus Zone Sync 状态同步配置详解
kubernetes-ingress 中基于 ConfigMap 的 NGINX Plus Zone Sync 状态同步配置详解
发布时间:2026/10/14 15:39:04
API网关云原生负载均衡可观测性微服务【免费下载链接】kubernetes-ingressNGINX and NGINX Plus Ingress Controllers for Kubernetes项目地址https://gitcode.com/gh_mirrors/ku/kubernetes-ingress点击查看免费下载NGINX Ingress ControllerNIC在 NGINX Plus 环境下支持 zone-synczone synchronization特性可让同一部署下的多个控制器副本之间同步共享内存 zone 状态如限流计数从而实现多副本间的一致性状态共享。本文基于仓库示例 examples/custom-resources/zone-sync/README.md 展开完整覆盖最小化配置步骤、全部zone-sync-*配置键的取值与默认值、控制器自动创建的 headless Service 机制、最终生成的nginx.conf指令以及仓库测试用例的验证方式。特性概述与适用前提Zone Synchronization 是 NGINX Plus 提供的高可用特性同一 zone 的数据可以在多个 NGINX 实例之间实时同步。在 Kubernetes 场景下当你以 Deployment 方式运行多个 NIC 副本时开启该特性可以让各副本共享如请求限流limit_req_zone等基于共享内存的状态避免每个副本各自独立计数导致的限流阈值被放大。适用前提有两点均由源码明确约束该特性仅在 NGINX Plus 下可用。在 ConfigMap 解析逻辑 中若当前不是 Plus 模式而配置了zone-sync控制器会记录告警事件并直接拒绝该配置ConfigMap ns/name key zone-sync requires NGINX Plus开启后控制器会自动创建或清理一个 headless Service用于作为zone_sync_server的服务发现入口详见下文headless Service 自动管理 一节。最小化配置只写一个键官方示例非常简洁nginx-config.yaml 全部内容如下只需在nginx-ingress命名空间的nginx-configConfigMap 中设置zone-sync: truekind: ConfigMap apiVersion: v1 metadata: name: nginx-config namespace: nginx-ingress data: zone-sync: true应用方式README 中的原始步骤kubectl apply -f nginx-config.yaml不指定zone-sync-port时端口会被设置为默认值12345。这一默认值对应源码中的常量 zoneSyncDefaultPort 12345当 ConfigMap 中未提供zone-sync-port时解析逻辑 会兜底填入该默认端口。全部 zone-sync 配置键与默认值ConfigMap 中共有 5 个相关键均可在 parseConfigMapZoneSync 中一一对应到内存结构 ZoneSyncConfigMap 键含义默认值校验规则源码依据zone-sync布尔值是否启用 zone synchronization未设置即不启用必须为合法布尔值非 Plus 模式会报错退出zone-sync-port监听/同步端口12345必须是合法端口validation.ValidatePort非法时告警并回退到 12345zone-sync-resolver-addresses解析 headless Service 域名用的 DNS 地址逗号分隔多个kube-dns.kube-system.svc.cluster.local每个地址需通过validation.ValidateHost校验zone-sync-resolver-validresolver 结果的有效期nginx time 格式5s必须能解析为 nginx time如10szone-sync-resolver-ipv6布尔值是否启用 IPv6 解析不设置则跟随disable-ipv6全局配置必须为合法布尔值依赖关系值得注意除zone-sync外的其余 4 个键都要求zone-sync已开启否则解析器会拒绝并记录requires zone-sync to be enabled的告警事件configmaps.go#L879-L885。一个功能完整的配置示例参考仓库测试数据 configmap-with-zonesync-port-resolver.yamlkind: ConfigMap apiVersion: v1 metadata: name: nginx-config namespace: nginx-ingress data: zone-sync: true zone-sync-port: 34100 zone-sync-resolver-valid: 5s zone-sync-resolver-ipv6: true生成的 nginx.conf 指令配置解析后值会被封装为 ZoneSyncConfig 交给模板。启用时NGINX Plus 的主配置模板 nginx-plus.tmpl 在stream上下文中追加如下 server 块server { listen 12345; listen [::]:12345; resolver kube-dns.kube-system.svc.cluster.local valid5s; zone_sync; zone_sync_server nginx-ingress-headless.nginx-ingress.svc.cluster.local:12345 resolve; }其中几个细节可以直接从源码读出zone_sync_server的地址由 组装逻辑 拼接为domain-hl.POD_NAMESPACE.svc.cluster.local:portdomain即控制器自身的部署标识resolve后缀表示通过 resolver 动态解析该域名配合valid参数控制缓存时间。listen端口与zone_sync_server端口一致即zone-sync-port的取值。resolver一行由makeResolver根据zone-sync-resolver-addresses、zone-sync-resolver-valid、zone-sync-resolver-ipv6三个键生成。模板测试 template_test.go 的快照snapshots/template_test.snap验证了默认端口、自定义端口1337与自定义 resolver 组合下生成的zone_sync;与zone_sync_server ... resolve;指令均符合预期。headless Service 的自动创建与清理zone_sync_server指向的是一个-hl后缀的 headless Service而这个 Service 不需要也不应该由用户手工创建——控制器会代劳域名的确定createCombinedDeploymentHeadlessServiceName 从 Pod 的 OwnerReference 取 ReplicaSet/StatefulSet 名称并去掉哈希后缀拼成name-kind形式作为ZoneSync.Domain启动入口 cmd/nginx-ingress/main.go 也会以combinedDeployment赋值该域名。启动时预校验主流程在 Plus 模式下若ZoneSync.Enable且端口非 0会先调用 createAndValidateHeadlessService 保证 Service 可用失败则记录事件并退出。运行期自动创建syncZoneSyncHeadlessService 发现名为domain-hl的 Service 不存在时会创建一个clusterIP: None的 headless Serviceselector 复用控制器自身的 Pod 标签并将 ConfigMap 设为 OwnerReference从而跟随 ConfigMap 生命周期管理若已被其他副本创建AlreadyExists则视为正常并继续。关闭时自动清理同函数后续分支中当 zone-sync 被禁用且 NGINX 已就绪时会删除该 headless Service避免残留资源。这套机制解释了为什么zone_sync_server可以直接用 Service DNS 域名它始终解析到部署自身的所有副本每个副本既是同步的服务器端也是客户端。与限流 zone 的联动zone-sync 的实际收益之一体现在请求限流上当 zone synchronization 开启后limit_req_zone会附加sync标志使限流计数在副本间同步。模板测试用例 TestExecuteTemplate_ForIngressForNGINXPlusWithRequestRateLimitZoneSync 的快照展示了启用后的生成结果limit_req_zone ${binary_remote_addr} zonedefault/zone1_sync:10m rate200r/s sync;启用/禁用切换与验证方式仓库的端到端测试 test_zone_sync.py 覆盖了完整的启停与参数变更流程其测试数据位于 tests/data/zone-sync/可作为操作验证清单初始不带 zone-sync 启动使用 default-configmap.yaml确认nginx.conf中不存在zone_sync;与zone_sync_server也不存在 headless Service启用最小配置应用 configmap-with-zonesync-minimal.yaml 后校验nginx.conf出现zone_sync;和zone_sync_server且 headless Service 已创建变更 resolver 有效期应用 configmap-with-zonesync-resolver-valid.yamlzone-sync-resolver-valid: 10s验证valid10s生效变更端口应用 configmap-with-zonesync-minimal-changed-port.yaml 后校验新端口写入listen与zone_sync_server禁用回收应用 configmap-with-zonesync-disabled.yamlzone-sync: false后nginx.conf中的同步指令消失headless Service 被删除。除检查nginx.conf外测试还通过 NGINX Plus API 响应断言zone_sync字段的存在与否确认同步状态确实进入了运行中的实例。小结事项说明开启方式在nginx-configConfigMap 中设置zone-sync: true即可端口默认 12345可选调优zone-sync-port、zone-sync-resolver-addresses默认 kube-dns、zone-sync-resolver-valid默认 5s、zone-sync-resolver-ipv6前置要求NGINX Plus其余配置键依赖zone-sync已启用自动化控制器自动创建/删除deployment-kind-hlheadless Service无需手工维护典型收益多副本间共享内存 zone 同步如limit_req_zone ... sync的限流计数一致性可追溯路径解析internal/configs/configmaps.go#L862-L959模板internal/configs/version1/nginx-plus.tmpl#L326-L336Service 管理internal/k8s/service.go#L140-L184赞分享API网关云原生负载均衡可观测性微服务【免费下载链接】kubernetes-ingressNGINX and NGINX Plus Ingress Controllers for Kubernetes项目地址https://gitcode.com/gh_mirrors/ku/kubernetes-ingress点击查看免费下载相关推荐nginx-ingress Helm Chart 实战指南基于 ConfigMap 的 NGINX Ingress 控制器部署与配置nginx ingress Helm Chart 实战指南基于 ConfigMap 的 NGINX Ingress 控制器部署与配置 本文以 Kubernet告别配置混乱Kubernetes Ingress-Nginx ConfigMap完全指南告别配置混乱Kubernetes Ingress Nginx ConfigMap完全指南 在Kubernetes集群中你是否曾因Ingress配置繁琐而头疼后端API网关负载均衡云原生kubernetes-handbook 实战基于 Helm 与 ConfigMap 的 nginx-ingress 控制器完整部署与配置指南kubernetes handbook 实战基于 Helm 与 ConfigMap 的 nginx ingress 控制器完整部署与配置指南 本篇技术指南以教程云原生容器编排创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考