ArgoCD不部署Go应用,只同步Git中已提交的YAML清单;Go服务不参与其工作流,上线版本由manifests/prod/目录内容决定;Application CRD必须精确指向含合法清单的已提交子目录,如"manifests/prod"。

ArgoCD 不会“部署”你的 Go 应用,它只同步你提交到 Git 的 YAML 清单;Go 服务本身不参与 ArgoCD 工作流,真正决定是否上线、上哪个版本的,是你往 manifests/prod/ 目录里提交了什么内容。
Application CRD 必须精确指向已提交的 manifests 目录
ArgoCD 找不到你的 Go 服务,90% 是因为 spec.source.path 填错了。它不扫描整个仓库,也不读 go.mod 或 main.go,只认一个真实存在的、已 git push 过的子目录路径。
- 错误示例:
spec.source.path: "cmd/api"→ 该路径下只有 Go 源码,没有deployment.yaml - 正确结构:确保
manifests/prod/deployment.yaml和manifests/prod/service.yaml已提交,并在 Application 中写spec.source.path: "manifests/prod" - 验证方式:
argocd app get myapp看status.sync.status;若为Pending,先跑argocd repo list确认仓库连通性,再检查路径是否存在
镜像更新必须写回 Git,不能只推镜像
CI 构建完 my-registry/order:v2.1.0-abc123 后,ArgoCD 不会自动感知 registry 变更——它只看 Git 提交。不改清单,就永远同步旧镜像。
- 手动更新:用
sed -i 's/image: .*/image: my-registry\/order:v2.1.0-abc123/' manifests/prod/kustomization.yaml,再git commit -m "deploy: v2.1.0-abc123" - 自动更新:需额外部署
argocd-image-updater,它轮询 registry 并 patchkustomization.yaml中的images:字段 - 禁止用
latest标签:必须绑定语义化版本或 Git commit SHA,否则无法审计和回滚
probe 配置不当会导致同步反复失败
ArgoCD 同步成功后 Pod 却卡在 CrashLoopBackOff,往往不是部署问题,而是 readinessProbe 太激进,服务还没启动完就被判定失败,触发重建循环。
立即学习“go语言免费学习笔记(深入)”;
- 必须设
initialDelaySeconds: 10,给 Go HTTP server 足够时间 bind port 和加载依赖 - probe path 用最简
/ready,由http.HandleFunc("/ready", ...)直接返回 200,不走中间件、不查 DB - 避免
periodSeconds: 1:低配环境易引发 CPU 尖刺,间接导致Failed sync attempt无明确错误日志
Git 仓库权限与 Secret 配置容易被忽略
ArgoCD 报 Unable to get app details: failed to load manifests,有时根本不是路径问题,而是仓库连不上——尤其在 EKS 上,常因 IRSA 权限缺失导致 AccessDenied,但错误只出现在 Application 同步日志里,Helm 安装过程完全正常。
- 必须为
argocdnamespace 创建带 IAM Role 的 ServiceAccount,例如argocd-server,并显式在 Helm 安装时指定:--set server.serviceAccount.name=argocd-server - 仓库配置应通过 Kubernetes Secret 声明式管理(而非
argocd repo add),标签必须是argocd.argoproj.io/secret-type: repository - Secret 的
data.url字段必须是完整 HTTPS 地址(如https://github.com/org/infra-manifests.git),不是代码仓库地址,也不是相对路径
最常被跳过的一步是:生成完 YAML 后没做 kubectl apply --dry-run=client -f ./manifests/ -o yaml > /dev/null 校验。语法错一个缩进,ArgoCD 就卡在 Unknown 状态,且不会告诉你具体哪行出问题。


















