Argo CDargocd app get命令详解:查询应用状态、参数与资源树的完整指南
【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd
argocd app get是 Argo CD 命令行工具中用于获取单个 Application 详细状态的核心查询命令。在 GitOps 日常巡检与故障排查中,开发者可以用它快速确认应用当前是否已同步(Synced)、健康状态(Health)如何、目标集群与命名空间落在何处,以及资源树的父子依赖关系。读完本文,你将掌握该命令的全部输出格式(wide / yaml / json / tree)、刷新机制(--refresh/--hard-refresh)、多源应用的参数定位方式(--source-position/--source-name),并能结合仓库源码理解每条查询背后的 API 调用链。
命令概览:定位与作用
argocd app get归属于argocd app命令族。在 cmd/argocd/commands/app.go 中,NewApplicationCommand将get与create、sync、list、diff、rollback、logs等十余个子命令一起注册到app之下,其定位正如命令帮助文本所写:"Get application details"(获取应用详情)。
基本语法:
argocd app get APPNAME [flags]其中APPNAME是必填参数;若应用不在当前命名空间,可配合-N/--app-namespace指定。命令的完整实现位于 cmd/argocd/commands/app.go#L334-L516 的NewApplicationGetCommand函数中。
基础用法:官方示例逐一解读
命令内置的 Examples 完整覆盖了大多数查询场景(源码见 cmd/argocd/commands/app.go#L350-L383),原样整理如下:
# 以 wide 格式获取应用 "my-app" 的基础详情 argocd app get my-app -o wide # 以 YAML 格式获取应用 "my-app" 的详细信息 argocd app get my-app -o yaml # 以 JSON 格式获取应用 "my-app" 的详情 argocd get my-app -o json # 获取应用详情,并附带当前操作(operation)信息 argocd app get my-app --show-operation # 展示应用参数与覆盖值(overrides) argocd app get my-app --show-params # 展示应用参数与覆盖值,仅针对 spec.sources 中位置 1 的源 argocd app get my-app --show-params --source-position 1 # 展示应用参数与覆盖值,仅针对名为 "test" 的源 argocd app get my-app --show-params --source-name test # 获取应用详情时刷新应用数据 argocd app get my-app --refresh # 执行硬刷新,同时刷新应用数据与目标清单(manifests)缓存 argocd app get my-app --hard-refresh # 以树形结构展示应用详情 argocd app get my-app --output tree # 以详细树形结构展示应用详情 argocd app get my-app --output tree=detailed注意第三个示例沿用了历史简写形式
argocd get my-app -o json(省略app子命令),新代码中推荐使用完整形式argocd app get my-app -o json。
输出格式详解:从表格到树
-o/--output决定返回内容的呈现方式,源码在 cmd/argocd/commands/app.go#L475-L503 中通过switch output分发到不同渲染路径:
| 格式 | 说明 | 渲染路径 |
|---|---|---|
wide(默认) | 人类可读的摘要表 + 资源列表表 | printHeader+printAppResources |
yaml | 应用完整对象,YAML 序列化 | PrintResource(app, "yaml") |
json | 应用完整对象,JSON 序列化 | PrintResource(app, "json") |
tree | 摘要表 + 资源树(父子关系) | resourceParentChild+printTreeView |
tree=detailed | 摘要表 + 详细资源树 | resourceParentChild+printTreeViewDetailed |
wide:默认的巡检视图
wide视图分两个部分。第一部分是由printAppSummaryTable(cmd/argocd/commands/app.go#L655-L733)输出的摘要,包含以下关键字段:
- Name:应用限定名(
应用名.命名空间形式,由app.QualifiedName()生成) - Project:所属 Argo CD Project
- Server:目标集群地址(优先展示
spec.destination.server,否则回退到destination.name,见 getServer) - Namespace:目标命名空间
- URL:Argo CD UI 中该应用的可点击地址(优先取 settings 中的全局
url,否则按协议://server/applications/应用名推断,见 getAppURL) - Source / Sources:单个源显示
Repo、Target、Path,多源应用逐条列出,并额外展示Ref、Helm Values、Name Prefix(printAppSourceDetails) - SyncWindow:同步窗口状态,取值
Sync Allowed/Sync Denied/Manual Allowed,并列出Assigned Windows - Sync Policy:
Automated(含(Prune)标注)或Manual - Sync Status:
Synced to <revision>或OutOfSync from <revision>,当目标修订是 commit SHA 时会附带前 7 位短哈希 - Health Status:健康状态(
Healthy/Progressing/Degraded/Missing等)
第二部分在app.Status.Resources非空时打印资源表,表头为GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE(printAppResources),可以快速看到每个受管资源的同步状态与健康状态。
yaml / json:给脚本与自动化用的结构化输出
yaml与json直接输出Application对象的完整序列化结果,包含spec(源、目标、同步策略、项目)与status(同步、健康、资源、条件、操作状态等)全部字段,适合配合jq、yq或 CI 脚本做二次解析。
tree / tree=detailed:资源树视图
tree系列先输出与 wide 相同的摘要表,再基于ResourceTreeAPI 返回的资源节点构建父子关系:节点通过ParentRefs[0].UID建立 parent→child 映射,无父节点的作为根节点输出(parentChildDetails)。
tree表头:KIND/NAME STATUS HEALTH MESSAGE(printTreeView)tree=detailed表头:KIND/NAME STATUS HEALTH AGE MESSAGE REASON(printTreeViewDetailed),额外提供资源年龄与状态原因,排查 Degraded 资源时信息更全。
刷新机制:--refresh与--hard-refresh
Argo CD 的 Application 状态由 application-controller 周期性比对生成,并写入缓存。app get读取的是这份已缓存状态;若想看到最新结果,可以带刷新选项强制服务端重新比对。
两者的区别在 getRefreshType 中一目了然:
func getRefreshType(refresh bool, hardRefresh bool) *string { if hardRefresh { refreshType := string(argoappv1.RefreshTypeHard) return &refreshType } if refresh { refreshType := string(argoappv1.RefreshTypeNormal) return &refreshType } return nil }--refresh:对应RefreshTypeNormal,触发应用数据的常规刷新(重新生成/比对清单),但不重建缓存。--hard-refresh:对应RefreshTypeHard,除应用数据外,同时使目标清单缓存(target manifests cache)失效并重建,代价是更耗资源,通常在怀疑缓存陈旧导致比对结果异常时使用。
刷新类型最终通过application.ApplicationQuery{Name, Refresh, AppNamespace}随 gRPC 请求发送给 Argo CD API Server(cmd/argocd/commands/app.go#L412-L417)。
查看参数与覆盖值:--show-params与多源定位
--show-params用于展示 Helm 参数及其覆盖值,底层由 printParams 与 printHelmParams 实现,输出NAME VALUE两列表格,值超过 80 个字符时会被截断(truncateString)。
对于多源应用(spec.sources中存在多个源),必须显式指定查看哪个源:
--source-position N:按位置定位,计数从 1 开始;--source-name NAME:按源名称定位,源码通过getSourceNameToPositionMap(cmd/argocd/commands/app.go#L324-L332)把源名映射为位置序号后再复用同一套渲染逻辑。
源码中对这两个参数的校验非常严格(cmd/argocd/commands/app.go#L445-L466):
--source-name与--source-position不能同时使用,否则直接报错Only one of source-position and source-name can be specified.;- 指定了不存在的源名,会以
Unknown source name '<name>'终止; - 多源应用使用
--show-params时,若未指定位置(sourcePosition <= 0),会报错提示必须指定大于 0 的源位置; - 位置超过源数量时,报错
Source position should be less than the number of sources in the application。
单源应用则不受此限制,直接取app.Spec.GetSource()。
查看进行中的操作:--show-operation
当应用正处于Sync、Rollback等异步操作中时,--show-operation会在摘要表之后额外打印app.Status.OperationState(操作名称、阶段、启动/结束时间、消息、同步结果等),方便实时观察同步进度。源码中由 printHeader 的if showOperation && app.Status.OperationState != nil分支触发printOperationResult完成渲染。
命名空间与超时控制
-N/--app-namespace:Argo CD 应用可以创建在非默认命名空间,该选项用于限定应用所在命名空间。命令内部通过argo.ParseFromQualifiedName(args[0], appNamespace)(cmd/argocd/commands/app.go#L396)解析“应用名.命名空间”限定名,未指定时回退到该选项值。--timeout:请求超时秒数,默认defaultCheckTimeoutSeconds(值为 0,即不设置超时,见 cmd/argocd/commands/app.go#L2771)。设置后,若带刷新选项的请求超时,命令会自动以不带刷新的普通查询重试一次,保证至少能拿到缓存数据(见 getAppStateWithRetry 中的--timeout fired: retry once without refresh逻辑)。
完整选项参考
本命令专属选项
| 选项 | 简写 | 默认值 | 说明 |
|---|---|---|---|
--app-namespace string | -N | "" | 仅从指定命名空间获取应用 |
--hard-refresh | — | false | 刷新应用数据及目标清单缓存 |
--help | -h | — | 显示帮助 |
--output string | -o | "wide" | 输出格式:json/yaml/wide/tree |
--refresh | — | false | 获取时刷新应用数据 |
--show-operation | — | false | 显示应用操作信息 |
--show-params | — | false | 显示应用参数与覆盖值 |
--source-name string | — | "" | 应用的源列表中的源名称 |
--source-position int | — | -1 | 应用源列表中的源位置,计数从 1 开始 |
--timeout uint | — | 0 | 超时秒数(0 表示不超时) |
继承自父命令的常用选项(节选)
以下选项由argocd app及其上层命令统一提供,app get同样可用:
| 选项 | 说明 |
|---|---|
--server string | Argo CD 服务器地址 |
--auth-token string | 认证令牌;也可用环境变量ARGOCD_AUTH_TOKEN |
--config string | Argo CD 配置文件路径,默认/home/user/.config/argocd/config |
--core | 设为 true 时 CLI 直接与 Kubernetes 通信,绕过 Argo CD API Server |
--port-forward | 通过端口转发连接随机的 argocd-server 端口 |
--insecure | 跳过服务器证书与域名校验 |
--plaintext | 禁用 TLS |
--grpc-web | 启用 gRPC-Web 协议(当服务器位于不支持 HTTP/2 的代理之后时有用) |
--grpc-web-root-path string | 启用 gRPC-Web 并设置 web 根路径 |
--header strings | 为所有请求附加额外的 header,可重复指定,也支持逗号分隔 |
--kube-context string | 指定使用的 kube-context |
--logformat string | 日志格式:json/text(默认json) |
--loglevel string | 日志级别:debug/info/warn/error(默认info) |
--argocd-context string | 要使用的 Argo CD 服务器上下文名称 |
--client-crt string/--client-crt-key string | 客户端证书文件及私钥 |
--server-crt string/--server-crt-key | 服务器证书文件 |
--http-retry-max int | 与服务器建立 HTTP 连接的最大重试次数 |
--redis-name/--redis-compress/--redis-haproxy-name | 与 Redis 部署名称及压缩配置相关(通常用于--core模式) |
--controller-name/--repo-server-name/--server-name | 各组件名称,Helm 安装导致默认名称不同时需覆盖 |
--prompts-enabled | 强制启用/禁用可选的交互式提示 |
完整列表以argocd app get --help输出为准。
底层调用链:一次查询的完整旅程
从源码视角看,argocd app get my-app的执行链路大致如下:
cli.WithSignalContext包装命令入口,处理 Ctrl-C 等信号(cmd/argocd/commands/app.go#L385);headless.NewClientOrDie创建 Argo CD API 客户端,NewApplicationClientOrDieWithContext建立 ApplicationService 的 gRPC 连接(cmd/argocd/commands/app.go#L392-L394);- 解析限定名得到
appName/appNs,构造application.ApplicationQuery{Name, Refresh, AppNamespace}调用appIf.Get(cmd/argocd/commands/app.go#L412-L417)——这与 pkg/apiclient/application 中定义的 ApplicationService gRPC 接口对应; - 若需输出树视图,再调用
appIf.ResourceTree获取资源树(cmd/argocd/commands/app.go#L283); - 若需渲染 SyncWindow,会额外查询 Project 详情(
projIf.Get)并调用proj.Spec.SyncWindows.Matches(app)计算当前应用命中的同步窗口(cmd/argocd/commands/app.go#L468-L473); - 最后按
--output选择渲染路径输出。
关联命令
argocd app get通常与以下命令配合使用:应用管理入口 argocd app,列举全部应用的argocd app list,对比实际与期望状态的argocd app diff,以及触发同步的argocd app sync。它们共同构成 Argo CD 日常巡检与变更的完整闭环。
【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考