教學課程:使用 GitOps 搭配 Flux v2 部署應用程式
使用 Flux v2 的 GitOps 可以啟用為已啟用 Azure Arc 的 Kubernetes 叢集中的叢集擴充功能,或Azure Kubernetes Service (AKS) 叢集。 microsoft.flux
安裝叢集擴充功能之後,您可以建立一或多個 fluxConfigurations
資源,以將 Git 存放庫來源同步至叢集,並將叢集協調為所需的狀態。 透過 GitOps,您可以使用 Git 存放庫作為叢集組態和應用程式部署的事實來源。
注意
最後,Azure 會停止使用 Flux v1 支援 GitOps,因此我們建議您儘快 移轉至 Flux v2 。
本教學課程說明如何在 Kubernetes 叢集中使用 GitOps。 在深入探討之前,請花點時間 瞭解 GitOps 與 Flux 在概念上的運作方式。
在本教學課程中,我們會使用具有兩個 kustomization 的 GitOps 組態範例,讓您可以查看一個 kustomization 如何相依于另一個 kustomization。 視您的案例而定,您可以視需要新增更多 kustomizations 和相依性。
重要
延伸 microsoft.flux
模組發行了主要版本 1.0.0。 這包括 多租使用者功能。 如果您有使用舊版 microsoft.flux
延伸模組的現有 GitOps Flux v2 設定,您可以使用 Azure CLI 手動升級至最新的擴充功能: az k8s-extension create -g <RESOURCE_GROUP> -c <CLUSTER_NAME> -n flux --extension-type microsoft.flux -t <CLUSTER_TYPE>
(-t connectedClusters
使用 Arc 叢集和 -t managedClusters
AKS 叢集) 。
提示
使用此延伸模組搭配從 Azure 佈建的 AKS 混合式叢集時,您必須將 --cluster-type
設定為使用 provisionedClusters
,並同時將 --cluster-resource-provider microsoft.hybridcontainerservice
新增至命令。 在從 Azure 佈建的 AKS 混合式叢集上安裝 Azure Arc 延伸模組目前處於預覽狀態。
必要條件
若要使用 GitOps 搭配 Flux v2 部署應用程式,您需要下列專案:
針對已啟用 Azure Arc 的 Kubernetes 叢集
已啟用 Azure Arc 的 Kubernetes 連線叢集,已啟動並執行。
瞭解如何將 Kubernetes 叢集連線至 Azure Arc。如果您需要透過輸出 Proxy 進行連線,請務必 使用 Proxy 設定來安裝 Arc 代理程式。
Microsoft.Kubernetes/connectedClusters
資源類型的讀取和寫入權限。
針對Azure Kubernetes Service叢集
啟動並執行 MSI 型 AKS 叢集。
重要
請確定 AKS 叢集是以 MSI (非 SPN) 建立,因為
microsoft.flux
擴充功能不適用於 SPN 型 AKS 叢集。 針對使用az aks create
所建立的新 AKS 叢集,叢集預設會是 MSI 型叢集。 針對已經建立的 SPN 型叢集需要轉換成 MSI,請執行az aks update -g $RESOURCE_GROUP -n $CLUSTER_NAME --enable-managed-identity
「'。 如需詳細資訊,請參閱 在 AKS 中使用受控識別。Microsoft.ContainerService/managedClusters
資源類型的讀取和寫入權限。 如果使用 從 Azure (預覽版布建的 AKS 混合式叢集) ,則資源類型) 的Microsoft.ContainerService/provisionedClusters
讀取和寫入權限。
這兩種叢集類型的通用
這些資源類型的讀取和寫入權限:
Microsoft.KubernetesConfiguration/extensions
Microsoft.KubernetesConfiguration/fluxConfigurations
Azure CLI 2.15 版或更新版本。 安裝 Azure CLI ,或使用下列命令更新為最新版本:
az version az upgrade
Kubernetes 命令列用戶端 kubectl。 如果您使用 Azure Cloud Shell,則
kubectl
已安裝。使用
az aks install-cli
命令在本機安裝kubectl
:az aks install-cli
註冊下列 Azure 資源提供者:
az provider register --namespace Microsoft.Kubernetes az provider register --namespace Microsoft.ContainerService az provider register --namespace Microsoft.KubernetesConfiguration
註冊是非同步程式,應該會在 10 分鐘內完成。 若要監視註冊程式,請使用下列命令:
az provider show -n Microsoft.KubernetesConfiguration -o table Namespace RegistrationPolicy RegistrationState --------------------------------- -------------------- ------------------- Microsoft.KubernetesConfiguration RegistrationRequired Registered
版本和區域支援
Azure Arc 已啟用 Kubernetes 的所有區域目前都支援 GitOps。 AKS 所支援的區域子集目前支援 GitOps。 GitOps 服務會定期新增支援的區域。
支援最新版的 Flux v2 延伸模組和兩個舊版 (N-2)。 通常建議您使用最新版的延伸模組。
網路需求
GitOps 代理程式需要連接埠 22 (SSH) 或連接埠 443 (HTTPS) 上存放庫來源的輸出 TCP 才能運作。 代理程式也需要存取下列輸出 URL:
端點 (DNS) | 描述 |
---|---|
https://management.azure.com |
代理程式與 Kubernetes 設定服務通訊的必要項目。 |
https://<region>.dp.kubernetesconfiguration.azure.com |
代理程式的資料平面端點,用來推送狀態以及擷取設定資訊。 取決於 <region> 先前) 所述的支援區域 (。 |
https://login.microsoftonline.com |
擷取和更新 Azure Resource Manager 權杖的必要項目。 |
https://mcr.microsoft.com |
提取 Flux 控制器的容器映像的必要項目。 |
啟用 CLI 擴充功能
安裝最新的 k8s-configuration
和 k8s-extension
CLI 擴充功能套件:
az extension add -n k8s-configuration
az extension add -n k8s-extension
若要將這些套件更新為最新版本:
az extension update -n k8s-configuration
az extension update -n k8s-extension
若要查看所有已安裝的 Azure CLI 延伸模組及其版本的清單,請使用下列命令:
az extension list -o table
Experimental ExtensionType Name Path Preview Version
------------- -------------- ----------------- ----------------------------------------------------- -------- --------
False whl connectedk8s C:\Users\somename\.azure\cliextensions\connectedk8s False 1.2.7
False whl k8s-configuration C:\Users\somename\.azure\cliextensions\k8s-configuration False 1.5.0
False whl k8s-extension C:\Users\somename\.azure\cliextensions\k8s-extension False 1.1.0
提示
如需解決任何錯誤的說明,請參閱 已啟用 Azure Arc 的 Kubernetes 和 GitOps 疑難排解中的 Flux v2 建議。
套用 Flux 設定
k8s-configuration
使用 Azure CLI 擴充功能 (或Azure 入口網站) ,在 AKS 或已啟用 Arc 的 Kubernetes 叢集中啟用 GitOps。 如需示範,請使用公用 gitops-flux2-kustomize-helm-mt 存放庫。
重要
示範存放庫的設計目的是為了簡化本教學課程的使用,並說明一些重要原則。 若要保持最新狀態,存放庫偶爾可以從版本升級取得重大變更。 這些變更不會影響您本教學課程的新應用程式,只有先前尚未刪除的教學課程應用程式。 若要瞭解如何處理這些變更,請參閱 重大變更免責聲明。
下列範例會使用下列值和設定,將 Flux 設定套用至叢集:
- 包含叢集的資源群組為
flux-demo-rg
。 - Azure Arc 叢集的名稱為
flux-demo-arc
。 - 叢集類型為 Azure Arc ()
-t connectedClusters
,但此範例也適用于從 Azure (-t provisionedClusters
) 布建的 AKS (-t managedClusters
) 和 AKS 混合式叢集。 - Flux 組態的名稱是
cluster-config
。 - 組態安裝的命名空間為
cluster-config
。 - 公用 Git 存放庫的 URL 為
https://github.com/Azure/gitops-flux2-kustomize-helm-mt
。 - Git 存放庫分支為
main
。 - 組態的範圍是
cluster
。 這可讓操作員擁有在整個叢集進行變更的許可權。 若要搭配本教學課程使用namespace
範圍, 請參閱所需的變更。 - 使用名稱和
infra
apps
來指定兩個 kustomization。 每個都與存放庫中的路徑相關聯。 apps
kustomization 取決於infra
kustomization。 (infra
kustomization 必須先完成apps
,才能執行 kustomization。)- 在兩個 kustomization 上設定
prune=true
。 此設定可確保當已從存放庫移除 Flux 設定或 kustomizations 遭到刪除時,就會清除部署至叢集的 Flux 物件。
az k8s-configuration flux create -g flux-demo-rg \
-c flux-demo-arc \
-n cluster-config \
--namespace cluster-config \
-t connectedClusters \
--scope cluster \
-u https://github.com/Azure/gitops-flux2-kustomize-helm-mt \
--branch main \
--kustomization name=infra path=./infrastructure prune=true \
--kustomization name=apps path=./apps/staging prune=true dependsOn=\["infra"\]
microsoft.flux
如果因為先前的 GitOps 部署) 而尚未安裝擴充功能,此擴充功能將會安裝在叢集上 (。
第一次安裝 flux 組態時,初始合規性狀態可能是 Pending
或 Non-compliant
因為對帳仍在進行中。 一分鐘之後,重新查詢組態以查看最終合規性狀態。
az k8s-configuration flux show -g flux-demo-rg -c flux-demo-arc -n cluster-config -t connectedClusters
若要確認部署成功,請執行下列命令:
az k8s-configuration flux show -g flux-demo-rg -c flux-demo-arc -n cluster-config -t connectedClusters
成功部署時,會建立下列命名空間:
flux-system
:保存 Flux 擴充控制器。cluster-config
:保存 Flux 組態物件。nginx
、podinfo
、redis
:Git 存放庫中資訊清單中所述工作負載的命名空間。
若要確認命名空間,請執行下列命令:
kubectl get namespaces
命名空間 flux-system
包含 Flux 擴充物件:
- Azure Flux 控制器:
fluxconfig-agent
、fluxconfig-controller
- OSS Flux 控制器:
source-controller
、kustomize-controller
、helm-controller
、notification-controller
Flux 代理程式和控制器 Pod 應該處於執行中狀態。 使用下列命令確認此專案:
kubectl get pods -n flux-system
NAME READY STATUS RESTARTS AGE
fluxconfig-agent-9554ffb65-jqm8g 2/2 Running 0 21m
fluxconfig-controller-9d99c54c8-nztg8 2/2 Running 0 21m
helm-controller-59cc74dbc5-77772 1/1 Running 0 21m
kustomize-controller-5fb7d7b9d5-cjdhx 1/1 Running 0 21m
notification-controller-7d45678bc-fvlvr 1/1 Running 0 21m
source-controller-df7dc97cd-4drh2 1/1 Running 0 21m
命名空間 cluster-config
具有 Flux 組態物件。
kubectl get crds
NAME CREATED AT
alerts.notification.toolkit.fluxcd.io 2022-04-06T17:15:48Z
arccertificates.clusterconfig.azure.com 2022-03-28T21:45:19Z
azureclusteridentityrequests.clusterconfig.azure.com 2022-03-28T21:45:19Z
azureextensionidentities.clusterconfig.azure.com 2022-03-28T21:45:19Z
buckets.source.toolkit.fluxcd.io 2022-04-06T17:15:48Z
connectedclusters.arc.azure.com 2022-03-28T21:45:19Z
customlocationsettings.clusterconfig.azure.com 2022-03-28T21:45:19Z
extensionconfigs.clusterconfig.azure.com 2022-03-28T21:45:19Z
fluxconfigs.clusterconfig.azure.com 2022-04-06T17:15:48Z
gitconfigs.clusterconfig.azure.com 2022-03-28T21:45:19Z
gitrepositories.source.toolkit.fluxcd.io 2022-04-06T17:15:48Z
helmcharts.source.toolkit.fluxcd.io 2022-04-06T17:15:48Z
helmreleases.helm.toolkit.fluxcd.io 2022-04-06T17:15:48Z
helmrepositories.source.toolkit.fluxcd.io 2022-04-06T17:15:48Z
imagepolicies.image.toolkit.fluxcd.io 2022-04-06T17:15:48Z
imagerepositories.image.toolkit.fluxcd.io 2022-04-06T17:15:48Z
imageupdateautomations.image.toolkit.fluxcd.io 2022-04-06T17:15:48Z
kustomizations.kustomize.toolkit.fluxcd.io 2022-04-06T17:15:48Z
providers.notification.toolkit.fluxcd.io 2022-04-06T17:15:48Z
receivers.notification.toolkit.fluxcd.io 2022-04-06T17:15:48Z
volumesnapshotclasses.snapshot.storage.k8s.io 2022-03-28T21:06:12Z
volumesnapshotcontents.snapshot.storage.k8s.io 2022-03-28T21:06:12Z
volumesnapshots.snapshot.storage.k8s.io 2022-03-28T21:06:12Z
websites.extensions.example.com 2022-03-30T23:42:32Z
使用下列命令確認組態的其他詳細資料。
kubectl get fluxconfigs -A
NAMESPACE NAME SCOPE URL PROVISION AGE
cluster-config cluster-config cluster https://github.com/Azure/gitops-flux2-kustomize-helm-mt Succeeded 44m
kubectl get gitrepositories -A
NAMESPACE NAME URL READY STATUS AGE
cluster-config cluster-config https://github.com/Azure/gitops-flux2-kustomize-helm-mt True Fetched revision: main/4f1bdad4d0a54b939a5e3d52c51464f67e474fcf 45m
kubectl get helmreleases -A
NAMESPACE NAME READY STATUS AGE
cluster-config nginx True Release reconciliation succeeded 66m
cluster-config podinfo True Release reconciliation succeeded 66m
cluster-config redis True Release reconciliation succeeded 66m
kubectl get kustomizations -A
NAMESPACE NAME READY STATUS AGE
cluster-config cluster-config-apps True Applied revision: main/4f1bdad4d0a54b939a5e3d52c51464f67e474fcf 65m
cluster-config cluster-config-infra True Applied revision: main/4f1bdad4d0a54b939a5e3d52c51464f67e474fcf 65m
工作負載是從 Git 存放庫中的資訊清單部署。
kubectl get deploy -n nginx
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-ingress-controller 1/1 1 1 67m
nginx-ingress-controller-default-backend 1/1 1 1 67m
kubectl get deploy -n podinfo
NAME READY UP-TO-DATE AVAILABLE AGE
podinfo 1/1 1 1 68m
kubectl get all -n redis
NAME READY STATUS RESTARTS AGE
pod/redis-master-0 1/1 Running 0 68m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/redis-headless ClusterIP None <none> 6379/TCP 68m
service/redis-master ClusterIP 10.0.13.182 <none> 6379/TCP 68m
NAME READY AGE
statefulset.apps/redis-master 1/1 68m
控制使用 Flux 叢集延伸模組部署哪些控制器
在某些情況下,您可能想要變更哪些 Flux 控制器會隨 Flux 叢集延伸模組一起安裝。
預設 source
會安裝 、 helm
kustomize
和 notification
Flux 控制器。 和 image-automation
image-reflector
控制器,在有新的容器映射可供使用時用來更新 Git 存放庫,必須明確啟用。
您可以使用 k8s-extension
命令來變更預設選項:
--config source-controller.enabled=<true/false>
true
預設 ()--config helm-controller.enabled=<true/false>
true
預設 ()--config kustomize-controller.enabled=<true/false>
true
預設 ()--config notification-controller.enabled=<true/false>
true
預設 ()--config image-automation-controller.enabled=<true/false>
false
預設 ()--config image-reflector-controller.enabled=<true/false>
false
預設 ()
例如,若要停用通知,您可以將 設定 notification-controller.enabled
為 false
。
這個範例命令會 image-reflector
安裝 和 image-automation
控制器。 如果在第一次建立 Flux 組態時自動建立 Flux 延伸模組,則延伸模組名稱會是 flux
。
az k8s-extension create -g <cluster_resource_group> -c <cluster_name> -t <connectedClusters or managedClusters or provisionedClusters> --name flux --extension-type microsoft.flux --config image-automation-controller.enabled=true image-reflector-controller.enabled=true
使用 Kubelet 身分識別作為 AKS 叢集的驗證方法
使用 AKS 叢集時,要使用的其中一個驗證選項是 kubelet 身分識別。 根據預設,AKS 會在受控資源群組中建立自己的 kubelet 身分識別。 如果您想要的話,您可以使用 預先建立的 kubelet 受控識別。 若要這樣做,請在 Flux 擴充功能安裝時新增 參數 --config useKubeletIdentity=true
。
az k8s-extension create --resource-group <resource-group> --cluster-name <cluster-name> --cluster-type managedClusters --name flux --extension-type microsoft.flux --config useKubeletIdentity=true
Red Hat OpenShift 上線指引
Flux 控制器需要 非根安全性內容條件約束 ,才能在叢集上正確布建 Pod。 在將擴充功能上線 microsoft.flux
之前,這些條件約束必須新增至叢集。
NS="flux-system"
oc adm policy add-scc-to-user nonroot system:serviceaccount:$NS:kustomize-controller
oc adm policy add-scc-to-user nonroot system:serviceaccount:$NS:helm-controller
oc adm policy add-scc-to-user nonroot system:serviceaccount:$NS:source-controller
oc adm policy add-scc-to-user nonroot system:serviceaccount:$NS:notification-controller
oc adm policy add-scc-to-user nonroot system:serviceaccount:$NS:image-automation-controller
oc adm policy add-scc-to-user nonroot system:serviceaccount:$NS:image-reflector-controller
如需有關上線 Flux 之 OpenShift 指引的詳細資訊,請參閱 Flux 檔。
使用參數
Flux 支援許多參數來啟用各種案例。 如需 Flux 支援之所有參數的描述,請參閱 官方 Flux 檔。 Azure 中的 Flux 尚不支援所有參數。 讓我們知道 Azure 實作中是否有您需要的參數。
如需可用參數及其使用方式的詳細資訊,請參閱 使用 AKS 和已啟用 Azure Arc 的 Kubernetes 的 GitOps Flux v2設定。
使用 Flux Kustomize 控制器管理叢集設定
Flux Kustomize 控制器會安裝為叢集延伸模組的一 microsoft.flux
部分。 它允許使用從 Git 存放庫同步的 Kubernetes 資訊清單,來宣告式管理叢集組態和應用程式部署。 這些 Kubernetes 資訊清單可以選擇性地包含 kustomize.yaml 檔案。
如需使用量詳細資料,請參閱下列各項:
使用 Flux Helm 控制器管理 Helm 圖表發行
Flux Helm 控制器會安裝為叢集延伸模組的 microsoft.flux
一部分。 它可讓您使用您在 Git 存放庫中維護的 Kubernetes 資訊清單,以宣告方式管理 Helm 圖表版本。
如需使用量詳細資料,請參閱下列各項:
提示
由於 Helm 如何處理索引檔案,因此處理 Helm 圖表是昂貴的作業,而且記憶體使用量很高。 因此,一次協調大量的 Helm 圖表可能會導致記憶體尖峰和 OOMKilled
錯誤。 根據預設,控制器會在 1Gi 設定其記憶體限制,並在 64Mi 設定其記憶體要求。 若要增加此限制和要求,因為大量的 Helm 圖表對帳,請在安裝 microsoft.flux 延伸模組之後執行下列命令:
az k8s-extension update -g <resource-group> -c <cluster-name> -n flux -t connectedClusters --config source-controller.resources.limits.memory=2Gi source-controller.resources.requests.memory=300Mi
使用 Helm 圖表的 GitRepository 來源
如果您的 Helm 圖表儲存在您 GitRepository
設定為資源一 fluxConfigurations
部分的來源中,您可以藉由將新增 clusterconfig.azure.com/use-managed-source: "true"
至 HelmRelease.yaml 檔案,來指出所設定的來源應該用來作為 Helm 圖表的來源,如下列範例所示:
---
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
name: somename
namespace: somenamespace
annotations:
clusterconfig.azure.com/use-managed-source: "true"
spec:
...
藉由使用此批註,所部署的 HelmRelease 將會使用已設定來源的參考進行修補。 目前僅 GitRepository
支援來源。
刪除 Flux 設定和延伸模組
使用下列命令來刪除 Flux 組態,並視需要刪除 Flux 延伸模組本身。
刪除 Flux 設定
下列命令會 fluxConfigurations
刪除 Azure 中的資源,以及叢集中的 Flux 組態物件。 由於 Flux 組態原本是使用 prune=true
kustomization 的參數所建立,因此在移除 Flux 組態時,將會移除以 Git 存放庫中資訊清單為基礎的叢集中建立的所有物件。 不過,此命令不會移除 Flux 延伸模組本身。
az k8s-configuration flux delete -g flux-demo-rg -c flux-demo-arc -n cluster-config -t connectedClusters --yes
刪除 Flux 叢集延伸模組
當您刪除 Flux 延伸模組時, microsoft.flux
將會移除 Azure 中的延伸模組資源以及叢集中的 Flux 延伸模組物件。
如果在第一次建立 Flux 組態時自動建立 Flux 延伸模組,則延伸模組名稱將會是 flux
。
az k8s-extension delete -g flux-demo-rg -c flux-demo-arc -n flux -t connectedClusters --yes
提示
這些命令會使用 -t connectedClusters
,適用于已啟用 Azure Arc 的 Kubernetes 叢集。 針對 AKS 叢集,請改用 -t managedClusters
。 針對從 Azure 布建的 AKS 混合式叢集,請使用 -t provisionedClusters
。