使用適用於 AKS 和已啟用 Azure Arc 的 Kubernetes 的 GitOps (Flux v2) 進行應用程式部署

Azure 使用 GitOps 提供自動化應用程式部署功能,可與 Azure Kubernetes Service (AKS) 和已啟用 Azure Arc 的 Kubernetes 叢集搭配運作。 採用 GitOps 將應用程式部署至 Kubernetes 叢集所提供的主要優點包括:

  • 持續查看叢集上執行的應用程式狀態。
  • 將應用程式開發小組與基礎結構小組之間的考慮區隔開。 應用程式小組不需要具備 Kubernetes 部署的經驗。 平臺工程小組通常會為應用程式小組建立自助模型,讓他們能夠更有信心地執行部署。
  • 在當機或相應放大時,能夠重新建立具有相同所需狀態的叢集。

使用 GitOps 時,請在 Git 存放庫的檔案中宣告 Kubernetes 叢集的所需狀態。 Git 存放庫可能包含下列檔案:

由於這些檔案會儲存在 Git 存放庫中,因此會建立版本版本,並輕鬆地追蹤版本之間的變更。 Kubernetes 控制器會在叢集中執行,並持續協調叢集狀態與 Git 存放庫中所宣告的所需狀態。 這些運算符會從 Git 存放庫提取檔案,並將所需的狀態套用至叢集。 運算子也會持續確保叢集維持預期狀態。

已啟用 Azure Arc 的 Kubernetes 或 Azure Kubernetes Service 上的 GitOps 會使用 Flux,這是熱門的開放原始碼工具集。 Flux 支援一般檔案來源(Git 和 Helm 存放庫、貯體、Azure Blob 儲存體)和範本類型(YAML、Helm 和 Kustomize)。 Flux 也支援 多租使用者 和部署相依性管理,以及其他功能。

Flux 會直接部署在叢集上,而且每個叢集的控制平面會以邏輯方式分隔。 這可讓其調整為數百個和數千個叢集。 Flux 可啟用純提取式 GitOps 應用程式部署。 來源存放庫或任何其他叢集不需要存取叢集。

Flux 叢集擴充功能

GitOps 會在已啟用 Azure Arc 的 Kubernetes 或 AKS 叢集中啟用,作為 Microsoft.KubernetesConfiguration/extensions/microsoft.flux叢集擴充 資源。 擴充 microsoft.flux 功能必須先安裝在叢集中,才能建立一或多個 fluxConfigurations 擴充功能。 當您在叢集中建立第一個 Microsoft.KubernetesConfiguration/fluxConfigurations 時,會自動安裝擴充功能,或者您可以使用入口網站、Azure CLI(az k8s-extension create --extensionType=microsoft.flux)、ARM 範本或 REST API 手動安裝。

Controllers

根據預設,擴充 microsoft.flux 功能會 安裝 Flux 控制器 (Source、Kustomize、Helm、Notification)和 FluxConfig 自定義資源定義 (CRD), fluxconfig-agent以及 fluxconfig-controller。 您也可以選擇安裝 Flux image-automationimage-reflector 控制器,以提供更新和擷取 Docker 映像的功能。

  • Flux 來源控制器:監看 source.toolkit.fluxcd.io 自定義資源。 處理 Git 存放庫、Helm 存放庫、貯體和 Azure Blob 記憶體之間的同步處理。 使用私人 Git、Helm 存放庫和 Azure Blob 記憶體帳戶的來源來處理授權。 透過 tar 封存盤案呈現來源的最新變更。

  • Flux Kustomize 控制器:監看 kustomization.toolkit.fluxcd.io 自定義資源。 將 Kustomize 或原始 YAML 檔案從來源套用至叢集。

  • Flux Helm 控制器:監看 helm.toolkit.fluxcd.io 自定義資源。 從來源控制器呈現的 Helm 存放庫來源擷取相關聯的圖表。 建立自訂資源, HelmChart 並將具有指定版本、名稱和客戶定義值的 套用 HelmRelease 至叢集。

  • Flux 通知控制器:監看 notification.toolkit.fluxcd.io 自定義資源。 接收來自所有 Flux 控制器的通知。 將通知推送至用戶定義的 Webhook 端點。

  • Flux 自訂資源定義:

    • kustomizations.kustomize.toolkit.fluxcd.io
    • imagepolicies.image.toolkit.fluxcd.io
    • imagerepositories.image.toolkit.fluxcd.io
    • imageupdateautomations.image.toolkit.fluxcd.io
    • alerts.notification.toolkit.fluxcd.io
    • providers.notification.toolkit.fluxcd.io
    • receivers.notification.toolkit.fluxcd.io
    • buckets.source.toolkit.fluxcd.io
    • gitrepositories.source.toolkit.fluxcd.io
    • helmcharts.source.toolkit.fluxcd.io
    • helmrepositories.source.toolkit.fluxcd.io
    • helmreleases.helm.toolkit.fluxcd.io
    • fluxconfigs.clusterconfig.azure.com
  • FluxConfig CRD:定義 fluxconfigs.clusterconfig.azure.com Kubernetes 物件的自定義資源自定義資源定義 FluxConfig

  • fluxconfig-agent:負責監看 Azure 是否有新的或更新 fluxConfigurations 的資源,以及啟動叢集中相關聯的 Flux 組態。 也負責將叢集中的 Flux 狀態變更推送回 Azure,以供每個 fluxConfigurations 資源使用。

  • fluxconfig-controller:監看 fluxconfigs.clusterconfig.azure.com 自定義資源,並使用叢集中 GitOps 機器的新或更新組態來響應變更。

