教學課程:使用 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 在概念上的運作方式

重要

擴充 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 延伸模組目前為預覽狀態。

必要條件

若要透過 Azure CLI 或Azure 入口網站來管理 GitOps,您需要下列專案:

針對已啟用 Azure Arc 的 Kubernetes 叢集

針對Azure Kubernetes Service叢集

  • 已啟動並執行 MSI 型 AKS 叢集。

    重要

    請確定 AKS 叢集是以 MSI (而非 SPN) 建立,因為 microsoft.flux 擴充功能不適用於 SPN 型 AKS 叢集。 針對使用 az aks create 所建立的新 AKS 叢集,叢集預設會是 MSI 型叢集。 針對已建立需要轉換成 MSI 的 SPN 型叢集,請執行 az aks update -g $RESOURCE_GROUP -n $CLUSTER_NAME --enable-managed-identity 「'。 如需詳細資訊,請參閱 在 AKS 中使用受控識別

  • Microsoft.ContainerService/managedClusters 資源類型的讀取和寫入權限。

這兩種叢集類型通用

  • 這些資源類型的讀取和寫入權限:

    • 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
    

    註冊是非同步程式,應該會在十分鐘內完成。 若要監視註冊程式,請使用下列命令:

    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 建議。

使用 Azure CLI 套用 Flux 設定

k8s-configuration使用 Azure CLI 擴充功能 (或Azure 入口網站) ,在 AKS 或已啟用 Arc 的 Kubernetes 叢集中啟用 GitOps。 如需示範,請使用公用 gitops-flux2-kustomize-helm-mt 存放庫。

重要

示範存放庫的設計目的是為了簡化您在本教學課程的使用,並說明一些重要原則。 為了保持最新狀態,存放庫偶爾會從版本升級取得重大變更。 這些變更不會影響您本教學課程的新應用程式,只有先前尚未刪除的教學課程應用程式。 若要瞭解如何處理這些變更,請參閱 重大變更免責聲明

在下例中︰

  • 包含叢集的資源群組為 flux-demo-rg
  • Azure Arc 叢集的名稱為 flux-demo-arc
  • 叢集類型是 Azure Arc (-t connectedClusters) ,但此範例也適用于 AKS () -t managedClusters
  • Flux 組態的名稱為 cluster-config
  • 組態安裝的命名空間為 cluster-config
  • 公用 Git 存放庫的 URL 為 https://github.com/Azure/gitops-flux2-kustomize-helm-mt
  • Git 存放庫分支為 main
  • 組態的範圍是 cluster 。 這可讓操作員擁有變更整個叢集的許可權。 若要搭配本教學課程使用 namespace 範圍, 請參閱所需的變更
  • 兩個 kustomization 是使用 名稱和 infraapps 來指定。 每個都與存放庫中的路徑相關聯。
  • appskustomization 取決於 infra kustomization。 (infra kustomization 必須在 kustomization 執行之前 apps 完成。)
  • 在兩個 kustomizations 上設定 prune=true 。 此設定可確保從存放庫移除 Flux 部署至叢集的物件,或刪除 Flux 組態或 kustomizations 時,將會清除這些物件。
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 擴充功能將會安裝在叢集上。 第一次安裝 flux 設定時,初始合規性狀態可能是 PendingNon-compliant 因為對帳仍在進行中。 在一分鐘之後,重新查詢設定以查看最終合規性狀態。

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、 、 podinforedis :Git 存放庫中資訊清單中所述工作負載的命名空間。

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

kubectl get namespaces

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

  • Azure Flux 控制器: fluxconfig-agentfluxconfig-controller
  • OSS Flux 控制器: source-controller 、、 kustomize-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 叢集延伸模組部署哪些控制器

預設 source 會安裝 、 helmkustomizenotification Flux 控制器。 image-automationimage-reflector 控制器必須明確啟用。 您可以使用 k8s-extension CLI 來做出這些選擇:

  • --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預設 ()

以下是包含 Flux 影像反映器和影像自動化控制器的範例。 如果在第一次建立 Flux 組態時自動建立 Flux 延伸模組,則延伸模組名稱會是 flux

az k8s-extension create -g <cluster_resource_group> -c <cluster_name> -t <connectedClusters or managedClusters> --name flux --extension-type microsoft.flux --config image-automation-controller.enabled=true image-reflector-controller.enabled=true

使用 Kubelet 身分識別作為 Azure Kubernetes 叢集的驗證方法

使用 Azure Kubernetes 叢集時,要使用的其中一個驗證選項是 kubelet 身分識別。 若要讓 Flux 使用此專案,請在 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設定。

使用 Azure 入口網站 管理 GitOps 組態

Azure 入口網站適用于管理已啟用 Azure Arc 的 Kubernetes 或 AKS 叢集中的 GitOps 組態和 Flux 延伸模組。 在Azure 入口網站中,您可以看到與每個叢集相關聯的所有 Flux 設定,並取得詳細資訊,包括每個叢集的整體合規性狀態。

也會顯示已部署到每個叢集的 Flux 物件,以及其安裝參數、合規性狀態和任何錯誤。

您也可以使用Azure 入口網站來建立、更新和刪除 GitOps 組態。

使用 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 延伸模組本身。

針對已啟用 Azure Arc 的 Kubernetes 叢集,請使用此命令:

az k8s-configuration flux delete -g flux-demo-rg -c flux-demo-arc -n cluster-config -t connectedClusters --yes

針對 AKS 叢集,請使用相同的命令,但取代 -t managedClusters-t connectedClusters

刪除 Flux 叢集延伸模組

您可以使用 Azure CLI 或 Azure 入口網站來刪除 Flux 延伸模組。 刪除動作會 microsoft.flux 移除 Azure 中的延伸模組資源,以及叢集中的 Flux 擴充功能物件。

如果在第一次建立 Flux 組態時自動建立 Flux 延伸模組,則延伸模組名稱將會是 flux

針對已啟用 Azure Arc 的 Kubernetes 叢集,請使用此命令:

az k8s-extension delete -g flux-demo-rg -c flux-demo-arc -n flux -t connectedClusters --yes

針對 AKS 叢集,請使用相同的命令,但取代 -t managedClusters-t connectedClusters

下一步