教學課程:使用 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 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-configurationk8s-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 範圍, 請參閱所需的變更
  • 使用名稱和 infraapps 來指定兩個 kustomization。 每個都與存放庫中的路徑相關聯。
  • appskustomization 取決於 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 組態時,初始合規性狀態可能是 PendingNon-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 組態物件。
  • nginxpodinforedis :Git 存放庫中資訊清單中所述工作負載的命名空間。

若要確認命名空間,請執行下列命令:

kubectl get namespaces

命名空間 flux-system 包含 Flux 擴充物件:

  • Azure Flux 控制器: fluxconfig-agentfluxconfig-controller
  • OSS Flux 控制器: source-controllerkustomize-controllerhelm-controllernotification-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 會安裝 、 helmkustomizenotification Flux 控制器。 image-automationimage-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.enabledfalse

這個範例命令會 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