在 Flux 中通过 Image Update Automation 更新镜像版本

解读

国内云原生落地节奏快,“GitOps + 容器镜像” 已成为主流交付范式。面试官抛出此题,想验证候选人是否真正在生产环境用 Flux 完成过**“从代码合并到镜像上线”**的闭环,而不仅停留在 flux bootstrap 阶段。重点考察:

  1. 是否理解 Flux 的**“Image Update Automation”** 与 “Kustomization/HelmRelease” 的协作关系;
  2. 能否给出可落地的国内镜像仓库(阿里云 ACR、腾讯云 TCR、Harbor)对接方案;
  3. 是否掌握镜像标签策略(semver、regex、sha256)与回滚机制;
  4. 多环境多集群场景下如何避免“版本漂移”有无可复用的经验。

知识点

  1. ImageRepository CR:按指定频率扫描外部镜像仓库,生成**“可更新镜像列表”**;
  2. ImagePolicy CR:基于 semver 或 regex 规则过滤出**“目标版本”**,并写入 .status.latestImage
  3. ImageUpdateAutomation CR:监听 ImagePolicy 变化,自动回写 Git 仓库中的 YAML(Kustomization 的 images: 字段或 HelmRelease 的 values.yaml),并提交 commit;
  4. Git 写回权限:需为 Flux 的 SSH 私钥配置写权限,国内常用 Gitee 企业版自建 GitLab
  5. 镜像标签最佳实践:生产环境强制使用 semver 三段式(v1.2.3),禁止 latest
  6. 网络加速:为 ImageRepository 配置 ACR 个人版实例 + VPC 内网域名,避免 Docker Hub 拉取超时;
  7. 安全加固:ImagePolicy 可搭配 Cosign 验签,仅升级已签名的镜像;
  8. 灰度策略:通过 Flagger 与 ImageUpdateAutomation 联动,实现金丝雀发布
  9. 灾难回滚:Git 历史即回滚点,git revert 即可秒级回退镜像版本;
  10. 多集群场景:每个集群独立 ImagePolicy,“版本锁” 由 Git 分支隔离,防止测试版本误入生产。

答案

  1. 前提条件

    • 集群已安装 Flux v2.0 以上image-reflector-controller、image-automation-controller
    • Git 仓库 clusters/production 目录下存在 Kustomization 文件,已指定 images: 字段;
    • 镜像仓库使用 阿里云 ACR 企业版,并开启 公网域名 registry.cn-hangzhou.aliyuncs.com
  2. 创建 ImageRepository

    apiVersion: image.toolkit.fluxcd.io/v1beta2
    kind: ImageRepository
    metadata:
      name: app-demo
      namespace: flux-system
    spec:
      image: registry.cn-hangzhou.aliyuncs.com/team/app-demo
      interval: 1m
      secretRef:
        name: acr-secret  # docker-registry 类型,存放 ACR 登录凭证
    
  3. 创建 ImagePolicy

    apiVersion: image.toolkit.fluxcd.io/v1beta2
    kind: ImagePolicy
    metadata:
      name: app-demo-policy
      namespace: flux-system
    spec:
      imageRepositoryRef:
        name: app-demo
      policy:
        semver:
          range: 1.2.x      # 仅允许补丁升级
    
  4. 创建 ImageUpdateAutomation

    apiVersion: image.toolkit.fluxcd.io/v1beta1
    kind: ImageUpdateAutomation
    metadata:
      name: app-demo-auto
      namespace: flux-system
    spec:
      interval: 2m
      sourceRef:
        kind: GitRepository
        name: flux-system
      git:
        checkout:
          ref:
            branch: main
        commit:
          author:
            name: fluxcdbot
            email: fluxcdbot@example.com
          messageTemplate: |
            ci(automated): update image {{ .Image.Repository }}:{{ .Image.Tag }}
      update:
        strategy: Setters
        path: clusters/production
    
  5. 在 Kustomization 中埋入 setter 标记

    apiVersion: kustomize.config.k8s.io/v1beta1
    kind: Kustomization
    images:
      - name: app-demo
        newName: registry.cn-hangzhou.aliyuncs.com/team/app-demo # {"$imagepolicy": "flux-system:app-demo-policy:name"}
        newTag: v1.2.0                                           # {"$imagepolicy": "flux-system:app-demo-policy:tag"}
    
  6. 验证

    • 向 ACR 推送 v1.2.1 镜像;
    • 1~2 分钟后,Git 仓库出现 automated commit,将 newTag 改为 v1.2.1
    • Kustomization 控制器检测到 Git 变化,重新渲染并应用;
    • Pod 滚动升级,全程无需人工干预。
  7. 回滚

    • v1.2.1 异常,直接 git revert 该自动化 commit;
    • Flux 会立即将镜像版本回退到 v1.2.0,实现秒级回滚

拓展思考

  1. 多环境版本隔离:为开发、预发、生产分别创建 Git 分支 devstagingmain,ImageUpdateAutomation 只向对应分支写回,避免**“交叉污染”**;
  2. 镜像缓存与配额:ACR 企业版按拉取次数计费,可在 VPC 内搭建 Harbor 缓存代理,Flux ImageRepository 指向 Harbor,降低公网费用
  3. 策略冲突解决:当 HelmReleaseKustomization 同时引用同一 ImagePolicy 时,需用 different pathdifferent setter key 防止并发写冲突;
  4. 合规审计:在 GitLab CI 中增加 “镜像 SBOM 扫描” 步骤,仅当扫描通过后才推送镜像,ImagePolicy 搭配 staged rollout,实现安全左移
  5. 灾备场景:在 异地容灾集群中部署只读 ImageRepository,主集群 Git 仓库故障时,手动修改灾备集群的 ImagePolicy 范围,快速接管流量,保障业务连续性