CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
Helm 与 GitOps 入门/课时/Argo CD 入门
RawBlame
课时目录12 节

Helm 与 GitOps 入门

  1. 01为什么需要 Helm
  2. 02安装 Helm 与仓库
  3. 03Chart 目录结构
  4. 04模板与 values
  5. 05install upgrade rollback
  6. 06依赖与子 Chart
  7. 07GitOps 是什么
  8. 08仓库布局与清单
  9. 09Argo CD 入门
  10. 10Flux 概览
  11. 11发布策略
  12. 12综合练习

Argo CD 入门

Application CR、同步策略、UI 与 CLI。

35 分钟

Argo CD 入门

这一课你将能做到

  1. 在学习集群(minikube/kind)安装 Argo CD,用 port-forward 打开 UI,取出初始 admin 密码并登录
  2. 编写 Application CR 指向仓库中的 backend Chart 与环境 values,读懂 Synced/OutOfSync 与 Healthy/Degraded 两组状态的区别
  3. 演示「改 values 中 image.tag → 自动同步」闭环,并(可选)用 selfHeal 纠正一次手改漂移

为什么要学

Argo CD 是使用最广的 GitOps 控制器之一:用 Application(批量场景用 ApplicationSet)声明「从哪个仓库、哪条分支、哪个路径、用什么 Helm 参数、同步到哪个集群哪个命名空间」。它把 gitops-intro 的抽象原则变成具体产品:持续对比 desired(Git 渲染结果)与 live(集群实况),UI 可视化 diff,同步动作等价于受控的 helm upgrade。本课在学习集群走通最小闭环——安装、声明、同步、纠漂移;生产的 SSO、多集群、RBAC 项目化放到真正落地时再加深。面试高频词「Argo CD 同步机制」在本课给出可背版本。

先建立图像

Git repo
  deploy/charts/backend                ← Chart
  deploy/env/dev/backend-values.yaml   ← 环境差异
        │
        ▼  Application.spec.source(repoURL/path/targetRevision/valueFiles)
Argo CD(argocd 命名空间)
  ① refresh:拉 Git → helm 渲染出 desired
  ② compare:desired vs live,产出 diff → Synced / OutOfSync
  ③ sync:把 desired 落到集群(等价 kubectl apply / helm 升级)
        │
        ▼
destination:coderoadmap-dev 命名空间里的 Deployment/Service
状态词人话常见原因
Syncedlive 与 desired 一致正常
OutOfSync有差异待同步 / 有人手改集群 / Git 变了未刷新
Healthy资源就绪(探针通过等)正常
Degraded/Progressing健康有问题探针失败、镜像拉不下来
两组状态独立:Synced + Degraded 完全可能同时出现
  → 同步层面没问题,运行层面挂了:去看 Pod/事件,别盯着 UI 干瞪眼

跟着做

步骤 1:安装到学习集群

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

# 等待全部 Running
kubectl get pods -n argocd -w

应看到 argocd-server、argocd-application-controller、argocd-repo-server 等组件。这是学习清单;生产请用官方 HA 清单与安全加固指南。

步骤 2:取密码并打开 UI

# 初始 admin 密码(就是 argocd-server Pod 名,首次登录后建议改掉)
kubectl -n argocd get secret argocd-initial-admin-secret \
  -o jsonpath="{.data.password}" | base64 -d; echo

# 端口转发
kubectl -n argocd port-forward svc/argocd-server 8080:443

浏览器打开 https://localhost:8080(学习环境接受自签证书警告),用户 admin + 上一步密码。也可安装 argocd CLI 后 argocd login localhost:8080 走命令行。

步骤 3:确保 Argo 能读到你的 Git

  • 公开 HTTPS 仓库:Application 里直接填 repoURL 即可
  • 私有仓库:UI Settings → Repositories 添加凭据(PAT/SSH),或建 Secret 声明
  • 先在本机 git clone 通了再填,能排除一半路径类故障

