新闻详情

新闻详情

首页 / 资讯中心 / 详情

ExternalDNS 使用 F5 Networks VirtualServer 作为 DNS 记录源(Source)的完整配置指南

发布时间:2026/9/25 5:08:23来源:尧图网络
ExternalDNS 使用 F5 Networks VirtualServer 作为 DNS 记录源(Source)的完整配置指南
云原生【免费下载链接】external-dnsConfigure external DNS servers dynamically from Kubernetes resources项目地址https://gitcode.com/gh_mirrors/ex/external-dns点击查看免费下载本指南讲解如何在 Kubernetes 集群中让 ExternalDNS 以 F5 Networks 的VirtualServer自定义资源CRD为数据源自动把虚拟服务器的域名与地址同步到 DNS 提供商。读完本文你将掌握--sourcef5-virtualserver的启用方式与 RBAC 配置、spec.host/spec.hostAliases/spec.virtualServerAddress/status.vsAddress的取值逻辑、目标Target优先级与 TTL 注解以及基于注解/标签过滤和 FQDN 模板fqdn-template的进阶用法。背景F5 VirtualServer 是什么VirtualServer是 k8s-bigip-ctlr 项目定义的 CRD用于描述 F5 BIG-IP 上的虚拟服务器它声明一个对外提供服务的host域名、绑定的后端服务Pool以及 BIG-IP 上监听该服务的虚拟服务器地址。ExternalDNS 把这类 CRD 当作一种负载均衡器类型的源在源码注释中标注为categoryLoad Balancers从中提取 DNS 记录并交给所选 provider 去发布从而实现F5 虚拟服务器 → DNS 记录的全自动同步。说明VirtualServerCRD 由 k8s-bigip-ctlr 随控制器一并下发CRD 的完整字段定义以该项目文档为准本文只聚焦 ExternalDNS 从这些字段中读取并生成 DNS 记录的行为。一、启用 F5 VirtualServer 源1. 前置条件在把该源接入 ExternalDNS 之前需要保证集群中已安装k8s-bigip-ctlr控制器因为VirtualServer所需的 CRD 就捆绑在控制器中apiVersion: cis.f5.com/v1、kind: VirtualServer。ExternalDNS 通过动态客户端dynamic client监听该 GVR——source/f5_virtualserver.go 中声明的 GVR 为var f5VirtualServerGVR schema.GroupVersionResource{ Group: cis.f5.com, Version: v1, Resource: virtualservers, }2. 通过 Helm 启用在 ExternalDNS 的 Helmvalues.yaml中把f5-virtualserver追加到sources列表sources: - ... - f5-virtualserver - ...3. 通过 Deployment 参数启用如果不使用 Helm直接在 Deployment 的容器args中追加参数args: - --sourcef5-virtualserver该值对应 source/types/types.go 中定义的源类型名F5VirtualServer f5-virtualserver并由 source/store.go 分派到buildF5VirtualServerSource最终调用NewF5VirtualServerSource构建源实例见 source/store.go。4. RBAC 授权不以 Helm 安装时需要为 ExternalDNS 的 ServiceAccount 所绑定的ClusterRole增加对virtualservers资源的读取权限否则源无法list/watch到 CR 对象- apiGroups: - cis.f5.com resources: - virtualservers verbs: - get - list - watch从源码看源使用动态 informer 监听virtualservers并在启动时通过WaitForDynamicCacheSync等待本地缓存就绪source/f5_virtualserver.go因此上述list/watch权限是运行的基本前提。二、工作原理从哪些字段生成 DNS 记录f5VirtualServerSource实现Source接口Endpoints、AddEventHandler等。每次同步时它遍历命名空间内所有VirtualServer对象将其转换为f5.VirtualServer结构体后按以下字段生成 Endpointsource/f5_virtualserver.go字段作用spec.host虚拟服务器的主域名生成一条主 DNS 记录spec.hostAliases附加域名列表每个非空别名生成一条指向相同目标的记录spec.virtualServerAddress虚拟服务器 IPBIG-IP 上监听地址作为目标 IPstatus.vsAddress控制器回写的虚拟服务器地址作为目标 IP 的兜底来源对应地Endpoint 的DNSName取自spec.host与spec.hostAliases中的每个非空条目Targets按下述优先级解析RecordType固定为 A 记录测试用例中均断言RecordTypeA见 source/f5_virtualserver_test.go。示例带 hostAliases 的 VirtualServerapiVersion: cis.f5.com/v1 kind: VirtualServer metadata: name: example-vs namespace: default spec: host: www.example.com hostAliases: - alias1.example.com - alias2.example.com virtualServerAddress: 192.168.1.100该配置将生成三条 DNS A 记录www.example.com→192.168.1.100alias1.example.com→192.168.1.100alias2.example.com→192.168.1.100对应源码中的处理逻辑先为spec.host调用EndpointsForHostname生成主记录再遍历spec.HostAliases对每个非空别名追加一条记录source/f5_virtualserver.go别名含空字符串时会被跳过测试用例 F5 VirtualServer with hostAliases containing empty strings 验证了这一点见 source/f5_virtualserver_test.go。三、目标Target解析优先级当spec.host/spec.hostAliases有值、且虚拟服务器具有有效 IP 时目标按以下优先级确定source/f5_virtualserver.gotarget 注解external-dns.kubernetes.io/target优先级最高注解值直接作为目标spec 地址spec.virtualServerAddress未设置注解时使用status 地址status.vsAddress注解与 spec 地址均缺失时使用。若三者都不可用该VirtualServer会被跳过并输出日志F5 VirtualServer ns/name is missing a valid IP address, skipping endpoint creation.source/f5_virtualserver.go。有效 IP的判断细节hasValidVirtualServerIP会把status.vsAddress转为小写后与none、比较source/f5_virtualserver.go因此当status.vsAddress为Nonek8s-bigip-ctlr 在未分配地址时的回写值或空字符串时视为无有效 IP即使spec.host存在也不生成记录——测试用例 F5 VirtualServer with missing IP address and OK statusVSAddress: None期望结果为nil即验证了这一点source/f5_virtualserver_test.go目标解析只发生在hasValidVirtualServerIP为真之后。注意判断依据是status.vsAddress是否为有效值而实际使用的目标仍按上文优先级取 target 注解 →spec.virtualServerAddress→status.vsAddressstatus.Status为ERROR时只要存在有效 IP记录仍会生成测试用例 F5 VirtualServer with error status but valid IP 验证见 source/f5_virtualserver_test.go。四、TTL 支持可以为单个VirtualServer自定义 DNS 记录 TTL秒在metadata.annotations中设置metadata: name: example-vs namespace: default annotations: external-dns.kubernetes.io/ttl: 300源码通过annotations.TTLFromAnnotations读取该注解并应用到该对象生成的所有 Endpointsource/f5_virtualserver.go。测试用例 F5 VirtualServer TTL annotation 使用external-dns.kubernetes.io/ttl: 600并断言生成的记录RecordTTL: 600见 source/f5_virtualserver_test.goF5 VirtualServer with hostAliases and TTL annotation 则验证了 TTL 会同时作用于主域名与全部别名source/f5_virtualserver_test.go。未设置时RecordTTL为 0表示由 provider 侧使用默认 TTL。五、注解过滤与标签过滤你可以通过--annotation-filter只处理带特定注解的VirtualServer--annotation-filterfoobar也可以配合--label-filter按资源标签过滤。过滤并非在 Endpoints 生成后才进行而是在 informer 建立索引Indexer时就生效NewF5VirtualServerSource为 informer 注册了三个索引器source/f5_virtualserver.goinformers.MustAddIndexers(virtualServerInformer.Informer(), informers.IndexerWithOptions*unstructured.Unstructured, informers.IndexSelectorWithLabelSelector(cfg.LabelFilter), informers.IndexSelectorWithConditions(annotations.IsControllerMatch[*unstructured.Unstructured]), ))对应测试注解过滤命中foobar匹配时生成记录未命中时结果为nil见 source/f5_virtualserver_test.go标签过滤命中/未命中同样有完整用例source/f5_virtualserver_test.go索引器测试覆盖注解 标签组合过滤以及controller 注解不匹配时被排除source/f5_virtualserver_test.go。注控制器注解external-dns.kubernetes.io/controller由annotations.IsControllerMatch统一处理用于多控制器共存时按--controller-id归属资源行为与其他源一致。六、结合 FQDN 模板fqdn-template的进阶用法f5-virtualserver源支持 ExternalDNS 的模板机制externaldns:source:fqdn-templatetrue通过--fqdn-template、--target-template与--fqdn-target-template在无有效 IP 时也能生成记录或为已有记录追加模板记录。模板引擎对每个VirtualServer应用模板source/f5_virtualserver.go测试见 source/f5_virtualserver_fqdn_test.go。6.1 无有效 IP 时生成 CNAME当status.vsAddress为空、且存在--fqdn-template与--target-template时可基于对象元数据生成记录例如--fqdn-template{{.Name}}.example.com --target-templatelb.example.com测试用例验证my-vs对象无 IP将生成my-vs.example.com→lb.example.comCNAME记录source/f5_virtualserver_fqdn_test.go。6.2 无有效 IP 时生成 A 记录--fqdn-target-template格式为域名:目标可为无 IP 的对象生成 A 记录--fqdn-target-template{{.Name}}.example.com:1.2.3.4对应测试生成my-vs.example.com→1.2.3.4A 记录source/f5_virtualserver_fqdn_test.go。6.3 模板可引用的字段模板上下文是完整的VirtualServer对象含 TypeMeta因此除.Name、.Namespace外还可引用.Kind、.APIVersion等。测试中有两个示例{{.Kind | toLower}}.{{.Name}}.example.com→virtualserver.my-vs.example.comsource/f5_virtualserver_fqdn_test.go{{.Name}}.{{replace / . .APIVersion}}.example.com→my-vs.cis.f5.com.v1.example.comsource/f5_virtualserver_fqdn_test.go。6.4 与基于 IP 的记录共存combine开启--combine-fqdn-template或--combine-fqdn-target-template后模板生成的记录会与基于 IP 生成的记录同时保留测试 fqdn-template with combine adds template endpoint alongside IP-based endpoint 验证my-vs.example.comCNAME与www.example.comA同时存在source/f5_virtualserver_fqdn_test.go未开启 combine 时只要存在基于 IP 的记录模板生成的记录会被忽略source/f5_virtualserver_fqdn_test.gocombine 同样适用于 hostAliases 场景别名记录与模板记录可并存source/f5_virtualserver_fqdn_test.go。七、记录合并与事件关联源在返回 Endpoint 前会调用endpoint.MergeEndpoints合并同名记录并调用endpoint.AttachRefObject为每个 Endpoint 附加所属资源引用events.NewObjectReference(virtualServer, types.F5VirtualServer)对应测试断言中的resource标签格式为f5-virtualserver/namespace/name例如f5-virtualserver/virtualserver/test-vs见 source/f5_virtualserver_test.go。这些引用信息在资源删除时可被 registry 用于准确清理对应 DNS 记录。八、完整接线一览源注册--sourcef5-virtualserver→ source/store.go 分派 →buildF5VirtualServerSourcesource/store.go→NewF5VirtualServerSourcesource/f5_virtualserver.go记录生成Endpoints→ 遍历 informer 索引结果 → 按 source/f5_virtualserver.go 的endpointsFromVirtualServers生成并合并 Endpoint行为验证表驱动测试覆盖目标优先级、TTL、注解/标签过滤、无效 IP 跳过、hostAliases 等全部路径source/f5_virtualserver_test.go模板相关行为见 source/f5_virtualserver_fqdn_test.go。常见问题VirtualServer 存在但没有任何 DNS 记录被创建最常见原因是status.vsAddress为空或为None且未配置 target 注解/spec.virtualServerAddress。可先检查 BIG-IP 控制器是否已将地址回写到 status若确认不需要 IP 目标可改用 fqdn-template 或 target-template 生成记录。--annotation-filter生效但某台服务器仍被处理确认注解键值拼写完全一致如foobar并注意该过滤器在 informer 索引阶段即生效修改过滤条件后需要 ExternalDNS 重建索引通常表现为重启后生效。是否需要额外 RBAC除cis.f5.com/virtualservers的get/list/watch外无需为该源配置其他资源权限若使用了 fqdn-template也无需额外权限因为模板只消费已 watch 到的对象元数据。赞分享云原生【免费下载链接】external-dnsConfigure external DNS servers dynamically from Kubernetes resources项目地址https://gitcode.com/gh_mirrors/ex/external-dns点击查看免费下载相关推荐7种场景下的ComfyUI-Custom-Scripts深度解析掌握AI绘画工作流增强的3层架构方案7种场景下的ComfyUI Custom Scripts深度解析掌握AI绘画工作流增强的3层架构方案 ComfyUI Custom Scripts是一个专注于云原生3个核心技巧如何让智能家居能耗计算更精准3个核心技巧如何让智能家居能耗计算更精准 你是否好奇家中智能设备的真实能耗是否曾疑惑为什么智能灯在调暗时耗电没有明显减少智能家居的能耗监控一直是技术爱好云原生Bebas Neue 免费商用标题字体安装、字重、排版一次讲透Bebas Neue 免费商用标题字体安装、字重、排版一次讲透 找标题字体翻遍免费库是不是总差点意思Bebas Neue 字体免费商用是专为标题而生的无云原生上一篇ControlNet多条件控制实战Openpose与深度图的完美融合技巧下一篇终极Android WebView开发指南如何用AgentWeb打造无障碍应用体验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

