Community编程与开发github.com

carnufex/gitops-app-onboarding

向 GitOps 管理的 Kubernetes 集群添加新应用(使用 ArgoCD ApplicationSet 每个应用一个目录的模式,支持 External Secrets、Gateway API 路由、可选 LoadBalancer IP)。适用于搭建或上线新应用/服务时创建独立的 ArgoCD 应用和命名空间,或新增的应用无法同步、密钥不出现的情况。涵盖安全的上线顺序、新命名空间需要的所有白名单、镜像/密钥/存储约定、提醒值班人员的告警,以及何时可以公开暴露。

gitops-app-onboarding 是什么?

该技能提供了一套标准化的流程,用于在 GitOps 管理的 Kubernetes 集群上通过 ArgoCD 上线新应用。它基于“一个目录一个应用”的 ApplicationSet 模式,自动为每个文件夹创建独立的 ArgoCD 应用和命名空间。技能详细描述了安全的上线顺序:首先创建命名空间并确保其在 AppProject、ClusterSecretStore、LoadBalancer IP 池等多个位置的白名单中(同一提交内完成);然后依次添加 Kustomization、ExternalSecrets(密钥值不得提交到 Git)、运行时清单(必须包含就绪探针、资源请求和符合命名空间 Pod 安全级别的安全上下文)、告警规则(即“3am 信号”),最后才添加路由。技能还涵盖了镜像(不可变标签)、密钥(ExternalSecret 模式)、存储(使用配置文件中指定的存储类)的约定,并强调在公开暴露之前必须确认应用运行正常、密钥解析成功、健康检查通过,所有更改必须推送到 ArgoCD 跟踪的分支才能生效。支持 ArgoCD、External Secrets、Gateway API 等平台,并可集成监控告警和负载均衡器 IP 分配。

兼容平台✓Claude Code~Codex CLI~Cursor
Part ofMobile
npx skills add https://github.com/carnufex/claude-skills/tree/HEAD/plugins/gitops/skills/gitops-app-onboarding

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

GitOps 应用上线

该方法是通用的;集群的实际情况(路径、白名单、仓库、存储类、网关、参考应用、告警位置)位于 GitOps 仓库的 .claude/profiles/gitops.md 中。请先阅读配置文件。 如果缺少配置文件,请通过读取仓库(ApplicationSet、AppProject、密钥存储、一个或两个现有应用、监控文件夹)从 templates/profile.md 创建它,并在一行内告知用户您已创建。切勿猜测路径。

应用如何变为在线

  • 一个带目录生成器的 ApplicationSet 将配置文件中“apps 目录”下的每个文件夹变成其自己的 ArcoCD 应用和命名空间。一旦文件夹包含有效的 kustomization.yaml,它就会被部署。
  • 在推送到 ArgoCD 跟踪的分支之前,不会有任何内容到达集群。仅使用 kubectl 应用的更改会在下次同步时被还原。
  • 平台组件(CNI、存储、控制器)不放在 apps 目录中;配置文件说明了它们的位置。

新命名空间必须在同一提交中处处列入白名单

配置文件中的“白名单”部分列出了每个提及命名空间的文件(通常是 AppProject 的 destinations、ClusterSecretStore 的 conditions,以及如果应用需要 LB IP 时的 LoadBalancer IP 池和 L2/BGP 公告选择器)。漏掉一个将导致应用无法同步,其 ExternalSecret 保持 SecretSyncError 状态,或 LB IP 永远不会被公告。在添加文件夹的提交中,将命名空间添加到每个适用的文件。

上线顺序(先创建最小的安全形状)

  1. ns.yaml:带有配置文件中 Pod 安全标签的命名空间。
  2. kustomization.yaml:按依赖顺序排列的资源(命名空间和配置,然后工作负载,最后路由)。
  3. 密钥:首先在后端密钥存储中创建条目(配置文件:“密钥”部分),然后为每个密钥创建一个 ExternalSecret。切勿提交密钥值;引导和紧急密钥应保留在 Git 之外。
  4. 运行时清单(Deployment、Service、PVC、ConfigMap),仅在确认镜像名称和密钥名称之后。使用真实健康端点的就绪探针和存活探针、资源请求以及命名空间的 Pod 安全级别所需的安全上下文。
  5. 3am 信号(见下文),与工作负载在同一更改中。
  6. 路由,最后添加,一旦镜像运行、密钥解析、探针通过(参见“暴露”)。
  7. 应用文件夹中的 README.md:它是什么、运行时依赖项、密钥名称、存储、如何访问它。

约定(配置文件中包含具体值)

  • 镜像:固定 tag@sha256:<digest>,除非配置文件指示应用跟踪移动标签;自有镜像来自配置文件中的仓库,并使用不可变标签。私有镜像需要配置文件中的拉取密钥模式。
  • 密钥:使用 ExternalSecret 资源对接配置文件中的 ClusterSecretStore,绝不使用内联的 Secret 数据。
  • 存储:配置文件中的存储类及各自的用途(小型复制的块卷 vs NFS 上的大量数据)。配置文件中的容量限制是硬性限制。
  • 路由:公共网关和内部网关及其主机模式;通过 LoadBalancer Service 实现原始 TCP/UDP。
  • 复制配置文件中“参考应用”的形状,而不是发明新的形状。

3am 信号

在推送前先问:如果这个应用在凌晨 3 点崩溃,谁会知道,他们首先会看什么?

  • 应用必须被一个能够联系到人的告警覆盖:将其命名空间和工作负载添加到配置文件中的“监控”告警规则(不可用副本、崩溃循环、待处理 Pod 或 PVC),或者如果应用具有这些规则无法发现的故障模式(如队列停止排空、作业停止运行、证书或令牌过期),则添加特定于应用的规则。
  • 应用的日志必须说明哪里出了故障,并附上定位问题的 ID;如果镜像属于我们且日志未包含这些信息,那将是一项待办任务。
  • 在提交消息中写入信号:3am: <告警名称> via <接收器>。

暴露

在应用运行、密钥解析、健康检查通过之前,不要添加公共路由。仅限内部使用的工具只连接到内部网关,不获取公共路由。当您确实需要公开暴露时,请遵循配置文件中“相关技能”部分的公共入口路径(DNS、隧道、证书)。

上线后(验证,不要假设)

  1. 推送;观察新应用出现并收敛(kubectl get applications.argoproj.io -n argocd,或配置文件中的“验证”命令)。如果配置文件显示了如何跳过轮询延迟,请请求手动刷新。
  2. 检查:应用“已同步”且“健康”,每个 ExternalSecret “密钥已同步”,Pod 就绪,路由响应,并且告警规则已加载(它出现在监控堆栈的规则列表中)。
  3. 如果未收敛,请自上而下地检查链路:白名单 → 密钥 → ArgoCD 同步错误 → Pod → 路由。白名单通常是罪魁祸首。配置文件中的“相关技能”部分列出了集群的诊断技能。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相关技能