ExternalDNS OpenShift Route Source 实战指南:将 OpenShift Route 自动同步为 DNS 记录

发布时间:2026/9/25 15:48:16

ExternalDNS OpenShift Route Source 实战指南:将 OpenShift Route 自动同步为 DNS 记录 云原生【免费下载链接】external-dnsConfigure external DNS servers dynamically from Kubernetes resources项目地址https://gitcode.com/gh_mirrors/ex/external-dns点击查看免费下载OpenShift Route 是 OpenShift 平台面向外部的流量入口本文基于当前仓库中的 docs/sources/openshift.md 编写完整讲解 ExternalDNS 如何使用openshift-route数据源把 Route 的spec.host与路由器router的 canonical hostname 自动转换为 CNAME 记录并同步到 AWS 等 DNS 提供方。读完本文你将掌握 OCP 4.x 与 OCP 3.11 两种集群形态下的部署清单、--openshift-router-name等关键参数的语义、以及从源码层验证目标选择逻辑的方法。OpenShift Route Source 是什么openshift-route是 ExternalDNS 众多数据源中的一个负责监听集群中的Route.route.openshift.io资源Category 为 OpenShift支持 annotation/label 过滤、单命名空间或全命名空间监听、FQDN 模板与 provider-specific 注解。它的核心工作方式是主机名Hostname取自 Route 的spec.host字段目标Target取自 Routestatus中被选定路由器的RouterCanonicalHostname字段记录类型生成 CNAME 记录将spec.host指向该 canonical hostname。在 source/openshift_route.go 的源码注释中对该数据源的功能定义非常明确The Route implementation will use the Route spec.host field for the hostname, and the Route status canonicalHostname field as the target. The annotations.TargetKey can be used to explicitly set an alternative endpoint, if desired.也就是说默认情况下每个被 admit 的 Route 都会产生一条host - routerCanonicalHostname的 CNAME 记录如果想要覆盖目标可以显式使用external-dns.kubernetes.io/target注解。数据源实现原理源码级解析从 informer 到 Endpoints 的调用链NewOcpRouteSource在 source/openshift_route.go 中完成初始化使用 OpenShift client-go 的SharedInformerFactory监听 Route 资源resync 周期设为0即只有资源真正变化时才触发处理通过 informer 转换器transformers剔除managedFields与kubectl.kubernetes.io/last-applied-configuration注解避免脏数据干扰注册三类索引器indexersAnnotationFilter--annotation-filter、LabelFilter--label-filter以及annotations.IsControllerMatchexternal-dns.kubernetes.io/controller匹配这意味着 OpenShift Route 数据源同样遵循 ExternalDNS 统一的过滤语义调用informerFactory.Start并等待本地缓存同步完成。Endpoints()方法在 source/openshift_route.go 中遍历索引出的全部 Route对每个 Route 执行通过模板引擎CombineWithEndpoints合并两种生成路径直接从 Route 提取的 endpointsendpointsFromOcpRoute与基于--fqdn-template模板生成的 endpointsendpointsFromTemplate跳过空 endpoints并为每个 endpoint 挂载资源引用route/namespace/name格式的 ResourceLabel最终调用endpoint.MergeEndpoints合并去重后返回。路由器router选择的核心逻辑多路由器集群下目标选择的判定集中在getTargetsFromRouteStatus见 source/openshift_route.go。其遍历status.ingress的逻辑可以归纳为跳过未被 admit 的 ingressRouteAdmitted条件不等于True或没有RouterCanonicalHostname的 ingress若指定了--openshift-router-name即ocpRouterName且与某个 ingress 的RouterName匹配则返回该路由器的 canonical hostname若未指定 router name则返回status.ingress列表中第一个被 admit的路由器若没有任何路由器 admit 该 Route则不生成目标返回空。这与文档在「For OCP 4.x」一节中的说明完全一致不指定 router name 时取status.ingress中的第一个路由器且该路由器必须已经 admit 了这条 Route。测试用例的印证source/openshift_route_test.go 中的表格驱动测试完整覆盖了这些分支可作为理解行为边界的参考测试场景期望结果基本 hostname status target已 admit生成my-domain.com - apps.my-domain.com的 CNAME指定ocpRouterName: default且匹配使用router-default.my-domain.com作为目标两个路由器、指定default只选择default对应目标指定的 router 未 admit 该 Route不生成 endpoint没有任何 router admit不生成 endpoint第一个匹配的 router admit选择第一个 admit 的路由器controller注解为其他值如foo不生成 endpoint使用external-dns.kubernetes.io/target注解以注解值my.site.foo.com作为目标label 过滤器匹配 / 不匹配仅匹配的路由生成 endpointprovider-specific 注解如external-dns.kubernetes.io/aws-weight: 10作为 ProviderSpecific 属性透传给 provider在 OCP 4.x 中使用 OpenShift Route 数据源多 ingress controller 场景必须指定 router name在 OCP 4.x 中如果集群中存在多个 OpenShift ingress controllerrouter就必须通过--openshift-router-name指定目标路由器名称。该名称可以从 Route 的status.ingress[*].routerName字段获取。若不指定ExternalDNS 会选用status.ingress中的第一个路由器该路由器必须已经 admit 这条 Route否则该 Route 不会生成记录。一旦确定了路由器ExternalDNS 就会用该路由器的 canonical hostname 作为 CNAME 记录的目标。--openshift-router-name参数的官方定义位于 pkg/apis/externaldns/types.goif source is openshift-route then you can pass the ingress controller name. Based on this name external-dns will select the respective router from the route status and map that routerCanonicalHostname to the route host while creating a CNAME record.该参数最终会经 source/store.go 中的Config.OCPRouterName字段传入ocpRouteSource。通过 ExternalDNS Operator 管理OCP 4.10从 OCP 4.10 开始可以使用 OpenShift 官方的 ExternalDNS Operator 来管理 ExternalDNS 实例。以 AWS provider 为例其自定义资源Custom Resource写法如下apiVersion: externaldns.olm.openshift.io/v1alpha1 kind: ExternalDNS metadata: name: sample spec: provider: type: AWS source: openshiftRouteOptions: routerName: default type: OpenShiftRoute zones: - Z05387772BD5723IZFRX3提交该 CR 后Operator 会在external-dns命名空间下创建 ExternalDNS Pod其容器参数等价于spec: containers: - args: - --metrics-address127.0.0.1:7979 - --txt-owner-idexternal-dns-sample - --provideraws - --sourceopenshift-route - --policysync - --registrytxt - --log-leveldebug - --zone-id-filterZ05387772BD5723IZFRX3 - --openshift-router-namedefault - --txt-prefixexternal-dns-从这份生成的参数列表可以看出Operator 把 CR 中的routerName: default映射为--openshift-router-namedefault把zones映射为--zone-id-filter其余为常规的 provider/registry/policy 参数。在 OCP 3.11 环境中部署准备 ROUTER_CANONICAL_HOSTNAMEOCP 3.11 的部署前提是让 router 具备 canonical hostname需要参考 OpenShift 文档「Finding the Host Name of the Router」一节在 default/router deployment 中配置ROUTER_CANONICAL_HOSTNAME。重要限制如果未设置ROUTER_CANONICAL_HOSTNAME则必须为每条 Route 手工添加external-dns.kubernetes.io/target注解否则 ExternalDNS 无法从 status 中解析出目标也就不会生成记录。Manifest无 RBAC 集群对于未启用 RBAC 的集群可以直接部署如下 DeploymentapiVersion: apps/v1 kind: Deployment metadata: name: external-dns spec: strategy: type: Recreate selector: matchLabels: app: external-dns template: metadata: labels: app: external-dns spec: containers: - name: external-dns image: registry.k8s.io/external-dns/external-dns:v0.23.0 args: - --sourceopenshift-route - --domain-filterexternal-dns-test.my-org.com # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones - --provideraws - --policyupsert-only # prevents ExternalDNS from deleting any records, set --policysync to enable full synchronization (including deletions) - --aws-zone-typepublic # only look at public hosted zones (valid values are public, private or no value for both) - --registrytxt - --txt-owner-idmy-identifier各参数说明--sourceopenshift-route启用 OpenShift Route 数据源--domain-filterexternal-dns-test.my-org.com只处理与该域名匹配的 hosted zone省略则处理全部可用 hosted zone--provideraws使用 AWS Route53 provider具体参数可参考 AWS 教程--policyupsert-only只新增/更新、不删除记录改为--policysync可启用包含删除的完整同步--aws-zone-typepublic只处理 public hosted zone可选值为public、private或不填两者都处理--registrytxt--txt-owner-idmy-identifier使用 TXT registry 做所有权标记避免记录被误删。Manifest启用 RBAC 的集群启用 RBAC 的集群需要额外创建 ServiceAccount、ClusterRole 与 ClusterRoleBinding其中必须包含对route.openshift.io/routes的get/watch/list权限apiVersion: v1 kind: ServiceAccount metadata: name: external-dns --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: external-dns rules: - apiGroups: [] resources: [services,pods] verbs: [get,watch,list] - apiGroups: [discovery.k8s.io] resources: [endpointslices] verbs: [get,watch,list] - apiGroups: [extensions,networking.k8s.io] resources: [ingresses] verbs: [get,watch,list] - apiGroups: [] resources: [nodes] verbs: [list] - apiGroups: [route.openshift.io] resources: [routes] verbs: [get,watch,list] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: external-dns-viewer roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: external-dns subjects: - kind: ServiceAccount name: external-dns namespace: default --- apiVersion: apps/v1 kind: Deployment metadata: name: external-dns spec: strategy: type: Recreate selector: matchLabels: app: external-dns template: metadata: labels: app: external-dns spec: serviceAccountName: external-dns containers: - name: external-dns image: registry.k8s.io/external-dns/external-dns:v0.23.0 args: - --sourceopenshift-route - --domain-filterexternal-dns-test.my-org.com # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones - --provideraws - --policyupsert-only # prevents ExternalDNS from deleting any records, set --policysync to enable full synchronization (including deletions) - --aws-zone-typepublic # only look at public hosted zones (valid values are public, private or no value for both) - --registrytxt - --txt-owner-idmy-identifier注意deployment.spec.template.spec.serviceAccountName: external-dns这一行它让 Pod 以刚创建的 ServiceAccount 身份运行从而获得读取 Route 等资源的权限。Route 数据源支持的注解根据 docs/annotations/annotations.md 的注解支持矩阵OpenShift 数据源支持以下注解前缀默认为external-dns.kubernetes.io/v0.22.0 之前为external-dns.alpha.kubernetes.io/注解作用external-dns.kubernetes.io/controller若值不是dns-controller则该 Route 被忽略不生成记录external-dns.kubernetes.io/hostname为 Route 追加额外的域名逗号分隔多个与spec.host并存external-dns.kubernetes.io/target显式指定 DNS 记录目标优先级高于从 route status 解析出的 canonical hostname未配置ROUTER_CANONICAL_HOSTNAME时必须使用external-dns.kubernetes.io/ttl自定义记录的 TTLprovider-specific 注解如 AWS 的external-dns.kubernetes.io/aws-weight透传给 provider 的额外属性其中external-dns.kubernetes.io/target的优先级在 source/openshift_route.go 中体现先尝试读取注解目标仅在注解目标为空时才回退到 route status 解析的目标。hostname注解的读取位于endpointsFromOcpRoute并且可以通过--ignore-hostname-annotation关闭。另外该数据源支持--fqdn-template模板fqdn-templatetrue当 Route 缺少spec.host时可以用模板如{{.Name}}.example.com派生主机名相关验证逻辑见 source/openshift_route_fqdn_test.go。端到端验证hello-openshift 示例下面的验证步骤基于 OpenShift 官方的 hello-openshift 示例应用。安装示例服务并通过 Route 暴露$ oc apply -f - EOF apiVersion: apps/v1 kind: Deployment metadata: labels: app: hello-openshift name: hello-openshift spec: replicas: 1 selector: matchLabels: app: hello-openshift template: metadata: labels: app: hello-openshift spec: containers: - image: openshift/hello-openshift name: hello-openshift --- apiVersion: v1 kind: Service metadata: labels: app: hello-openshift name: hello-openshift spec: ports: - port: 8080 protocol: TCP targetPort: 8080 selector: app: hello-openshift sessionAffinity: None type: ClusterIP --- apiVersion: route.openshift.io/v1 kind: Route metadata: name: hello-openshift spec: host: hello-openshift.example.com to: kind: Service name: hello-openshift weight: 100 wildcardPolicy: None EOFRoute 的spec.host: hello-openshift.example.com就是 ExternalDNS 要写入 DNS 的域名目标则来自 router 的 canonical hostname。用 curl 访问验证Route 被 admit 且 DNS 记录生效后访问该域名应得到应用响应$ curl -i http://hello-openshift.example.com HTTP/1.1 200 OK Date: Fri, 10 Apr 2020 09:36:41 GMT Content-Length: 17 Content-Type: text/plain; charsetutf-8 Hello OpenShift!如果 curl 返回 200 与Hello OpenShift!说明 Route 的 DNS 记录已经正确解析到 router 并完成流量转发。关键参数速查以下参数在 OpenShift Route 数据源的两种部署形态直接 Deployment 与 Operator 生成的 Pod中最为常用参数说明--sourceopenshift-route启用 OpenShift Route 数据源--openshift-router-namename多 ingress controller 时指定路由器名称取值来自status.ingress[*].routerName--domain-filterdomain限定处理的 hosted zone 域名--zone-id-filterzone-id限定处理的 hosted zone IDOperator 示例中使用--providerawsDNS provider 类型与具体 provider 教程配合--policyupsert-only/--policysync前者只增改不删后者完整同步含删除--aws-zone-typepublic/private只处理对应类型的 hosted zone--registrytxt使用 TXT registry 记录所有权--txt-owner-ididTXT 记录的所有者标识--txt-prefixprefixTXT 记录前缀Operator 示例中使用延伸阅读OpenShift Route 数据源完整实现目标选择、informer 初始化与 Endpoints 生成逻辑OpenShift Route 数据源测试多路由器、注解目标、label/annotation 过滤等行为的表格化验证FQDN 模板测试Route 缺省 host 时的模板派生行为支持的 Sources 总览openshift-route 在全部数据源中的能力矩阵注解总览target、hostname、ttl、controller等注解的通用语义AWS Provider 教程与本文 Deployment 清单配套的 provider 配置步骤赞分享云原生【免费下载链接】external-dnsConfigure external DNS servers dynamically from Kubernetes resources项目地址https://gitcode.com/gh_mirrors/ex/external-dns点击查看免费下载相关推荐微信聊天记录永久保存3步打造你的数字记忆保险箱微信聊天记录永久保存3步打造你的数字记忆保险箱 你是否曾因手机丢失、系统升级或误操作而丢失珍贵的微信聊天记录那些与家人的温馨对话、朋友的重要约定、工作的关键云原生终极界面字体解决方案Source Sans 3 专业使用指南终极界面字体解决方案Source Sans 3 专业使用指南 还在为现代用户界面字体选择而烦恼吗面对琳琅满目的字体库你是否曾因字体渲染不清晰、字重选择有限云原生终极指南如何在macOS上使用eqMac专业音频均衡器提升音质体验终极指南如何在macOS上使用eqMac专业音频均衡器提升音质体验 你是否厌倦了macOS系统单调的音频效果想要为你的音乐、电影和游戏带来专业级的音质提升云原生上一篇Mealie 备份与恢复实战指南内置备份机制、文件结构与 Postgres 恢复要点下一篇FanControl 识别不到风扇按四层逐一排查让风扇重新回来创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/25 15:43:16