3D校园导航系统开发实战:软件工程课设从建模到答辩全记录 2026/9/25 5:40:34

3D校园导航系统开发实战:软件工程课设从建模到答辩全记录

毕业季又到了,又看到一堆学弟学妹在群里问软件工程课程设计能做什么、毕业设计选什么方向。我当初选的是“3D校园导航系统”,既有视觉冲击力,又能把软件工程那套流程完整走一遍,答辩的时候老师明显更感兴趣。这篇工作日志&#xf…

阅读更多 →
Atlas 300V 24G推理卡部署YOLOv8实战指南 2026/9/25 5:40:34

Atlas 300V 24G推理卡部署YOLOv8实战指南

1. 先弄明白Atlas 300V 24G到底是什么最近后台好几个朋友都在问同一个问题:Atlas 300V 24G是不是运算加速卡?能用来跑YOLO吗?今天就结合我实际折腾的经验,把这套东西从头到尾捋一遍。先说结论:Atlas 300V 24G是一块标准…

阅读更多 →
librosa.display 深度解析:基于 matplotlib 的音频与音乐可视化 API 全解 2026/9/25 5:40:16

librosa.display 深度解析:基于 matplotlib 的音频与音乐可视化 API 全解

音频处理科研 【免费下载链接】librosa Python library for audio and music analysis 项目地址: https://gitcode.com/gh_mirrors/li/librosa 点击查看 免费下载 本文围绕 librosa 官方文档中的 Display API 索引页 展开,系统讲解 librosa.display 模块…

