Azure 會使用 GitOps 提供自動化應用程式部署功能,此功能可與 Azure Kubernetes 服務 (AKS) 和已啟用 Azure Arc 的 Kubernetes 叢集搭配使用。 採用 GitOps 將應用程式部署至 Kubernetes 叢集所提供的主要優點包括:
- 持續查看在叢集上執行的應用程式狀態。
- 將應用程式開發小組與基礎結構小組之間的考量區隔開來。 應用程式小組不需要具備 Kubernetes 部署經驗。 平台工程小組通常會針對應用程式小組建立自助模型,讓其能夠更有信心地執行部署。
- 在當機或擴增時,能夠重新建立具有相同所需狀態的叢集。
- 能夠透過 Azure 原則 大規模部署應用程式 。
使用 GitOps 時,請在 Git 存放庫的檔案中宣告 Kubernetes 叢集的所需狀態。 Git 存放庫可能包含下列檔案:
- 描述 Kubernetes 資源的 YAML 格式指令清單(例如命名空間、秘密、部署和其他專案)
- 用於部署應用程式的 Helm 圖表
- Kustomize 檔案 以描述環境特定變更
因為這些檔案儲存在 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 來手動安裝。
控制器
根據預設,擴充 microsoft.flux
功能會安裝 Flux 控制器(Source、Kustomize、Helm、Notification)和 FluxConfig 自定義資源定義 (CRD), fluxconfig-agent
以及 fluxconfig-controller
。 您也可以選擇安裝 Flux image-automation
和 image-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 物件) 的自訂資源定義。fluxconfig-agent
:負責監看 Azure 是否有新的或更新的fluxConfigurations
資源,以及在叢集中啟動相關聯的 Flux 設定。 此外,還負責針對每個fluxConfigurations
資源,將叢集中的 Flux 狀態變更推送回 Azure。fluxconfig-controller
:監看fluxconfigs.clusterconfig.azure.com
自訂資源,並回應叢集中因為 GitOps 機制新增或更新設定而發生的變更。
注意
安裝 microsoft.flux
擴充功能於 flux-system
命名空間,且具有 叢集範圍。 您無法在命名空間範圍安裝此延伸模組。
Flux 設定
若要以高解析度下載架構圖表,請流覽 Jumpstart Gems。
您可以建立 Flux 設定資源 (Microsoft.KubernetesConfiguration/fluxConfigurations
),以支援 GitOps 從 Git 存放庫、貯體來源或 Azure Blob 儲存體來管理叢集。 當您建立 fluxConfigurations
資源時,您提供給 參數的值,例如目標 Git 存放庫,會用來建立及設定 Kubernetes 物件,以啟用該叢集中的 GitOps 程式。 為了確保資料安全性,叢集設定服務會以待用加密方式將 fluxConfigurations
資源資料儲存在 Azure Cosmos DB 資料庫中。
隨 fluxconfig-agent
延伸模組安裝的 fluxconfig-controller
和 microsoft.flux
代理程式管理 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 資料,建立自訂驗證袐密。
- 設定角色型存取控制 (佈建的服務帳戶、建立/指派的角色繫結、建立/指派的角色)。
- 根據
GitRepository
自訂資源的資訊建立Bucket
或Kustomization
自訂資源和FluxConfig
自訂資源。
Azure 中的每個 fluxConfigurations
資源會與一個 Flux GitRepository
或 Bucket
自訂資源相關聯,也會與 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 型叢集設定資源。
GitOps 與私人連結
如果您已新增對 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,或使用 Kubernetes 版本小於 1.20.6。 若要準備:
- 升級至 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 檔案) 中所述的資源。 其中兩個資訊清單描述 HelmRelease
和 HelmRepository
物件。
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 延伸模組會藉由模擬只部署在 fluxConfigurations
命名空間中的 flux-applier
服務帳戶來部署 cluster-config
。 使用上述資訊清單,當多租用戶啟用時,HelmRelease
將會遭到封鎖。 這是因為 HelmRelease
位於 nginx
命名空間中,但它參考 flux-system
命名空間中的 HelmRepository。 此外,Flux helm-controller
無法套用 HelmRelease
,因為 flux-applier
命名空間中沒有 nginx
服務帳戶。
若要使用多租用戶,正確的方法是將所有 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 microsoft.flux
資源,sourceControlConfigurations
叢集延伸模組將不會安裝。 移除 Flux v1 設定和部署 Flux v2 設定的流程,其所需時間不應超過 30 分鐘。
移除 Flux v1 sourceControlConfigurations
不會停止正在叢集上執行的任何應用程式。 不過,在移除 Flux v1 設定且尚未完全部署 Flux v2 延伸模組的期間:
- 如果儲存在 Git 存放庫的應用程式資訊清單中有新的變更,則不會在移轉期間提取這些變更,而且部署在叢集上的應用程式版本將會過時。
- 如果叢集狀態中有非預期的變更,且其偏離來源 Git 存放庫中所指定的預期狀態,叢集將無法自我修復。
建議您先在開發環境中測試移轉案例,再移轉實際執行環境。
檢視和刪除 Flux v1 設定
請使用這些 Azure CLI 命令來尋找並刪除叢集中的現有 sourceControlConfigurations
:
az k8s-configuration flux list --cluster-name <cluster name> --cluster-type <connectedClusters or managedClusters> --resource-group <resource group name>
az k8s-configuration flux 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 公開金鑰。
下一步
- 使用我們的教學課程,瞭解如何在 AKS 或已啟用 Azure Arc 的 Kubernetes 叢集上啟用 GitOps。
- 瞭解使用 GitOps 的 CI/CD 工作流程。