步骤 4:编写 Application(核心产物)

记住:valueFiles 相对于 spec.source.path(Chart 目录),不是仓库根:

# deploy/argocd/applications/backend-dev.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: backend-dev
  namespace: argocd            # Application 本身放在 argocd ns
spec:
  project: default
  source:
    repoURL: https://github.com/your-org/java-nav.git   # 换成你的仓库
    targetRevision: main
    path: deploy/charts/backend                         # Chart 目录
    helm:
      valueFiles:
        - ../../env/dev/backend-values.yaml             # 相对 path 上溯
  destination:
    server: https://kubernetes.default.svc              # 同集群
    namespace: coderoadmap-dev
  syncPolicy:
    automated:
      prune: true        # Git 里删了资源,集群里也删(谨慎)
      selfHeal: true     # 有人手改集群,自动拉回 Git 期望
    syncOptions:
      - CreateNamespace=true
kubectl apply -f deploy/argocd/applications/backend-dev.yaml

UI 应出现 backend-dev 应用卡片;automated 策略下会自动完成首次同步,否则手动点 Sync。

步骤 5:改 tag 触发同步闭环

# 编辑 deploy/env/dev/backend-values.yaml 的 image.tag,提交推送
git add deploy/env/dev/backend-values.yaml
git commit -m "dev: bump backend image to 1.0.1"
git push

回到 UI 刷新(或等 3 分钟默认轮询/webhook 秒触发):应看到短暂 OutOfSync → Syncing → Synced;同时:

kubectl get pods -n coderoadmap-dev -w    # 观察滚动更新

这就是「部署 = 合并一个 PR」的完整体验,全程没有任何人在终端敲过 upgrade。

步骤 6:手改漂移,理解 selfHeal(可选)

kubectl -n coderoadmap-dev scale deploy/backend --replicas=5

几十秒内副本应被拉回 values 里的 replicaCount,UI 里那次 OutOfSync 也自动消失。笔记写死:「救火手改会被拉回——正确做法永远是改 Git。」

讲清楚要点

  1. 因为 Application 声明了 source 与 destination,所以每个环境的同步目标清晰可审——多环境 = 多 Application(backend-dev/backend-prod),批量同构用 ApplicationSet。
  2. 因为 desired 来自 Git 渲染,所以「改集群不改 Git」只会制造 OutOfSync 或 selfHeal 对抗——习惯必须迁移到改 values 走 PR。
  3. 因为 refresh 与 sync 是两个阶段,所以看到 OutOfSync 先分辨「Git 变了没同步」还是「集群被人动了」——前者点 Sync,后者查漂移来源。
  4. 因为 automated + prune 会删除 Git 中已移除的资源,所以删模板前要确认影响面——误删清单等于误删集群对象;风险高的环境可先关 prune。
  5. 因为 admin 初始密码就是 Secret 里的 Pod 名,所以装完立即改密并不要把 UI 暴露公网——port-forward 仅限本机调试。
  6. 因为同步状态 ≠ 健康状态,所以 Synced 仍可能 Degraded——健康度来自内置探针检查(如 Deployment available),排障仍要 kubectl describe/logs。

你可能会懵的地方

  • Application 为什么装在 argocd 命名空间? Argo 默认监听 argocd ns 里的 Application CR(可配置多命名空间);Application 描述「同步什么到哪」,它本身不是业务资源。业务资源落在 destination.namespace。

  • Argo CD 和 helm CLI 的 Release 是什么关系? 用 Helm 渲染时,Argo 会在集群内以类 helm 方式安装升级,但它的管理单元是 Application 而非 helm Release;helm list 能否看到取决于版本与配置。日常以 Argo 的应用历史为准,不要两套并管。

  • 必须开 automated 吗? 不必须。常见分级:dev 全自动(automated+selfHeal),prod 手动 Sync(PR 合并后由人点或由流水线触发 Sync)。学习阶段先手动理解每一步,再开自动化。

  • 多集群怎么接? destination.server 换成已注册的外部集群 API 地址(UI/CLI 注册集群);本课只做同集群 kubernetes.default.svc。

  • 三个核心组件各干什么? argocd-server 提供 API/UI;argocd-repo-server 拉仓库并渲染(helm/kustomize 在这跑);argocd-application-controller 执行对比与同步。排障时日志要找对组件。

