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

Azure 會使用 GitOps 提供自動化應用程式部署功能,此功能可與 Azure Kubernetes 服務 (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 叢集延伸模組

在已啟用 Azure Arc 的 Kubernetes 或 AKS 叢集中,GitOps 啟用為 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 控制器 (來源、Kustomize、Helm、通知) 以及 FluxConfig 自訂資源定義 (CRD)、fluxconfig-agentfluxconfig-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 自訂資源 (定義 FluxConfig Kubernetes 物件) 的自訂資源定義。

  • fluxConfigurations:負責監看 Azure 是否有新的或更新的 fluxconfig-agent 資源,以及在叢集中啟動相關聯的 Flux 設定。 此外,還負責針對每個 fluxConfigurations 資源,將叢集中的 Flux 狀態變更推送回 Azure。

  • fluxconfig-controller:監看 fluxconfigs.clusterconfig.azure.com 自訂資源,並回應叢集中因為 GitOps 機制新增或更新設定而發生的變更。

注意

microsoft.flux 延伸模組安裝在 flux-system 命名空間中,具有全叢集範圍。 您無法在命名空間範圍安裝此延伸模組。

Flux 設定

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

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

microsoft.flux 延伸模組安裝的 fluxconfig-agentfluxconfig-controller 代理程式管理 GitOps 設定程序。

fluxconfig-agent 負責下列工作:

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

fluxconfig-controller 負責下列工作:

  • 監看受控 fluxConfigurations 所建立 Flux 自訂資源的狀態更新。
  • 建立在 fluxConfigurations 存留期內存在的私人/公開金鑰組。 如果 URL 以 SSH 為基礎,且使用者在建立設定期間未提供自己的私密金鑰,則會使用此金鑰進行驗證。
  • 根據使用者提供的 private-key/http basic-auth/known-hosts/no-auth 資料,建立自訂驗證袐密。
  • 設定角色型存取控制 (佈建的服務帳戶、建立/指派的角色繫結、建立/指派的角色)。
  • 根據 FluxConfig 自訂資源的資訊建立 GitRepositoryBucket 自訂資源和 Kustomization 自訂資源。

Azure 中的每個 fluxConfigurations 資源會與一個 Flux GitRepositoryBucket 自訂資源相關聯,也會與 Kubernetes 叢集中一或多個 Kustomization 自訂資源相關聯。 當您建立 fluxConfigurations 資源時,您會在每個 Kustomization 的來源中指定來源 (Git 存放庫、貯體或 Azure Blob 儲存體) 的 URL 及同步目標。 您可以設定 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 恢復通訊。 若要連線至部署 Kubernetes 資訊清單所需的 Git 存放庫、Helm 存放庫或任何其他端點,您必須將這些端點佈建在防火牆後方,或列在防火牆上,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 延伸模組會藉由模擬只部署在 cluster-config 命名空間中的 flux-applier 服務帳戶來部署 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 延伸模組時,預設會啟用多租用戶。 如果您需要停用多租用戶,您可以使用 --configuration-settings multiTenancy.enforce=false 來建立或更新叢集中的 microsoft.flux 延伸模組以選擇退出,如下列範例命令所示:

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

下一步