使用適用於 AKS 的 GitOps (Flux v2) 和已啟用 Azure Arc 的 Kubernetes 進行應用程式部署
Azure 會使用 GitOps 提供自動化應用程式部署功能,此功能可與 Azure Kubernetes 服務 (AKS) 和已啟用 Azure Arc 的 Kubernetes 叢集搭配使用。 採用 GitOps 將應用程式部署至 Kubernetes 叢集所提供的主要優點包括:
- 持續查看在叢集上執行的應用程式狀態。
- 將應用程式開發小組與基礎結構小組之間的考量區隔開來。 應用程式小組不需要具備 Kubernetes 部署經驗。 平台工程小組通常會針對應用程式小組建立自助模型,讓其能夠更有信心地執行部署。
- 在當機或擴增時,能夠重新建立具有相同所需狀態的叢集。
使用 GitOps 時,請在 Git 存放庫的檔案中宣告 Kubernetes 叢集的所需狀態。 Git 存放庫可能包含下列檔案:
- YAML 格式的資訊清單,用於描述 Kubernetes 資源 (例如命名空間、秘密、部署等)
- 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 叢集延伸模組
在已啟用 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-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 物件) 的自訂資源定義。fluxConfigurations
:負責監看 Azure 是否有新的或更新的fluxconfig-agent
資源,以及在叢集中啟動相關聯的 Flux 設定。 此外,還負責針對每個fluxConfigurations
資源,將叢集中的 Flux 狀態變更推送回 Azure。fluxconfig-controller
:監看fluxconfigs.clusterconfig.azure.com
自訂資源,並回應叢集中因為 GitOps 機制新增或更新設定而發生的變更。
注意
microsoft.flux
延伸模組安裝在 flux-system
命名空間中,具有全叢集範圍。 您無法在命名空間範圍安裝此延伸模組。
Flux 設定
您可以建立 Flux 設定資源 (Microsoft.KubernetesConfiguration/fluxConfigurations
),以支援 GitOps 從 Git 存放庫、貯體來源或 Azure Blob 儲存體來管理叢集。 建立 fluxConfigurations
資源時,您提供給參數的值 (例如目標 Git 存放庫) 會用來建立和設定 Kubernetes 物件,以便在該叢集中啟用 GitOps 流程。 為了確保資料安全性,叢集設定服務會以待用加密方式將 fluxConfigurations
資源資料儲存在 Azure Cosmos DB 資料庫中。
隨 microsoft.flux
延伸模組安裝的 fluxconfig-agent
和 fluxconfig-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
自訂資源的資訊建立GitRepository
或Bucket
自訂資源和Kustomization
自訂資源。
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,或您是否使用小於 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 檔案) 中所述的資源。 其中兩個資訊清單描述 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 延伸模組會藉由模擬只部署在 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 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 工作流程。