注意

擴充 microsoft.flux 功能會安裝在 命名空間中 flux-system ,而且具有 整個叢集的範圍。 您無法在命名空間範圍安裝此延伸模組。

Flux 組態

此圖顯示在已啟用 Azure Arc 的 Kubernetes 或 AKS 叢集中安裝 Flux 設定。

您可以建立 Flux 設定資源 (Microsoft.KubernetesConfiguration/fluxConfigurations) 以從 Git 存放庫、貯體來源或 Azure Blob 記憶體啟用叢集的 GitOps 管理。 當您建立 fluxConfigurations 資源時,您提供給 參數的值,例如目標 Git 存放庫,會用來建立及設定 Kubernetes 物件,以啟用該叢集中的 GitOps 程式。 為了確保數據安全性,資源 fluxConfigurations 數據會由叢集組態服務以待用加密方式儲存在 Azure Cosmos DB 資料庫中。

fluxconfig-agentfluxconfig-controller 代理程式會隨擴充功能一起microsoft.flux安裝,以管理 GitOps 組態程式。

fluxconfig-agent 負責下列工作:

  • 輪詢 Kubernetes 設定數據平面服務是否有新的或更新 fluxConfigurations 的資源。
  • 使用組態資訊,在叢集中建立或更新 FluxConfig 自定義資源。
  • FluxConfig 看自定義資源,並將狀態變更推送回相關聯的 Azure fluxConfiguration 資源。

fluxconfig-controller 負責下列工作:

  • 監看受控 fluxConfigurations所建立之 Flux 自定義資源的狀態更新。
  • 建立存在於存留期的 fluxConfigurations私用/公鑰組。 如果 URL 是以 SSH 為基礎,且使用者未在建立組態期間提供自己的私鑰,則此金鑰會用於驗證。
  • 根據使用者提供的私鑰/HTTP basic-auth/known-hosts/no-auth 數據建立自定義驗證密碼。
  • 設定角色型訪問控制(已布建的服務帳戶、建立/指派的角色系結、建立/指派的角色)。
  • GitRepository從自訂資源中的FluxConfig資訊建立或Bucket自訂資源和Kustomization自定義資源。

fluxConfigurations Azure 中的每個資源都會與一個 Flux GitRepositoryBucket自定義資源以及 Kubernetes 叢集中的一或多個Kustomization自定義資源相關聯。 當您建立 fluxConfigurations 資源時,您會針對每個 Kustomization指定來源的 URL(Git 存放庫、貯體或 Azure Blob 記憶體)和來源中的同步目標。 您可以設定自訂資源之間的 Kustomization 相依性,以控制部署排序。 您也可以針對不同的應用程式和應用程式小組,在同一個叢集上建立多個命名空間範圍 fluxConfigurations 的資源。

注意

監視 fluxconfig-agent Azure 中新的或更新 fluxConfiguration 的資源。 代理程式需要連線至 Azure,才能將 所需的狀態 fluxConfiguration 套用至叢集。 如果代理程式無法連線到 Azure,叢集中的變更會等到代理程式可以連線為止。 如果叢集與 Azure 中斷連線超過 48 小時,則對叢集的要求將會逾時,而且必須在 Azure 中重新套用變更。

機密客戶輸入,例如私鑰和令牌/密碼,會儲存在 Kubernetes 組態服務中不到 48 小時。 如果您在 Azure 中更新上述任何值,請確定您的叢集會在 48 小時內與 Azure 連線。

您可以在 Azure 入口網站 中監視 Flux 設定狀態和合規性,或使用儀錶板來監視狀態、合規性、資源耗用量和對帳活動。 如需詳細資訊,請參閱 監視 GitOps (Flux v2) 狀態和活動

版本支援

支援最新版的 Flux v2 擴充功能 (microsoft.flux) 和兩個舊版 (N-2)。 我們通常建議您使用 最新版本 的擴充功能。 從 microsoft.flux 1.7.0 版開始,支援 ARM64 型叢集。

