使用適用於 AKS 和已啟用 Azure Arc 的 Kubernetes 的 GitOps (Flux v2) 進行應用程式部署
Azure 使用 GitOps 提供自動化應用程式部署功能,可與 Azure Kubernetes Service (AKS) 和已啟用 Azure Arc 的 Kubernetes 叢集搭配運作。 採用 GitOps 將應用程式部署至 Kubernetes 叢集所提供的主要優點包括:
- 持續查看叢集上執行的應用程式狀態。
- 將應用程式開發小組與基礎結構小組之間的考慮區隔開。 應用程式小組不需要具備 Kubernetes 部署的經驗。 平臺工程小組通常會為應用程式小組建立自助模型,讓他們能夠更有信心地執行部署。
- 在當機或相應放大時,能夠重新建立具有相同所需狀態的叢集。
使用 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 手動安裝。
Controllers
根據預設,擴充 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
Kubernetes 物件的自定義資源自定義資源定義FluxConfig
。fluxconfig-agent
:負責監看 Azure 是否有新的或更新fluxConfigurations
的資源,以及啟動叢集中相關聯的 Flux 組態。 也負責將叢集中的 Flux 狀態變更推送回 Azure,以供每個fluxConfigurations
資源使用。fluxconfig-controller
:監看fluxconfigs.clusterconfig.azure.com
自定義資源,並使用叢集中 GitOps 機器的新或更新組態來響應變更。
注意
擴充 microsoft.flux
功能會安裝在 命名空間中 flux-system
,而且具有 整個叢集的範圍。 您無法在命名空間範圍安裝此延伸模組。
Flux 組態
您可以建立 Flux 設定資源 (Microsoft.KubernetesConfiguration/fluxConfigurations
) 以從 Git 存放庫、貯體來源或 Azure Blob 記憶體啟用叢集的 GitOps 管理。 當您建立 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 為基礎,且使用者未在建立組態期間提供自己的私鑰,則此金鑰會用於驗證。 - 根據使用者提供的私鑰/HTTP basic-auth/known-hosts/no-auth 數據建立自定義驗證密碼。
- 設定角色型訪問控制(已布建的服務帳戶、建立/指派的角色系結、建立/指派的角色)。
GitRepository
從自訂資源中的FluxConfig
資訊建立或Bucket
自訂資源和Kustomization
自定義資源。
fluxConfigurations
Azure 中的每個資源都會與一個 Flux GitRepository
或Bucket
自定義資源以及 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 型叢集組態資源。
具有私人連結的 GitOps
如果您已將私人連結的支援 新增至已啟用 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 檔案) 中所述的資源。 其中兩個指令清單描述 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 擴充功能會藉由模擬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 公鑰。
下一步
- 使用我們的教學課程,瞭解如何 在 AKS 或已啟用 Azure Arc 的 Kubernetes 叢集上啟用 GitOps。
- 瞭解 使用 GitOps 的 CI/CD 工作流程。