阅读更多 →
Apache Beam 基础设施合规强制模块:IAM 策略与服务账号密钥漂移检测实战 2026/9/25 5:40:16

Apache Beam 基础设施合规强制模块:IAM 策略与服务账号密钥漂移检测实战

大数据批处理流处理数据工程 【免费下载链接】beam Apache Beam is a unified programming model for Batch and Streaming data processing. 项目地址: https://gitcode.com/gh_mirrors/beam4/beam 点击查看 免费下载 infra/enforcement 是 Apache Beam 仓库中用于…

阅读更多 →
Atlas 300V 24G跑YOLO全流程:从环境搭建到推理优化 2026/9/25 5:40:09

Atlas 300V 24G跑YOLO全流程:从环境搭建到推理优化

干了这么多年AI部署,说实话被各种推理卡折磨过不少回,Atlas 300V 24G 这张卡算是让我印象比较深的一张。一开始单纯以为它就是一张普通的 PCIe 加速卡,结果从驱动到算子适配到模型转换,每一步都有它自己的脾气。这篇文章就围绕 At…

阅读更多 →
Atlas 300V 24G推理加速卡部署YOLOv5全流程实战 2026/9/25 5:40:09

Atlas 300V 24G推理加速卡部署YOLOv5全流程实战

最近在折腾Atlas这块卡,把YOLO模型从PyTorch一路迁移到昇腾推理环境,踩了不少坑,也终于理清了整套流程。先说结论:Atlas 300V 24G确实是运算加速卡,但更准确的说法是AI推理加速卡,它和打游戏的显卡、跑训练…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