尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Argo CD managed-by-url 注解详解:多实例环境下 Application 链接的精准跳转

Argo CD managed-by-url 注解详解:多实例环境下 Application 链接的精准跳转 Argo CD managed-by-url 注解详解多实例环境下 Application 链接的精准跳转【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd导读在多 Argo CD 实例多租户、hub-and-spoke 中心辐射架构环境下采用 app-of-apps 模式部署子应用时父实例 UI 中点击子应用的链接会默认指向父实例自身导致跳转错误。本指南围绕argocd.argoproj.io/managed-by-url注解完整讲解其定义、使用场景、配置格式、URL 校验规则、本地双实例联调测试以及排障手段并结合仓库源码校验实现、Deep Links 渲染与 e2e 测试给出实现层面的佐证。读完本文你将掌握如何让 Application 链接始终跳转到真正管理它的那个 Argo CD 实例。注解是什么argocd.argoproj.io/managed-by-urlmanaged-by-url是一个可选的 Application 元数据注解用于声明当前 Application 由哪一个 Argo CD 实例管理。它解决的核心问题是当多个 Argo CD 实例共存时UI 中生成的应用链接应当指向正确的那一个管理实例而不是当前展示它的实例。在源码中注解键被定义为常量位于 pkg/apis/application/v1alpha1/application_annotations.go// AnnotationKeyManagedByURL contains the URL of the Argo CD instance managing the application AnnotationKeyManagedByURL argocd.argoproj.io/managed-by-url典型应用场景最典型的场景是 app-of-apps应用套娃模式可参见 docs/operator-manual/cluster-bootstrapping.md主 Argo CD 实例创建父 Applicationparent-app父 Application 从 Git 仓库部署出子 Applicationchild-app而子应用实际上由次 Argo CD 实例管理无注解时在主实例 UI 的资源树中点击 child-app链接会尝试在主实例中打开——这是错误的有注解时点击 child-app链接正确跳转到次实例中对应的 Application 页面。该注解在多租户场景不同团队各自维护自己的 Argo CD 实例以及 hub-and-spoke 中心辐射架构中心实例统一管理多个边缘实例中尤其有价值。它只影响 UI 中链接的生成方向不影响 Application 本身的同步与部署行为。完整示例app-of-apps 下的父与子第一步创建父 Application在主实例中创建父 Application示例内容来自 docs/operator-manual/managed-by-url.mdapiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: parent-app namespace: argocd spec: project: default source: repoURL: https://github.com/YOUR-ORG/my-apps-repo.git targetRevision: main path: path-to-child-app destination: server: https://kubernetes.default.svc namespace: namespace-b syncPolicy: automated: selfHeal: true prune: true第二步在 Git 仓库中为子 Application 添加注解在 Git 仓库apps/child-apps/child-app.yaml中写入子 Application并通过 annotations 声明它的管理实例地址apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: child-app namespace: namespace-b annotations: argocd.argoproj.io/managed-by-url: http://localhost:8081 # 实际部署时替换为次 Argo CD 实例的真实 URL spec: project: default source: repoURL: https://github.com/YOUR-ORG/my-apps-repo.git targetRevision: HEAD path: path-to-child-app destination: server: https://kubernetes.default.svc namespace: namespace-b syncPolicy: automated: selfHeal: true prune: true结果验证父 Application 同步 Git 并部署出子 Application 后在主实例 UI 中资源树中点击child-app链接会导航到https://secondary-argocd.example.com/applications/namespace-b/child-app这类由注解 URL 拼出的地址子应用在真正管理它的那个 Argo CD 实例中正确打开。配置说明与 URL 校验规则注解格式一览字段值注解键argocd.argoproj.io/managed-by-url作用目标Application取值合法的 HTTP(S) URL是否必填否URL 校验规则注解值必须是合法的 HTTP(S) URL✅https://argocd.example.com✅https://argocd.example.com:8080✅http://localhost:8080用于开发调试❌argocd.example.com缺少协议❌javascript:alert(1)非法协议校验逻辑在服务端创建/更新 Application 时强制执行。无效的 URL 会导致 Application 无法创建或更新。行为规则生成应用链接时Argo CD 的取舍策略为无注解使用当前实例的 base URL有合法注解使用注解中的 URL注解无效回退到当前实例的 base URL并记录告警日志。[!WARNING] 请确保注解中的 URL 能被用户浏览器访问。内网部署时应使用内部 DNS 名称或配置相应的网络访问策略。源码级原理校验、回退与 Deep Links 渲染服务端校验链路在创建或更新 Application 时managed-by-url会与仓库、权限等校验一起被检查位于 server/application/application.go// Validate managed-by-url annotation managedByURLConditions : argo.ValidateManagedByURL(app) if len(managedByURLConditions) 0 { return status.Errorf(codes.InvalidArgument, application spec for %s is invalid: %s, app.Name, argo.FormatAppConditions(managedByURLConditions)) }实际校验函数 ValidateManagedByURL 的逻辑为注解不存在或为空时直接放行否则调用settings.ValidateExternalURL校验失败时返回类型为ApplicationConditionInvalidSpecError、消息以invalid managed-by URL:开头的条件。这也是排障章节中创建失败报错文案的来源。ValidateExternalURL定义于 util/settings/settings.go通过url.Parse解析后强制要求 scheme 为http或httpsif URL.Scheme ! http URL.Scheme ! https { return errors.New(URL must include http or https protocol) }单元测试 util/argo/argo_test.go 覆盖了包括https://、http://、localhost、127.0.0.1、带路径与查询参数的 URL、以及javascript:、data:、file://等恶意协议在内的 13 个用例可作为校验行为的权威参考。Deep LinksmanagedByURL模板变量从源码看注解值会被注入到 Deep Links 链接模板的{{.managedByURL}}变量中供管理员在argocd-cm配置application.links时拼装跳转到管理实例的链接server/deeplinks/deeplinks.go 定义了ManagedByURLKey managedByURL同文件中 managedByURLFromAnnotations 从 Application 注解中读取该值并再次经过ValidateExternalURL校验后才注入模板数据对象CreateDeepLinksObject 将managedByURL与resource、application/app、cluster、project一起组装为模板渲染上下文。一个典型的argocd-cm深链接配置示例data: url: https://argocd-test.example.com application.links: | - url: {{.managedByURL}}/applications/{{.app.metadata.name}} title: Managed By Instance description: Open in managing ArgoCD instance对应的 e2e 测试 test/e2e/managed_by_url_test.go 中的TestManagedByURLWithAnnotation验证了给 Application 打上注解后ListLinks返回的深链接 URL 应为managedByURL /applications/ app.Name而TestManagedByURLFallbackToCurrentInstance则验证了无注解时链接回退到当前实例的settings.URL——这与上文行为规则完全对应。本地联调双实例验证注解效果安装与端口转发以下步骤可在本地起两套 Argo CD 实例验证注解行为命令来自原文档# 安装主实例 kubectl create namespace argocd kubectl apply -n argocd --server-side --force-conflicts -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml # 安装次实例 kubectl create namespace namespace-b kubectl apply -n namespace-b --server-side --force-conflicts -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml # 分别端口转发两套实例 kubectl port-forward -n argocd svc/argocd-server 8080:443 kubectl port-forward -n namespace-b svc/argocd-server 8081:443 # 等待 Argo CD 就绪 kubectl wait --forconditionavailable --timeout300s deployment/argocd-server -n argocd # 获取主实例 admin 密码 kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath{.data.password} | base64 -d echo说明上述安装清单链接对应本仓库 manifests/install.yaml如需离线安装可改用仓库内清单。验证步骤浏览器打开http://localhost:8080使用admin与上一步获取的密码登录进入parent-appApplication 页面点击资源树中的child-app页面应跳转到http://localhost:8081/applications/namespace-b/child-app。如需登录次实例查看子应用重复获取密码命令# 获取次实例 admin 密码 kubectl -n namespace-b get secret argocd-initial-admin-secret -o jsonpath{.data.password} | base64 -d echo故障排查链接仍指向错误的实例首先确认注解是否已生效kubectl get application child-app -n instance-b -o jsonpath{.metadata.annotations.argocd\.argoproj\.io/managed-by-url}预期输出是一个完整 URL例如http://localhost:8081或实际配置的https://secondary-argocd.example.com。若注解存在但链接依旧无效确认 URL 能从浏览器直接访问检查浏览器控制台是否有报错确认 URL 格式完整包含http://或https://协议前缀。Application 创建失败invalid managed-by URL当创建报错包含invalid managed-by URL时逐项核对✅ URL 包含协议https://或http://✅ URL 无拼写错误✅ URL 仅使用合法字符✅ URL 不是潜在恶意 scheme如javascript:。嵌套app-of-apps子应用不工作对于 app-of-apps 场景依次确认Git 仓库中的子 Application YAML 包含该注解父 Application 已成功同步子 Application 已在集群中创建。用以下命令确认子应用存在kubectl get application CHILD-APP-NAME -n NAMESPACE相关资源Application Annotations 完整清单查看更多argocd.argoproj.io注解App of Apps 模式本注解最常见的应用场景Deep Links 深度链接{{.managedByURL}}变量的完整模板能力。【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表