错法对照

错法问题正解
valueFiles 写成相对仓库根按相对 Chart path 解析时找不到文件../../env/... 或调整目录布局
生产 UI 直接暴露公网 + 默认密码控制面被接管改密、SSO/OIDC、入口鉴权
只看 Synced 不看 Healthy同步成功但服务挂着两个状态都看,再下钻 Pod/事件
关掉分支保护直接推 prod values绕过评审改生产CODEOWNERS + 保护分支
Argo 与 CI helm upgrade 同管一个应用两套真相打架单一真相源,二选一
开 prune 却随意删模板Git 删 = 集群删删除走评审,确认影响面

卡点急救

  1. 现象:Application 一直 OutOfSync 且报 values file not found——valueFiles 相对路径错;检查它相对 spec.source.path 的层级(../../env/dev/backend-values.yaml),或把 env values 挪进 Chart 同级可解析位置;看 UI 的 sync 错误详情定位真实路径。
  2. 现象:Pods 一直 Progressing、Healthy 显示 Degraded——应用层问题不是同步问题:kubectl -n coderoadmap-dev describe pod、logs 看探针路径(actuator)与镜像 tag;修的是 values 或镜像本身,然后 Git 提交。
  3. 现象:改了 Git 但 UI 不刷新——默认轮询有间隔(3 分钟);等、点 Refresh、或给仓库配 webhook 立即触发;确认 targetRevision 分支与你 push 的分支一致。

面试常问

  • Argo CD 的同步机制是怎样的? 三个阶段:refresh(定时/webhook 触发,拉取 Git 并用 helm/kustomize 渲染出 desired manifest)→ compare(desired 与集群 live 状态对比,给出 Synced/OutOfSync 与 diff 详情)→ sync(按需手动或自动执行,把 desired 应用到集群,可带 prune/selfHeal/同步选项)。同步状态与健康状态分离,健康度由探针类检查决定。

  • Synced 和 Healthy 有什么区别? Synced 描述「配置一致性」:集群资源与 Git 期望是否一致;Healthy 描述「运行状态」:资源本身是否就绪(Deployment 的 available、Pod Ready 等)。Synced+Degraded 表示配置已到位但运行异常,OutOfSync+Healthy 表示运行正常但配置有差异(典型:有人手改了集群)。二者组合定位问题维度不同。

  • automated sync 里的 prune 和 selfHeal 分别解决什么? prune 让「Git 中删除的资源」在集群中同步删除,防止僵尸资源;selfHeal 让「集群侧手改」被自动拉回 Git 期望,保证 Git 是唯一事实源。前者管「Git 少了」,后者管「集群多了/变了」——两者合起来才是完整的持续调和。

自测三问

  1. Application 的 source.path、source.helm.valueFiles、destination.namespace 各指什么?valueFiles 相对谁解析?
  2. OutOfSync 与 Degraded 可能同时出现吗?各说明什么问题、分别怎么查?
  3. selfHeal 开启后,「临时 kubectl scale 救火」为什么不可持续?正确流程是什么?

小结一句话

Argo CD 用 Application 把 Git 中的 Helm Chart/values 持续同步到集群:refresh→compare→sync 三步是可背的同步机制,Synced/Healthy 两组状态、selfHeal/prune 两个开关撑起「部署 = 合并 PR」的体验。

延伸

  • Argo CD — Getting Started
  • Argo CD — Application Specification
  • 下一课:Flux 概览——多 CRD 组合式 GitOps,与 Argo CD 的选型对比。
加载本节练习…
← 上一课仓库布局与清单下一课 →Flux 概览