Atlas 300V 24G推理卡实战:YOLO多路视频流部署与调优

拿到一块Atlas 300V 24G的时候,我第一反应不是赶紧跑YOLO demo,而是先问自己一个问题:这卡到底是干嘛用的,和训练卡有什么区别,24G这个显存数字在推理场景里到底能带来多少真实收益。热搜词里天天有人在问“atlas 300v…

2026/9/25 15:43:16

windsurf Pro 获取详细教程:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 16:48:19

2026校招测评考什么?网申测评如何通过 + 高分攻略

一、网申测评,到底在筛选什么2026届校招的网申测评环节正在发生一个微妙但重要的变化:企业不再只看你“答对了多少题”。北森AI人才科学研究院发布的报告显示,2026年预计有95%的应届生在求职中使用AI工具,一年前这个数字还是66.7%…

2026/9/25 16:48:19

基于SpringBoot的大学生科技社团管理系统设计与实现

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 1. 项目背景与意义 随着高校学生社团数量的不断增长,传统的人工管理方式在社团信息登记、活动组织、成员管理等方面逐渐暴露出效率低、易出错、信息不透明等…

2026/9/25 16:48:19

计算机为什么用二进制?十进制会有什么问题【庖丁解牛】

根因 计算机底层依靠电子元器件的物理状态来表达信息。硬件最容易稳定实现的是两种状态:通电/断电、高电平/低电平、磁畴正向/反向。二进制刚好只有0、1两个符号,完美匹配硬件双稳态特性;如果强行做十进制,需要电路稳定区分10种不…

2026/9/25 16:48:19

合肥纹眉哪家技术自然不生硬?合肥做野生眉避坑攻略

很多合肥的姐妹在纠结纹眉,怕做完像蜡笔小新、颜色发蓝发红,想找一家审美在线、不流水线操作的门店。在合肥做半永久纹眉,核心不是越便宜越好,重点看老师的审美、色料品质,还有会不会根据五官定制眉形。我对比了好几家…

2026/9/25 16:43:18

SNOMED CT 关系型数据库落地实战:语义完整性与SQL查询优化

简介:本资源是一套面向医疗信息学开发者与医学知识图谱工程师的SNOMED CT术语系统数据库化工具集,解决临床术语标准化数据在关系型及图数据库中快速建模、加载与查询的实际问题。包内共115个文件,涵盖64个SQL脚本(用于MySQL/Postg…

2026/9/24 20:24:47

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/25 0:02:35

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:02:35

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:02:35

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