Image reflector and automation in FluxCD

Jeff Yen
10 min readAug 18, 2024

--

123

Image reflector and automation controllers

image-reflector-controllerimage-automation-controller 共同協作,當有新的容器映像可用時,會更新 Git 存儲庫。

  • image-reflector-controller 會掃描映像存儲庫,並將映像元數據反映到 Kubernetes 資源中。
  • image-automation-controller 會根據最新掃描到的映像更新 YAML 文件,並將變更提交到指定的 Git 存儲庫。

Image Policies

ImagePolicies API 定義了從 ImageRepositories 選擇“最新”映像的規則。

SemVer

SemVer 政策將所有標籤解釋為 SemVer 版本,並選擇符合給定 SemVer 約束條件的最高版本。該約束條件設置在 .spec.policy.semver.range 字段中。

---
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata:
name: podinfo
spec:
imageRepositoryRef:
name: podinfo
policy:
semver:
range: '>=1.0.0'

Alphabetical

字母順序政策(Alphabetical policy)會在所有標籤按字母順序排序後選擇最後一個標籤(無論是升序還是降序)。排序順序設置在 .spec.policy.alphabetical.order 字段中。該值可以是 asc(升序)或 desc(降序)。預設值為 asc

---
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata:
name: podinfo
spec:
imageRepositoryRef:
name: podinfo
policy:
alphabetical:
order: asc

Numerical

數值政策(Numerical policy)會在所有標籤按數值順序排序後選擇最後一個標籤(無論是升序還是降序)。排序順序設置在 .spec.policy.numerical.order 字段中。該值可以是 asc(升序)或 desc(降序)。預設值為 asc

---
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata:
name: podinfo
spec:
imageRepositoryRef:
name: podinfo
policy:
numerical:
order: asc

Filter Tags

.spec.filterTags.extract 是一個可選字段,用於從匹配的標籤中提取一個值,並將其提供給政策規則,而不是使用原始標籤。如果未指定,則會使用與模式匹配的標籤本身。

---
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata:
name: podinfo
spec:
imageRepositoryRef:
name: podinfo
filterTags:
pattern: '.*-rc.*'
policy:
semver:
range: '^1.x-0'

選擇最新發行版本(標記為 RELEASE.<RFC3339-TIMESTAMP>)的示例(字母順序):

---
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata:
name: minio
spec:
imageRepositoryRef:
name: minio
filterTags:
pattern: '^RELEASE\.(?P<timestamp>.*)Z$'
extract: '$timestamp'
policy:
alphabetical:
order: asc

Image Update Automations

ImageUpdateAutomation API 定義了一個自動化過程,該過程會基於同一命名空間中的 ImagePolicy 對象來更新 Git 存儲庫。

更新的過程是通過在每個 YAML 文件中標記需要更新的字段來進行的。對於每個被標記的字段,自動化過程會檢查所命名的映像政策,如果有新的映像被該政策選中,則會更新該字段的值。標記格式可參考映像自動化指南中的說明。

---
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: podinfo
namespace: default
spec:
interval: 5m0s
url: https://github.com/stefanprodan/podinfo
ref:
branch: master
---
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageRepository
metadata:
name: podinfo
namespace: default
spec:
image: ghcr.io/stefanprodan/podinfo
interval: 5h
---
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata:
name: podinfo-policy
namespace: default
spec:
imageRepositoryRef:
name: podinfo
policy:
semver:
range: 5.0.x
---
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageUpdateAutomation
metadata:
name: podinfo-update
namespace: default
spec:
interval: 30m
sourceRef:
kind: GitRepository
name: podinfo
git:
commit:
author:
email: fluxcdbot@users.noreply.github.com
name: fluxcdbot
push:
branch: main
update:
path: ./

在上述範例中:

  • GitRepository 名為 podinfo:由 GitRepository.metadata.name 字段指示。假設位於 https://github.com/fluxcd/example 的 Git 存儲庫包含帶有映像政策標記的 YAML 文件,如映像自動化指南中所描述,以便進行更新。
  • ImageRepository 名為 podinfo:由 ImageRepository.metadata.name 字段指示。這個資源會掃描一個映像存儲庫中的所有標籤。
  • ImagePolicy 名為 podinfo-policy:由 ImagePolicy.metadata.name 字段指示。
  • ImageUpdateAutomation 名為 podinfo-update:由 ImageUpdateAutomation.metadata.name 字段指示。
  • ImagePolicy 參考 podinfo ImageRepository:用於查詢與映像相關的所有標籤,這一點由 ImagePolicy.spec.imageRepositoryRef 指示。這些標籤隨後會根據政策規則進行評估,以選擇帶有最新標籤的映像,這一點由 ImagePolicy.spec.policy 指示。
  • ImageUpdateAutomation 參考 podinfo GitRepository:該存儲庫作為需要保持最新的來源,由 ImageUpdateAutomation.spec.sourceRef 指示。
  • image-automation-controller 列出 ImageUpdateAutomation 所在命名空間中的所有 ImagePolicies。然後檢出 Git 存儲庫的主分支,這一點由 GitRepository.spec.ref.branch 配置。接著,控制器會從 Git 存儲庫的根目錄中依次檢查 YAML 清單,這一點由 ImageUpdateAutomation.spec.update.path 配置,並基於映像政策中的最新映像進行更新。更新後的更改將以 Git 提交的方式保存,提交作者由 ImageUpdateAutomation.spec.git.commit.author 定義。提交隨後被推送到遠程 Git 存儲庫的主分支,這一點由 ImageUpdateAutomation.spec.git.push.branch 指示。
  • commit hash 記錄在 ImageUpdateAutomation.status.lastPushCommit 字段中,而推送時間記錄在 .status.lastPushTime 字段中。

Flux optional components

因為這裡會使用fluxCD很多客制的CRDs,flux bootstrap 命令會在 flux-system 命名空間中部署一系列 Kubernetes 控制器,並附帶它們的 CRDs(自定義資源定義)、RBAC(角色基於訪問控制)和網路策略。
默認情況下,flux bootstrapflux install 命令都不包含任何額外的組件。

flux bootstrap git \
--components-extra image-reflector-controller,image-automation-controller

上面只是範例,要依照不同的git變更

flux bootstrap github \
--token-auth \
--owner=jeff51419 \
--repository=fleet-infra \
--branch=main \
--path=clusters/my-cluster \
--components-extra image-reflector-controller,image-automation-controller \
--personal

在套用之前寫好的範本

kubectl apply -f imageupdateautomation.yaml

kubectl get imageupdateautomation

kubectl describe imageupdateautomation podinfo-update

--

--

Jeff Yen
Jeff Yen

No responses yet