注意

如果您已使用 Flux v1,建議您 儘快移轉至 Flux v2

支援在 2024 年 1 月 1 日之前建立的 Flux v1 型叢集設定資源,將於 2025 年 5 月 24 日結束。 從 2024 年 1 月 1 日起,您將無法建立新的 Flux v1 型叢集組態資源。

如果您已將私人連結的支援 新增至已啟用 Azure Arc 的 Kubernetes 叢集,則 microsoft.flux 擴充功能會以現用方式運作,並與 Azure 進行通訊。 若要連線到您的 Git 存放庫、Helm 存放庫或任何其他部署 Kubernetes 指令清單所需的端點,您必須在防火牆後方布建這些端點,或在防火牆上列出這些端點,讓 Flux 來源控制器可以順利連線。

資料落地

Azure GitOps 服務 (Azure Kubernetes 組態管理) 會儲存/處理客戶數據。 根據預設,客戶數據會復寫到配對的區域。 對於新加坡、東亞和巴西南部區域,所有客戶數據都會儲存並處理於該區域。

大規模套用 Flux 組態

因為 Azure Resource Manager 會管理您的設定,因此您可以在訂用帳戶或資源群組的範圍內,使用 Azure 原則,自動在所有 Azure Kubernetes Service 和已啟用 Azure Arc 的 Kubernetes 資源上建立相同的設定。 此大規模強制執行可確保特定組態會一致地套用到整個叢集群組。

如需詳細資訊,請參閱使用 Flux v2 組態和 Azure 原則 一致大規模部署應用程式。

參數

若要查看 Azure 中 Flux v2 支援的所有參數,請參閱 az k8s-configuration。 Azure 實作目前不支援 Flux 支援的每個參數。

如需可用參數及其使用方式的相關信息,請參閱 GitOps (Flux v2) 支援的參數

多組織用戶管理

Flux v2 支援從 0.26 版開始的多租使用者。 這項功能已整合到 Azure 中的 Flux v2。

注意

針對多租使用者功能,您必須知道您的指令清單是否包含 HelmRelease、Kustomization、ImagePolicy 或其他物件的任何跨命名空間 sourceRef,或使用 小於 1.20.6 的 Kubernetes 版本。 若要準備:

  • 升級至 Kubernetes 1.20.6 版或更新版本。
  • 在您的 Kubernetes 指令清單中,確保所有 sourceRef 對象都位於與 GitOps 組態相同的命名空間內。
    • 如果您需要時間來更新指令清單,您可以退出 宣告多租使用者。 不過,您仍然需要升級 Kubernetes 版本。

更新多租使用者的指令清單

假設您將 部署到 fluxConfiguration 命名空間中 cluster-config 具有叢集範圍的其中一個 Kubernetes 叢集。 您可以設定來源來同步處理 https://github.com/fluxcd/flux2-kustomize-helm-example 存放庫。 這是使用 GitOps 與 Flux v2 教學課程部署應用程式中所使用的相同範例 Git 存放庫。

在 Flux 同步處理存放庫之後,它會部署指令清單 (YAML 檔案) 中所述的資源。 其中兩個指令清單描述 HelmReleaseHelmRepository 物件。

apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
  name: nginx
  namespace: nginx
spec:
  releaseName: nginx-ingress-controller
  chart:
    spec:
      chart: nginx-ingress-controller
      sourceRef:
        kind: HelmRepository
        name: bitnami
        namespace: flux-system
      version: "5.6.14"
  interval: 1h0m0s
  install:
    remediation:
      retries: 3
  # Default values
  # https://github.com/bitnami/charts/blob/master/bitnami/nginx-ingress-controller/values.yaml
  values:
    service:
      type: NodePort
apiVersion: source.toolkit.fluxcd.io/v1beta1
kind: HelmRepository
metadata:
  name: bitnami
  namespace: flux-system
spec:
  interval: 30m
  url: https://charts.bitnami.com/bitnami

根據預設,Flux 擴充功能會藉由模擬flux-applier只部署在 命名空間中的cluster-config服務帳戶來部署 fluxConfigurations 。 使用上述指令清單,當啟用多租使用者時, HelmRelease 將會遭到封鎖。 這是因為 HelmRelease 位於 命名空間中 nginx ,但它參考命名空間中的 flux-system HelmRepository。 此外,Flux helm-controller 無法套用 HelmRelease,因為命名空間中nginx沒有flux-applier服務帳戶。

若要使用多租使用者,正確的方法是將所有 Flux 物件部署到與 fluxConfigurations相同的命名空間。 此方法可避免跨命名空間參考問題,並允許 Flux 控制器取得套用對象的許可權。 因此,針對在命名空間中建立的 cluster-config GitOps 組態,這些範例指令清單會變更,如下所示:

apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
  name: nginx
  namespace: cluster-config 
spec:
  releaseName: nginx-ingress-controller
  targetNamespace: nginx
  chart:
    spec:
      chart: nginx-ingress-controller
      sourceRef:
        kind: HelmRepository
        name: bitnami
        namespace: cluster-config
      version: "5.6.14"
  interval: 1h0m0s
  install:
    remediation:
      retries: 3
  # Default values
  # https://github.com/bitnami/charts/blob/master/bitnami/nginx-ingress-controller/values.yaml
  values:
    service:
      type: NodePort
apiVersion: source.toolkit.fluxcd.io/v1beta1
kind: HelmRepository
metadata:
  name: bitnami
  namespace: cluster-config
spec:
  interval: 30m
  url: https://charts.bitnami.com/bitnami

退出退出多租使用者

microsoft.flux安裝擴充功能時,預設會啟用多租使用者。 如果您需要停用多租使用者,您可以使用 來建立或更新 microsoft.flux 叢集中的 --configuration-settings multiTenancy.enforce=false延伸模組,以退出宣告,如下列範例命令所示:

az k8s-extension create --extension-type microsoft.flux --configuration-settings multiTenancy.enforce=false -c CLUSTER_NAME -g RESOURCE_GROUP -n flux -t <managedClusters or connectedClusters>
az k8s-extension update --configuration-settings multiTenancy.enforce=false -c CLUSTER_NAME -g RESOURCE_GROUP -n flux -t <managedClusters or connectedClusters>

從 Flux v1 移轉

如果您仍在使用 Flux v1,建議您儘快移轉至 Flux v2。

若要在使用 Flux v1 的相同叢集中移轉至使用 Flux v2,您必須先從叢集中刪除所有 Flux v1 sourceControlConfigurations 。 由於 Flux v2 具有基本不同的架構,因此如果叢集中有 Flux v1 sourceControlConfigurations 資源,microsoft.flux叢集延伸模組將不會安裝。 拿掉 Flux v1 組態和部署 Flux v2 設定的程式不應超過 30 分鐘。

拿掉 Flux v1 sourceControlConfigurations 不會停止在叢集上執行的任何應用程式。 不過,在移除 Flux v1 設定且 Flux v2 擴充功能尚未完全部署期間:

  • 如果儲存在 Git 存放庫中的應用程式指令清單中有新的變更,則不會在移轉期間提取這些變更,而且部署在叢集上的應用程式版本將會過時。
  • 如果叢集狀態中有非預期的變更,且它偏離來源 Git 存放庫中所指定的預期狀態,叢集將無法自我癒合。

建議您在開發環境中測試移轉案例,再移轉生產環境。

檢視和刪除 Flux v1 設定

使用這些 Azure CLI 命令來尋找並刪除叢集中的現有 sourceControlConfigurations 命令:

az k8s-configuration list --cluster-name <cluster name> --cluster-type <connectedClusters or managedClusters> --resource-group <resource group name>
az k8s-configuration delete --name <configuration name> --cluster-name <cluster name> --cluster-type <connectedClusters or managedClusters> --resource-group <resource group name>

您也可以在 Azure 入口網站 中找到和刪除叢集的現有 GitOps 組態。 若要這樣做,請流覽至建立組態的叢集,然後在左窗格中選取 [GitOps ]。 選取組態,然後選取 [ 刪除]。

部署 Flux v2 組態

使用 Azure 入口網站 或 Azure CLI,將 Flux v2 組態套用至您的叢集。

Flux v1 淘汰資訊

Flux v1 的開放原始碼專案已封存, 功能開發已無限期停止。

Flux v2 已啟動為 Flux 升級的開放原始碼專案。 它具有新的架構,並支援更多 GitOps 使用案例。 Microsoft 於 2022 年 5 月推出使用 Flux v2 的擴充功能版本。 此後,建議客戶在三年內移至 Flux v2,因為使用 Flux v1 的支援計劃於 2025 年 5 月結束。

Flux v2 的 GitOps 擴充功能中引進的重要新功能:

  • Flux v1 是整合型 do-it-all 運算符。 Flux v2 會將功能 分成特製化控制器(來源控制器 、Kustomize 控制器、Helm 控制器和通知控制器)。
  • 支援同步處理多個來源存放庫。
  • 支援 多租使用者,例如以自己的許可權集套用每個來源存放庫。
  • 透過健康情況檢查、事件和警示提供作業見解。
  • 支援 Git 分支、釘選認可和標籤,以及遵循 SemVer 標籤範圍。
  • 每個 GitRepository 資源的認證設定:SSH 私鑰、HTTP/S 使用者名稱/密碼/令牌,以及 OpenPGP 公鑰。

下一步