Tutorial: Verwenden von GitOps mit Flux v2 in Kubernetes-Clustern mit Azure Arc-Unterstützung oder AKS-Clustern

GitOps mit Flux v2 kann in verwalteten AKS-Clustern (Azure Kubernetes Service) oder in verbundenen Kubernetes-Clustern mit Azure Arc-Unterstützung als Clustererweiterung aktiviert werden. Nachdem die Clustererweiterung microsoft.flux installiert wurde, können Sie eine oder mehrere fluxConfigurations-Ressourcen erstellen, die Ihre Git-Repositoryquellen mit dem Cluster synchronisieren und den Cluster mit dem gewünschten Zustand abstimmen. Mit GitOps können Sie Ihr Git-Repository als Quelle der Wahrheit für die Clusterkonfiguration und Anwendungsbereitstellung verwenden.

Hinweis

Azure wird die Unterstützung für GitOps mit Flux v1 einstellen. Beginnen Sie daher so bald wie möglich, Flux v2 zu verwenden.

In diesem Tutorial wird beschrieben, wie Sie GitOps in einem Kubernetes-Cluster verwenden. Nehmen Sie sich vor dem Einarbeiten einen Moment Zeit, um zu erfahren, wie GitOps mit Flux konzeptionell funktioniert.

Wichtig

Mit der microsoft.flux-Erweiterung wurde die Hauptversion 1.0.0 veröffentlicht. Diese enthält das Mehrinstanzenfähigkeits-Feature. Wenn Sie über vorhandene GitOps Flux v2-Konfigurationen verfügen, die eine frühere Version der microsoft.flux-Erweiterung verwenden, können Sie die neueste Erweiterung manuell mithilfe der Azure CLI aktualisieren: "az k8s-extension create -g <RESOURCE_GROUP> -c <CLUSTER_NAME> -n flux --extension-type microsoft.flux -t <CLUSTER_TYPE>" (verwenden Sie "-t connectedClusters" für Arc-Cluster und "-t managedClusters" für AKS-Cluster).

Tipp

Wenn Sie diese Erweiterung mit von Azure bereitgestellten AKS-Hybridclustern verwenden, müssen Sie --cluster-type so festlegen, dass provisionedClusters verwendet wird, und außerdem --cluster-resource-provider microsoft.hybridcontainerservice zum Befehl hinzufügen. Die Installation von Azure Arc-Erweiterungen in AKS-Hybridclustern, die von Azure bereitgestellt werden, befindet sich derzeit in der Vorschauphase.

Voraussetzungen

Um GitOps über die Azure-Befehlszeilenschnittstelle oder das Azure-Portal verwalten zu können, benötigen Sie Folgendes:

Für Kubernetes-Cluster mit Azure Arc-Unterstützung

Für Azure Kubernetes Service-Cluster

  • Einen MSI-basierten AKS-Cluster, der aktiv ist und ausgeführt wird.

    Wichtig

    Stellen Sie sicher, dass der AKS-Cluster mit einer MSI (nicht SPN) erstellt wird, da die Erweiterung microsoft.flux nicht mit SPN-basierten AKS-Clustern funktioniert. Bei neuen AKS-Clustern, die mit „az aks create“ erstellt werden, wird der Cluster standardmäßig MSI-basiert sein. Für bereits erstellte SPN-basierte Cluster, die in MSI konvertiert werden müssen, führen Sie „az aks update -g $RESOURCE_GROUP -n $CLUSTER_NAME --enable-managed-identity“ aus. Weitere Informationen finden Sie in den Dokumenten zur verwalteten Identität.

  • Lese- und Schreibberechtigungen für den Ressourcentyp Microsoft.ContainerService/managedClusters

Für beide Clustertypen

  • Lese- und Schreibberechtigungen für diese Ressourcentypen:

    • Microsoft.KubernetesConfiguration/extensions
    • Microsoft.KubernetesConfiguration/fluxConfigurations
  • Azure-Befehlszeilenschnittstelle ab Version 2.15. Installieren Sie die Azure-Befehlszeilenschnittstelle, oder verwenden Sie die folgenden Befehle, um ein Update auf die neueste Version auszuführen:

    az version
    az upgrade
    
  • Registrierung der folgenden Azure-Dienstanbieter. (Vorhandene Anbieter können problemlos erneut registriert werden.)

    az provider register --namespace Microsoft.Kubernetes
    az provider register --namespace Microsoft.ContainerService
    az provider register --namespace Microsoft.KubernetesConfiguration
    

    Die Registrierung ist ein asynchroner Prozess und sollte innerhalb von 10 Minuten abgeschlossen sein. Verwenden Sie zum Überwachen des Registrierungsprozesses folgenden Code:

    az provider show -n Microsoft.KubernetesConfiguration -o table
    
    Namespace                          RegistrationPolicy    RegistrationState
    ---------------------------------  --------------------  -------------------
    Microsoft.KubernetesConfiguration  RegistrationRequired  Registered
    

Versions- und Regionsunterstützung

GitOps wird derzeit in allen Regionen unterstützt, die Kubernetes mit Azure Arc-Unterstützung unterstützt. GitOps wird derzeit in einer Teilmenge der Regionen unterstützt, die AKS unterstützt. Der GitOps-Dienst fügt in regelmäßigen Abständen neue unterstützte Regionen hinzu.

Die neueste Version der Flux v2-Erweiterung und die beiden vorherigen Versionen (N-2) werden unterstützt. Im Allgemeinen wird empfohlen, die neueste Version der Erweiterung zu verwenden.

Netzwerkanforderungen

Die GitOps-Agents erfordern ein ausgehendes TCP an die Repository-Quelle auf Port 22 (SSH) oder Port 443 (HTTPS), um zu funktionieren. Außerdem benötigen die Agents die folgenden ausgehenden URLs:

Endpunkt (DNS) BESCHREIBUNG
https://management.azure.com Erforderlich, damit der Agent mit dem Kubernetes-Konfigurationsdienst kommunizieren kann.
https://<region>.dp.kubernetesconfiguration.azure.com Endpunkt auf Datenebene, über den der Agent Statusinformationen mithilfe von Push übermitteln und Konfigurationsinformationen abrufen kann Hängt von <region> (den zuvor erwähnten unterstützten Regionen) ab.
https://login.microsoftonline.com Erforderlich zum Abrufen und Aktualisieren von Azure Resource Manager-Token.
https://mcr.microsoft.com Erforderlich zum Pullen von Containerimages für Flux-Controller.

Aktivieren der CLI-Erweiterungen

Hinweis

Die CLI-Erweiterung k8s-configuration verwaltet entweder Flux v2- oder Flux v1-Konfigurationen. Azure wird die Unterstützung für GitOps mit Flux v1 einstellen. Beginnen Sie daher so bald wie möglich, Flux v2 zu verwenden.

Installieren Sie die neuesten CLI-Erweiterungspakete k8s-configuration und k8s-extension:

az extension add -n k8s-configuration
az extension add -n k8s-extension

Verwenden Sie die folgenden Befehle, um diese Pakete zu aktualisieren:

az extension update -n k8s-configuration
az extension update -n k8s-extension

Verwenden Sie den folgenden Befehl, um die Liste der installierten Azure CLI-Erweiterungen und deren Versionen anzuzeigen:

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

Tipp

Hilfe zum Beheben von Fehlern finden Sie in den Flux v2-Vorschlägen in Problembehandlung für Kubernetes mit Azure Arc-Unterstützung und GitOps.

Anwenden einer Flux-Konfiguration mithilfe der Azure-Befehlszeilenschnittstelle

Verwenden Sie Azure CLI-Erweiterung k8s-configuration (oder das Azure-Portal), um GitOps in einem AKS-Cluster oder einem Kubernetes-Cluster mit Azure Arc-Unterstützung zu aktivieren. Verwenden Sie für eine Demonstration das öffentliche Repository gitops-flux2-kustomize-helm-mt.

Wichtig

Das Demo-Repository soll die Nutzung dieses Tutorials vereinfachen und einige wichtige Prinzipien veranschaulichen. Um auf dem neuesten Stand zu bleiben, kann das Repository gelegentlich Breaking Changes von Versionsupgrades abrufen. Diese Änderungen wirken sich nicht auf Ihre neue Anwendung aus diesem Tutorial aus, nur auf frühere Tutorialanwendungen, die nicht gelöscht wurden. Informationen dazu, wie Sie mit diesen Änderungen umgehen, finden Sie im Haftungsausschluss zu Breaking Changes.

Siehe folgendes Beispiel:

  • Die Ressourcengruppe, die den Cluster enthält, lautet flux-demo-rg.
  • Der Name des Azure Arc-Clusters lautet flux-demo-arc.
  • Der Clustertyp ist Azure Arc (-t connectedClusters), aber dieses Beispiel funktioniert auch mit AKS (-t managedClusters).
  • Der Name der Flux-Konfiguration lautet cluster-config.
  • Der Namespace für die Konfigurationsinstallation lautet cluster-config.
  • Die URL für das öffentliche Git-Repository lautet https://github.com/Azure/gitops-flux2-kustomize-helm-mt.
  • Der Git-Repositorybranch ist main.
  • Der Bereich der Konfiguration ist cluster. Damit wird den Operatoren die Berechtigung für Änderungen im gesamten Cluster erteilt. Informationen zum Verwenden des namespace-Bereichs mit diesem Tutorial finden Sie in den erforderlichen Änderungen.
  • Zwei Kustomizations werden mit den Namen infra und apps angegeben. Jede ist einem Pfad im Repository zugeordnet.
  • Die Kustomization apps hängt von der Kustomization infra ab. (Die Kustomization infra muss abgeschlossen sein, bevor die Kustomization apps ausgeführt wird.)
  • Legen Sie prune=true für beide Kustomizations fest. Mit dieser Einstellung wird sichergestellt, dass die von Flux im Cluster bereitgestellten Objekte bereinigt werden, wenn sie aus dem Repository entfernt oder die Flux-Konfiguration oder Kustomizations gelöscht werden.

Wenn die Erweiterung microsoft.flux bisher noch nicht im Cluster installiert ist, wird sie installiert. Wenn die Flux-Konfiguration installiert ist, kann der anfängliche Konformitätszustand „Pending“ (Ausstehend) oder „Non-compliant“ (Nicht konform) sein, da die Abstimmung noch ausgeführt wird. Nach einer Minute können Sie die Konfiguration erneut abfragen und den endgültigen Konformitätszustand anzeigen.

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' extension not found on the cluster, installing it now. This may take a few minutes...
'Microsoft.Flux' extension was successfully installed on the cluster
Creating the flux configuration 'cluster-config' in the cluster. This may take a few minutes...
{
  "complianceState": "Pending",
  ... (not shown because of pending status)
}

Zeigen Sie die Konfiguration nach dem Abschluss der Abstimmungen an.

az k8s-configuration flux show -g flux-demo-rg -c flux-demo-arc -n cluster-config -t connectedClusters
{
  "bucket": null,
  "complianceState": "Compliant",
  "configurationProtectedSettings": {},
  "errorMessage": "",
  "gitRepository": {
    "httpsCaCert": null,
    "httpsUser": null,
    "localAuthRef": null,
    "repositoryRef": {
      "branch": "main",
      "commit": null,
      "semver": null,
      "tag": null
    },
    "sshKnownHosts": null,
    "syncIntervalInSeconds": 600,
    "timeoutInSeconds": 600,
    "url": "https://github.com/Azure/gitops-flux2-kustomize-helm-mt"
  },
  "id": "/subscriptions/REDACTED/resourceGroups/flux-demo-rg/providers/Microsoft.Kubernetes/connectedClusters/flux-demo-arc/providers/Microsoft.KubernetesConfiguration/fluxConfigurations/cluster-config",
  "kustomizations": {
    "apps": {
      "dependsOn": [
        "infra"
      ],
      "force": false,
      "name": "apps",
      "path": "./apps/staging",
      "prune": true,
      "retryIntervalInSeconds": null,
      "syncIntervalInSeconds": 600,
      "timeoutInSeconds": 600
    },
    "infra": {
      "dependsOn": null,
      "force": false,
      "name": "infra",
      "path": "./infrastructure",
      "prune": true,
      "retryIntervalInSeconds": null,
      "syncIntervalInSeconds": 600,
      "timeoutInSeconds": 600
    }
  },
  "name": "cluster-config",
  "namespace": "cluster-config",
  "provisioningState": "Succeeded",
  "repositoryPublicKey": "",
  "resourceGroup": "Flux2-Test-RG-EUS",
  "scope": "cluster",
  "sourceKind": "GitRepository",
  "sourceSyncedCommitId": "main/4f1bdad4d0a54b939a5e3d52c51464f67e474fcf",
  "sourceUpdatedAt": "2022-04-06T17:34:03+00:00",
  "statusUpdatedAt": "2022-04-06T17:44:56.417000+00:00",
  "statuses": [
    {
      "appliedBy": null,
      "complianceState": "Compliant",
      "helmReleaseProperties": null,
      "kind": "GitRepository",
      "name": "cluster-config",
      "namespace": "cluster-config",
      "statusConditions": [
        {
          "lastTransitionTime": "2022-04-06T17:33:32+00:00",
          "message": "Fetched revision: main/4f1bdad4d0a54b939a5e3d52c51464f67e474fcf",
          "reason": "GitOperationSucceed",
          "status": "True",
          "type": "Ready"
        }
      ]
    },
    {
      "appliedBy": null,
      "complianceState": "Compliant",
      "helmReleaseProperties": null,
      "kind": "Kustomization",
      "name": "cluster-config-apps",
      "namespace": "cluster-config",
      "statusConditions": [
        {
          "lastTransitionTime": "2022-04-06T17:44:04+00:00",
          "message": "Applied revision: main/4f1bdad4d0a54b939a5e3d52c51464f67e474fcf",
          "reason": "ReconciliationSucceeded",
          "status": "True",
          "type": "Ready"
        }
      ]
    },
    {
      "appliedBy": {
        "name": "cluster-config-apps",
        "namespace": "cluster-config"
      },
      "complianceState": "Compliant",
      "helmReleaseProperties": {
        "failureCount": 0,
        "helmChartRef": {
          "name": "cluster-config-podinfo",
          "namespace": "cluster-config"
        },
        "installFailureCount": 0,
        "lastRevisionApplied": 1,
        "upgradeFailureCount": 0
      },
      "kind": "HelmRelease",
      "name": "podinfo",
      "namespace": "cluster-config",
      "statusConditions": [
        {
          "lastTransitionTime": "2022-04-06T17:33:43+00:00",
          "message": "Release reconciliation succeeded",
          "reason": "ReconciliationSucceeded",
          "status": "True",
          "type": "Ready"
        },
        {
          "lastTransitionTime": "2022-04-06T17:33:43+00:00",
          "message": "Helm install succeeded",
          "reason": "InstallSucceeded",
          "status": "True",
          "type": "Released"
        }
      ]
    },
    {
      "appliedBy": null,
      "complianceState": "Compliant",
      "helmReleaseProperties": null,
      "kind": "Kustomization",
      "name": "cluster-config-infra",
      "namespace": "cluster-config",
      "statusConditions": [
        {
          "lastTransitionTime": "2022-04-06T17:43:33+00:00",
          "message": "Applied revision: main/4f1bdad4d0a54b939a5e3d52c51464f67e474fcf",
          "reason": "ReconciliationSucceeded",
          "status": "True",
          "type": "Ready"
        }
      ]
    },
    {
      "appliedBy": {
        "name": "cluster-config-infra",
        "namespace": "cluster-config"
      },
      "complianceState": "Compliant",
      "helmReleaseProperties": null,
      "kind": "HelmRepository",
      "name": "bitnami",
      "namespace": "cluster-config",
      "statusConditions": [
        {
          "lastTransitionTime": "2022-04-06T17:33:36+00:00",
          "message": "Fetched revision: 46a41610ea410558eb485bcb673fd01c4d1f47b86ad292160b256555b01cce81",
          "reason": "IndexationSucceed",
          "status": "True",
          "type": "Ready"
        }
      ]
    },
    {
      "appliedBy": {
        "name": "cluster-config-infra",
        "namespace": "cluster-config"
      },
      "complianceState": "Compliant",
      "helmReleaseProperties": null,
      "kind": "HelmRepository",
      "name": "podinfo",
      "namespace": "cluster-config",
      "statusConditions": [
        {
          "lastTransitionTime": "2022-04-06T17:33:33+00:00",
          "message": "Fetched revision: 421665ba04fab9b275b9830947417b2cebf67764eee46d568c94cf2a95a6341d",
          "reason": "IndexationSucceed",
          "status": "True",
          "type": "Ready"
        }
      ]
    },
    {
      "appliedBy": {
        "name": "cluster-config-infra",
        "namespace": "cluster-config"
      },
      "complianceState": "Compliant",
      "helmReleaseProperties": {
        "failureCount": 0,
        "helmChartRef": {
          "name": "cluster-config-nginx",
          "namespace": "cluster-config"
        },
        "installFailureCount": 0,
        "lastRevisionApplied": 1,
        "upgradeFailureCount": 0
      },
      "kind": "HelmRelease",
      "name": "nginx",
      "namespace": "cluster-config",
      "statusConditions": [
        {
          "lastTransitionTime": "2022-04-06T17:34:13+00:00",
          "message": "Release reconciliation succeeded",
          "reason": "ReconciliationSucceeded",
          "status": "True",
          "type": "Ready"
        },
        {
          "lastTransitionTime": "2022-04-06T17:34:13+00:00",
          "message": "Helm install succeeded",
          "reason": "InstallSucceeded",
          "status": "True",
          "type": "Released"
        }
      ]
    },
    {
      "appliedBy": {
        "name": "cluster-config-infra",
        "namespace": "cluster-config"
      },
      "complianceState": "Compliant",
      "helmReleaseProperties": {
        "failureCount": 0,
        "helmChartRef": {
          "name": "cluster-config-redis",
          "namespace": "cluster-config"
        },
        "installFailureCount": 0,
        "lastRevisionApplied": 1,
        "upgradeFailureCount": 0
      },
      "kind": "HelmRelease",
      "name": "redis",
      "namespace": "cluster-config",
      "statusConditions": [
        {
          "lastTransitionTime": "2022-04-06T17:33:57+00:00",
          "message": "Release reconciliation succeeded",
          "reason": "ReconciliationSucceeded",
          "status": "True",
          "type": "Ready"
        },
        {
          "lastTransitionTime": "2022-04-06T17:33:57+00:00",
          "message": "Helm install succeeded",
          "reason": "InstallSucceeded",
          "status": "True",
          "type": "Released"
        }
      ]
    },
    {
      "appliedBy": {
        "name": "cluster-config-infra",
        "namespace": "cluster-config"
      },
      "complianceState": "Compliant",
      "helmReleaseProperties": null,
      "kind": "HelmChart",
      "name": "test-chart",
      "namespace": "cluster-config",
      "statusConditions": [
        {
          "lastTransitionTime": "2022-04-06T17:33:40+00:00",
          "message": "Pulled 'redis' chart with version '11.3.4'.",
          "reason": "ChartPullSucceeded",
          "status": "True",
          "type": "Ready"
        }
      ]
    }
  ],
  "suspend": false,
  "systemData": {
    "createdAt": "2022-04-06T17:32:44.646629+00:00",
    "createdBy": null,
    "createdByType": null,
    "lastModifiedAt": "2022-04-06T17:32:44.646629+00:00",
    "lastModifiedBy": null,
    "lastModifiedByType": null
  },
  "type": "Microsoft.KubernetesConfiguration/fluxConfigurations"
}

Diese Namespaces wurden erstellt:

  • flux-system: enthält die Flux-Erweiterungscontroller
  • cluster-config: enthält die Flux-Konfigurationsobjekte
  • nginx, podinfo, redis: Namespaces für Workloads, die in Manifesten im Git-Repository beschrieben werden.
kubectl get namespaces

Der flux-system-Namespace enthält die Flux-Erweiterungsobjekte:

  • Azure-Flux-Controller: fluxconfig-agent, fluxconfig-controller
  • OSS-Flux-Controller: source-controller, kustomize-controller, helm-controller, notification-controller

Die Flux-Agent- und -Controllerpods sollten sich in einem ausgeführten Zustand befinden.

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

Der cluster-config-Namespace enthält die Flux-Konfigurationsobjekte.

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

Workloads werden über Manifeste im Git-Repository bereitgestellt.

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

Löschen der Flux-Konfiguration

Sie können die Flux-Konfiguration mit dem folgenden Befehl löschen. Mit dieser Aktion werden sowohl die fluxConfigurations-Ressource in Azure als auch die Flux-Konfigurationsobjekte im Cluster gelöscht. Da die Flux-Konfiguration ursprünglich mit dem Parameter prune=true für die Kustomization erstellt wurde, werden alle Objekte entfernt, die im Cluster basierend auf Manifesten im Git-Repository erstellt wurden, wenn die Flux-Konfiguration entfernt wird.

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

Verwenden Sie für einen AKS-Cluster denselben Befehl, aber ersetzen Sie dabei -t connectedClusters durch -t managedClusters.

Beachten Sie, dass die Flux-Erweiterung durch diese Aktion nicht entfernt wird.

Löschen der Flux-Clustererweiterung

Sie können die Flux-Erweiterung über die Befehlszeilenschnittstelle oder das Portal löschen. Bei der Löschaktion werden sowohl die microsoft.flux-Erweiterungsressource in Azure als auch die Flux-Erweiterungsobjekte im Cluster entfernt.

Wenn die Flux-Erweiterung automatisch erstellt wurde, als die Flux-Konfiguration zum ersten Mal erstellt wurde, lautet der Erweiterungsname flux.

Verwenden Sie für einen Kubernetes-Cluster mit Azure Arc-Unterstützung den folgenden Befehl:

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

Verwenden Sie für einen AKS-Cluster denselben Befehl, aber ersetzen Sie dabei -t connectedClusters durch -t managedClusters.

Steuern, welche Controller mit der Flux-Clustererweiterung bereitgestellt werden

Die Flux-Controller source, helm, kustomize und notification werden standardmäßig installiert. Die Controller image-automation und image-reflector müssen explizit aktiviert werden. Sie können die k8s-extension-CLI verwenden, um diese Auswahl zu treffen:

  • --config source-controller.enabled=<true/false> (Standard: true)
  • --config helm-controller.enabled=<true/false> (Standard: true)
  • --config kustomize-controller.enabled=<true/false> (Standard: true)
  • --config notification-controller.enabled=<true/false> (Standard: true)
  • --config image-automation-controller.enabled=<true/false> (Standard: false)
  • --config image-reflector-controller.enabled=<true/false> (Standard: false)

Hier ist ein Beispiel für das Einschließen der Flux-Controller image-reflector und image-automation. Wenn die Flux-Erweiterung automatisch erstellt wurde, als eine Flux-Konfiguration zum ersten Mal erstellt wurde, lautet der Erweiterungsname 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

Verwenden der Kubelet-Identität als Authentifizierungsmethode für Azure Kubernetes-Cluster

Bei der Arbeit mit Azure Kubernetes-Clustern ist eine der möglichen Authentifizierungsoptionen die Kubelet-Identität. Um dies in Flux zu ermöglichen, fügen Sie bei der Installation der Flux-Erweiterung den Parameter „--config useKubeletIdentity=true“ hinzu.

az k8s-extension create --resource-group <resource-group> --cluster-name <cluster-name> --cluster-type managedClusters --name flux --extension-type microsoft.flux --config useKubeletIdentity=true

Leitfaden zum Onboarding von Red Hat OpenShift

Flux-Controller erfordern eine Sicherheitskontexteinschränkungohne Root-Berechtigung, damit Pods im Cluster ordnungsgemäß bereitgestellt werden können. Diese Einschränkungen müssen dem Cluster vor dem Onboarding der Erweiterung microsoft.flux hinzugefügt werden.

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

Weitere Informationen zum OpenShift-Leitfaden für das Onboarding von Flux finden Sie in der Flux-Dokumentation.

Arbeiten mit Parametern

Eine Beschreibung aller Parameter, die von Flux unterstützt werden, finden Sie in der offiziellen Flux-Dokumentation. In Azure unterstützt Flux noch nicht alle Parameter. Teilen Sie uns mit, wenn ein von Ihnen benötigter Parameter in der Azure-Implementierung fehlt.

Mit dem Parameter -h können Sie eine vollständige Liste aller Parameter anzeigen, die der CLI-Befehl k8s-configuration flux unterstützt:

az k8s-configuration flux -h

Group
    az k8s-configuration flux : Commands to manage Flux v2 Kubernetes configurations.

Subgroups:
    deployed-object : Commands to see deployed objects associated with Flux v2 Kubernetes
                      configurations.
    kustomization   : Commands to manage Kustomizations associated with Flux v2 Kubernetes
                      configurations.

Commands:
    create          : Create a Flux v2 Kubernetes configuration.
    delete          : Delete a Flux v2 Kubernetes configuration.
    list            : List all Flux v2 Kubernetes configurations.
    show            : Show a Flux v2 Kubernetes configuration.
    update          : Update a Flux v2 Kubernetes configuration.

Dies sind die Parameter für den CLI-Befehl k8s-configuration flux create:

az k8s-configuration flux create -h

This command is from the following extension: k8s-configuration

Command
    az k8s-configuration flux create : Create a Flux v2 Kubernetes configuration.

Arguments
    --cluster-name -c   [Required] : Name of the Kubernetes cluster.
    --cluster-type -t   [Required] : Specify Arc connected clusters or AKS managed clusters.
                                     Allowed values: connectedClusters, managedClusters.
    --name -n           [Required] : Name of the flux configuration.
    --resource-group -g [Required] : Name of resource group. You can configure the default group
                                     using `az configure --defaults group=<name>`.
    --url -u            [Required] : URL of the source to reconcile.
    --bucket-insecure              : Communicate with a bucket without TLS.  Allowed values: false,
                                     true.
    --bucket-name                  : Name of the S3 bucket to sync.
    --container-name               : Name of the Azure Blob Storage container to sync
    --interval --sync-interval     : Time between reconciliations of the source on the cluster.
    --kind                         : Source kind to reconcile.  Allowed values: bucket, git, azblob.
                                     Default: git.
    --kustomization -k             : Define kustomizations to sync sources with parameters ['name',
                                     'path', 'depends_on', 'timeout', 'sync_interval',
                                     'retry_interval', 'prune', 'force'].
    --namespace --ns               : Namespace to deploy the configuration.  Default: default.
    --no-wait                      : Do not wait for the long-running operation to finish.
    --scope -s                     : Specify scope of the operator to be 'namespace' or 'cluster'.
                                     Allowed values: cluster, namespace.  Default: cluster.
    --suspend                      : Suspend the reconciliation of the source and kustomizations
                                     associated with this configuration.  Allowed values: false,
                                     true.
    --timeout                      : Maximum time to reconcile the source before timing out.

Auth Arguments
    --local-auth-ref --local-ref   : Local reference to a kubernetes secret in the configuration
                                     namespace to use for communication to the source.

Bucket Auth Arguments
    --bucket-access-key            : Access Key ID used to authenticate with the bucket.
    --bucket-secret-key            : Secret Key used to authenticate with the bucket.

Git Auth Arguments
    --https-ca-cert                : Base64-encoded HTTPS CA certificate for TLS communication with
                                     private repository sync.
    --https-ca-cert-file           : File path to HTTPS CA certificate file for TLS communication
                                     with private repository sync.
    --https-key                    : HTTPS token/password for private repository sync.
    --https-user                   : HTTPS username for private repository sync.
    --known-hosts                  : Base64-encoded known_hosts data containing public SSH keys
                                     required to access private Git instances.
    --known-hosts-file             : File path to known_hosts contents containing public SSH keys
                                     required to access private Git instances.
    --ssh-private-key              : Base64-encoded private ssh key for private repository sync.
    --ssh-private-key-file         : File path to private ssh key for private repository sync.

Git Repo Ref Arguments
    --branch                       : Branch within the git source to reconcile with the cluster.
    --commit                       : Commit within the git source to reconcile with the cluster.
    --semver                       : Semver range within the git source to reconcile with the
                                     cluster.
    --tag                          : Tag within the git source to reconcile with the cluster.

Global Arguments
    --debug                        : Increase logging verbosity to show all debug logs.
    --help -h                      : Show this help message and exit.
    --only-show-errors             : Only show errors, suppressing warnings.
    --output -o                    : Output format.  Allowed values: json, jsonc, none, table, tsv,
                                     yaml, yamlc.  Default: json.
    --query                        : JMESPath query string. See http://jmespath.org/ for more
                                     information and examples.
    --subscription                 : Name or ID of subscription. You can configure the default
                                     subscription using `az account set -s NAME_OR_ID`.
    --verbose                      : Increase logging verbosity. Use --debug for full debug logs.
    
Azure Blob Storage Account Auth Arguments
    --sp_client_id                 : The client ID for authenticating a service principal with Azure Blob, required for this authentication method
    --sp_tenant_id                 : The tenant ID for authenticating a service principal with Azure Blob, required for this authentication method
    --sp_client_secret             : The client secret for authenticating a service principal with Azure Blob
    --sp_client_cert               : The Base64 encoded client certificate for authenticating a service principal with Azure Blob
    --sp_client_cert_password      : The password for the client certificate used to authenticate a service principal with Azure Blob
    --sp_client_cert_send_chain    : Specifies whether to include x5c header in client claims when acquiring a token to enable subject name / issuer based authentication for the client certificate
    --account_key                  : The Azure Blob Shared Key for authentication
    --sas_token                    : The Azure Blob SAS Token for authentication
    --mi_client_id                 : The client ID of the managed identity for authentication with Azure Blob

Examples
    Create a Flux v2 Kubernetes configuration
        az k8s-configuration flux create --resource-group my-resource-group \
        --cluster-name mycluster --cluster-type connectedClusters \
        --name myconfig --scope cluster --namespace my-namespace \
        --kind git --url https://github.com/Azure/arc-k8s-demo \
        --branch main --kustomization name=my-kustomization

    Create a Kubernetes v2 Flux Configuration with Bucket Source Kind
        az k8s-configuration flux create --resource-group my-resource-group \
        --cluster-name mycluster --cluster-type connectedClusters \
        --name myconfig --scope cluster --namespace my-namespace \
        --kind bucket --url https://bucket-provider.minio.io \
        --bucket-name my-bucket --kustomization name=my-kustomization \
        --bucket-access-key my-access-key --bucket-secret-key my-secret-key
        
    Create a Kubernetes v2 Flux Configuration with Azure Blob Storage Source Kind
        az k8s-configuration flux create --resource-group my-resource-group \
        --cluster-name mycluster --cluster-type connectedClusters \
        --name myconfig --scope cluster --namespace my-namespace \
        --kind azblob --url https://mystorageaccount.blob.core.windows.net \
        --container-name my-container --kustomization name=my-kustomization \
        --account-key my-account-key

Allgemeine Argumente für die Konfiguration

Parameter Format Notizen
--cluster-name -c String Name der Clusterressource in Azure.
--cluster-type -t connectedClusters, managedClusters Verwenden Sie connectedClusters für Kubernetes-Cluster mit Azure Arc-Unterstützung und managedClusters für AKS-Cluster.
--resource-group -g String Name der Azure-Ressourcengruppe mit der Azure Arc- oder AKS-Clusterressource.
--name -n String Name der Flux-Konfiguration in Azure.
--namespace --ns String Name des Namespace zum Bereitstellen der Konfiguration. Standardwert: default.
--scope -s String Berechtigungsbereich für die Operatoren. Mögliche Werte sind cluster (Vollzugriff) oder namespace (eingeschränkter Zugriff). Standardwert: cluster.
--suspend Flag Verwirft alle quell- und kustomize-Abstimmungen, die in dieser Flux-Konfiguration definiert sind. Abstimmungen, die zu diesem Zeitpunkt aktiv sind, werden fortgesetzt.

Allgemeine Quellargumente

Parameter Format Notizen
--kind String Quelltyp für die Abstimmung. Zulässige Werte: bucket, git und azblob. Standardwert: git.
--timeout Golang-Format der Dauer Maximale Zeit zum Abstimmen der Quelle vor dem Timeout. Standardwert: 10m.
--sync-interval --interval Golang-Format der Dauer Zeit zwischen Abstimmungen der Quelle im Cluster. Standardwert: 10m.

Quellreferenzargumente für Git-Repositorys

Parameter Format Notizen
--branch String Branch innerhalb der Git-Quelle für die Synchronisierung mit dem Cluster. Standardwert: master. Neuere Repositorys haben möglicherweise einen Stammbranch namens main. In diesem Fall müssen Sie --branch=main festlegen.
--tag String Tag innerhalb der Git-Quelle für die Synchronisierung mit dem Cluster. Beispiel: --tag=3.2.0.
--semver String Git-Tag semver-Bereich innerhalb der Git-Quelle für die Synchronisierung mit dem Cluster. Beispiel: --semver=">=3.1.0-rc.1 <3.2.0".
--commit String SHA für Git-Commit innerhalb der Git-Quelle für die Synchronisierung mit dem Cluster. Beispiel: --commit=363a6a8fe6a7f13e05d34c163b0ef02a777da20a.

Weitere Informationen finden Sie in der Flux-Dokumentation zu Auscheckstrategien für Git-Repositorys.

Öffentliches Git-Repository

Parameter Format Notizen
--url -u http[s]://server/repo[.git] URL der Git-Repositoryquelle, die mit dem Cluster abgestimmt werden soll.

Privates Git-Repository mit SSH und mit Flux erstellten Schlüsseln

Fügen Sie den mit Flux generierten öffentlichen Schlüssel zum Benutzerkonto in Ihrem Git-Dienstanbieter hinzu.

Parameter Format Notizen
--url -u ssh://benutzer@server/repo[.git] git@ sollte user@ ersetzen, wenn der öffentliche Schlüssel dem Repository und nicht dem Benutzerkonto zugeordnet ist.

Privates Git-Repository mit SSH und benutzerseitig bereitgestellten Schlüsseln

Verwenden Sie Ihren eigenen privaten Schlüssel direkt oder in einer Datei. Der Schlüssel muss im PEM-Format sein und mit einem Zeilenumbruch (\n) enden.

Fügen Sie den zugeordneten öffentlichen Schlüssel zum Benutzerkonto in Ihrem Git-Dienstanbieter hinzu.

Parameter Format Notizen
--url -u ssh://benutzer@server/repo[.git] git@ sollte user@ ersetzen, wenn der öffentliche Schlüssel dem Repository und nicht dem Benutzerkonto zugeordnet ist.
--ssh-private-key Base64-Schlüssel im PEM-Format Geben Sie den Schlüssel direkt an.
--ssh-private-key-file Vollständiger Pfad zur lokalen Datei Stellen Sie den vollständigen Pfad zur lokalen Datei bereit, die den Schlüssel im PEM-Format enthält.

Privater Git-Host mit SSH und benutzerseitig bereitgestellten bekannten Hosts

Der Flux-Operator verwaltet eine Liste allgemeiner Git-Hosts in seiner Datei known_hosts. Flux verwendet diese Informationen, um das Git-Repository zu authentifizieren, bevor die SSH-Verbindung hergestellt wird. Wenn Sie ein ungewöhnliches Git-Repository oder Ihren eigenen Git-Host verwenden, können Sie den Hostschlüssel bereitstellen, damit Flux Ihr Repository identifizieren kann.

Wie private Schlüssel können Sie Ihren known_hosts-Inhalt (bekannte Hosts) direkt oder in einer Datei bereitstellen. Wenn Sie Ihren eigenen Inhalt bereitstellen, verwenden Sie die Spezifikationen des known_hosts-Inhaltformats zusammen mit einem der oben aufgeführten SSH-Schlüsselszenarien.

Parameter Format Notizen
--url -u ssh://benutzer@server/repo[.git] git@ kann user@ ersetzen.
--known-hosts Base64-Zeichenfolge Geben Sie den known_hosts-Inhalt direkt an.
--known-hosts-file Vollständiger Pfad zur lokalen Datei Stellen Sie den known_hosts-Inhalt in einer lokalen Datei bereit.

Privates Git-Repository mit einem HTTPS-Benutzer und -Schlüssel

Parameter Format Notizen
--url -u https://server/repo[.git] HTTPS mit der Basisauthentifizierung
--https-user Rohzeichenfolge HTTPS-Benutzername
--https-key Rohzeichenfolge Persönliches HTTPS-Zugriffstoken oder -Kennwort

Privates Git-Repository mit einem HTTPS-Zertifikat einer Zertifizierungsstelle

Parameter Format Notizen
--url -u https://server/repo[.git] HTTPS mit der Basisauthentifizierung
--https-ca-cert Base64-Zeichenfolge Zertifizierungsstellenzertifikat für die TLS-Kommunikation
--https-ca-cert-file Vollständiger Pfad zur lokalen Datei Geben Sie den Inhalt des Zertifizierungsstellenzertifikats in einer lokalen Datei an.

Bucketquellargumente

Wenn Sie eine bucket-Quelle anstelle einer git-Quelle verwenden, finden Sie hier die bucketspezifischen Befehlsargumente.

Parameter Format Notizen
--url -u URL-Zeichenfolge Die URL für den bucket. Unterstützte Formate: http://, https://.
--bucket-name String Name des zu synchronisierenden bucket.
--bucket-access-key String Zugriffsschlüssel-ID, die für die Authentifizierung bei dem bucket verwendet wird.
--bucket-secret-key String Geheimer Schlüssel, der für die Authentifizierung bei dem bucket verwendet wird.
--bucket-insecure Boolean Kommunikation mit einem bucket ohne TLS. Wenn keine Angabe erfolgt, wird „false“ angenommen, wenn angegeben, wird „true“ angenommen.

Azure Blob Storage-Kontoquellenargumente

Wenn Sie eine azblob-Quelle verwenden, finden Sie hier die blobspezifischen Befehlsargumente.

Parameter Format Notizen
--url -u URL-Zeichenfolge Die URL für den azblob.
--container-name String Name des Azure Blob Storage-Containers für die Synchronisierung
--sp_client_id String Die Client-ID für die Authentifizierung eines Dienstprinzipals mit Azure-Blob, erforderlich für diese Authentifizierungsmethode
--sp_tenant_id String Die Mandanten-ID für die Authentifizierung eines Dienstprinzipals mit Azure-Blob, erforderlich für diese Authentifizierungsmethode
--sp_client_secret String Das Clientgeheimnis für die Authentifizierung eines Dienstprinzipals mit Azure-Blob
--sp_client_cert String Das Base64-codierte Clientzertifikat für die Authentifizierung eines Dienstprinzipals mit Azure-Blob
--sp_client_cert_password String Das Kennwort zum Clientzertifikat für die Authentifizierung eines Dienstprinzipals mit Azure-Blob
--sp_client_cert_send_chain String Gibt an, ob x5c-Header in Clientansprüche beim Abrufen eines Tokens einbezogen werden sollen, um die Authentifizierung anhand des Antragstellernamens/Ausstellers für das Clientzertifikat zu aktivieren
--account_key String Der gemeinsam verwendete Azure Blob-Schlüssel für die Authentifizierung
--sas_token String Das Azure Blob-SAS-Token für die Authentifizierung
--mi_client_id String Die Client-ID der verwalteten Identität für die Authentifizierung mit Azure-Blob

Lokales Geheimnis für die Authentifizierung bei der Quelle

Sie können ein lokales Kubernetes-Geheimnis für die Authentifizierung bei einer git-, bucket- oder azBlob-Quelle verwenden. Das lokale Geheimnis muss alle für die Quelle erforderlichen Authentifizierungsparameter enthalten und im gleichen Namespace wie die Flux-Konfiguration erstellt werden.

Parameter Format Notizen
--local-auth-ref --local-ref String Lokaler Verweis auf ein Kubernetes-Geheimnis im Flux-Konfigurationsnamespace, das für die Authentifizierung bei der Quelle verwendet werden soll.

Für die HTTPS-Authentifizierung erstellen Sie ein Geheimnis mit username und password:

kubectl create ns flux-config
kubectl create secret generic -n flux-config my-custom-secret --from-literal=username=<my-username> --from-literal=password=<my-password-or-key>

Für die SSH-Authentifizierung erstellen Sie ein Geheimnis mit den Feldern identity und known_hosts:

kubectl create ns flux-config
kubectl create secret generic -n flux-config my-custom-secret --from-file=identity=./id_rsa --from-file=known_hosts=./known_hosts

Verwenden Sie in beiden Fällen beim Erstellen der Flux-Konfiguration --local-auth-ref my-custom-secret anstelle der anderen Authentifizierungsparameter:

az k8s-configuration flux create -g <cluster_resource_group> -c <cluster_name> -n <config_name> -t connectedClusters --scope cluster --namespace flux-config -u <git-repo-url> --kustomization name=kustomization1 --local-auth-ref my-custom-secret

Erfahren Sie mehr über die Verwendung eines lokalen Kubernetes-Geheimnisses mit diesen Authentifizierungsmethoden:

Hinweis

Wenn Sie Flux benötigen, um über Ihren Proxy auf die Quelle zuzugreifen, müssen Sie die Azure Arc-Agents mit den Proxyeinstellungen aktualisieren. Informationen finden Sie unter Herstellen einer Verbindung mithilfe eines ausgehenden Proxyservers.

Git-Implementierung

Um verschiedene Repositoryanbieter zu unterstützen, die Git implementieren, kann Flux so konfiguriert werden, dass eine der beiden Git-Bibliotheken go-git oder libgit2 verwendet wird. Ausführliche Informationen dazu finden Sie in der Flux-Dokumentation.

Die GitOps-Implementierung von Flux v2 bestimmt automatisch, welche Bibliothek für öffentliche Cloudrepositorys verwendet werden soll:

  • Für GitHub-, GitLab- und Bitbucket-Repositorys verwendet Flux go-git.
  • Für Azure DevOps und alle anderen Repositorys verwendet Flux libgit2.

Für lokale Repositorys verwendet Flux libgit2.

Kustomization

Mit az k8s-configuration flux create können Sie während der Konfiguration eine oder mehrere Kustomizations erstellen.

Parameter Format Notizen
--kustomization Kein Wert Beginn einer Zeichenfolge von Parametern, die eine Kustomization konfigurieren. Sie können sie mehrmals verwenden, um mehrere Kustomizations zu erstellen.
name String Eindeutiger Name für diese Kustomization.
path String Pfad innerhalb des Git-Repositorys, das mit dem Cluster abgestimmt werden soll. Der Standardwert ist die oberste Ebene des Branchs.
prune Boolean Der Standardwert ist false. Durch die Einstellung prune=true wird sichergestellt, dass die von Flux im Cluster bereitgestellten Objekte bereinigt werden, wenn sie aus dem Repository entfernt oder die Flux-Konfiguration oder Kustomizations gelöscht werden. Die Verwendung von prune=true ist wichtig für Umgebungen, in denen Benutzer*innen keinen Zugriff auf die Cluster haben und Änderungen nur über das Git-Repository vornehmen können.
depends_on String Name einer oder mehrerer Kustomizations (innerhalb dieser Konfiguration), die abgestimmt werden müssen, bevor diese Kustomization abgestimmt werden kann. Beispiel: depends_on=["kustomization1","kustomization2"]. Beachten Sie, dass beim Entfernen einer Kustomization mit abhängigen Kustomizations die abhängigen Kustomizations in den Zustand DependencyNotReady wechseln und die Abstimmung angehalten wird.
timeout Golang-Format der Dauer Standardwert: 10m.
sync_interval Golang-Format der Dauer Standardwert: 10m.
retry_interval Golang-Format der Dauer Standardwert: 10m.
validation String Werte: none, client, server. Standardwert: none. Ausführliche Informationen dazu finden Sie in der Flux-Dokumentation.
force Boolean Standardwert: false. Legen Sie force=true fest, um den kustomize-Controller anzuweisen, Ressourcen neu zu erstellen, wenn beim Patchen aufgrund einer Änderung an einem unveränderlichen Feld ein Fehler auftritt.

Sie können auch az k8s-configuration flux kustomization verwenden, um Kustomizations in einer Flux-Konfiguration zu erstellen, zu aktualisieren, aufzulisten, anzuzeigen und zu löschen:

az k8s-configuration flux kustomization -h

Group
    az k8s-configuration flux kustomization : Commands to manage Kustomizations associated with Flux
    v2 Kubernetes configurations.

Commands:
    create : Create a Kustomization associated with a Flux v2 Kubernetes configuration.
    delete : Delete a Kustomization associated with a Flux v2 Kubernetes configuration.
    list   : List Kustomizations associated with a Flux v2 Kubernetes configuration.
    show   : Show a Kustomization associated with a Flux v2 Kubernetes configuration.
    update : Update a Kustomization associated with a Flux v2 Kubernetes configuration.

Folgende Optionen stehen für das Erstellen von Kustomizations zur Verfügung:

az k8s-configuration flux kustomization create -h

This command is from the following extension: k8s-configuration

Command
    az k8s-configuration flux kustomization create : Create a Kustomization associated with a
    Kubernetes Flux v2 Configuration.

Arguments
    --cluster-name -c          [Required] : Name of the Kubernetes cluster.
    --cluster-type -t          [Required] : Specify Arc connected clusters or AKS managed clusters.
                                            Allowed values: connectedClusters, managedClusters.
    --kustomization-name -k    [Required] : Specify the name of the kustomization to target.
    --name -n                  [Required] : Name of the flux configuration.
    --resource-group -g        [Required] : Name of resource group. You can configure the default
                                            group using `az configure --defaults group=<name>`.
    --dependencies --depends --depends-on : Comma-separated list of kustomization dependencies.
    --force                               : Re-create resources that cannot be updated on the
                                            cluster (i.e. jobs).  Allowed values: false, true.
    --interval --sync-interval            : Time between reconciliations of the kustomization on the
                                            cluster.
    --no-wait                             : Do not wait for the long-running operation to finish.
    --path                                : Specify the path in the source that the kustomization
                                            should apply.
    --prune                               : Garbage collect resources deployed by the kustomization
                                            on the cluster.  Allowed values: false, true.
    --retry-interval                      : Time between reconciliations of the kustomization on the
                                            cluster on failures, defaults to --sync-interval.
    --timeout                             : Maximum time to reconcile the kustomization before
                                            timing out.

Global Arguments
    --debug                               : Increase logging verbosity to show all debug logs.
    --help -h                             : Show this help message and exit.
    --only-show-errors                    : Only show errors, suppressing warnings.
    --output -o                           : Output format.  Allowed values: json, jsonc, none,
                                            table, tsv, yaml, yamlc.  Default: json.
    --query                               : JMESPath query string. See http://jmespath.org/ for more
                                            information and examples.
    --subscription                        : Name or ID of subscription. You can configure the
                                            default subscription using `az account set -s
                                            NAME_OR_ID`.
    --verbose                             : Increase logging verbosity. Use --debug for full debug
                                            logs.

Examples
    Create a Kustomization associated with a Kubernetes v2 Flux Configuration
        az k8s-configuration flux kustomization create --resource-group my-resource-group \
        --cluster-name mycluster --cluster-type connectedClusters --name myconfig \
        --kustomization-name my-kustomization-2 --path ./my/path --prune --force

Verwalten von GitOps-Konfigurationen über das Azure-Portal

Die Azure-Portal ist nützlich für die Verwaltung von GitOps-Konfigurationen und der Flux-Erweiterung in Kubernetes-Clustern mit Azure Arc-Unterstützung oder AKS-Clustern. Im Portal werden alle Flux-Konfigurationen angezeigt, die den einzelnen Clustern zugeordnet sind, und für alle ist ein Drill-In möglich.

Das Portal stellt den allgemeinen Konformitätszustand des Clusters bereit. Die Flux-Objekte, die im Cluster bereitgestellt wurden, werden ebenfalls zusammen mit ihren Installationsparametern, dem Konformitätszustand und allen Fehlern angezeigt.

Sie können über das Portal auch GitOps-Konfigurationen erstellen, aktualisieren und löschen.

Verwalten der Clusterkonfiguration mit dem Flux Kustomize-Controller

Der Flux Kustomize-Controller wird als Teil der Clustererweiterung microsoft.flux installiert. Er ermöglicht die deklarative Verwaltung von Clusterkonfiguration und Anwendungsbereitstellung mithilfe von Kubernetes-Manifesten, die aus einem Git-Repository synchronisiert werden. Diese Kubernetes-Manifeste können eine Datei Kustomize.yaml enthalten, die aber nicht erforderlich ist.

Details zur Verwendung finden Sie in den folgenden Artikeln:

Verwalten von Helm-Chartversionen mit dem Flux Helm-Controller

Der Flux Helm-Controller wird als Teil der Clustererweiterung microsoft.flux installiert. Damit können Sie Helm-Chartversionen deklarativ mit Kubernetes-Manifesten verwalten, die Sie in Ihrem Git-Repository verwalten.

Details zur Verwendung finden Sie in den folgenden Artikeln:

Tipp

Weil Helm Indexdateien auf eine bestimmte Art verarbeitet, fällt die Verarbeitung von Helm-Diagrammen teuer aus und kann einen sehr hohen Speicherbedarf erfordern. Werden Helm-Diagramme parallel abgeglichen, kann es zu Speicherspitzen und zum Fehler „OOMKilled“ kommen, wenn Sie eine große Anzahl von Helm-Diagrammen zu einem bestimmten Zeitpunkt abgleichen. Standardmäßig legt der Quellcodecontroller seinen Speichergrenzwert auf 1 GiB und seine Speicheranforderungen auf 64 MiB fest. Wenn Sie diesen Grenzwert und die Anzahl an Anforderungen aufgrund einer hohen Anzahl großer Helm-Diagrammabgleiche erhöhen müssen, führen Sie den folgenden Befehl nach der Installation der microsoft.flux-Erweiterung aus.

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

Verwenden der GitRepository-Quelle für Helm-Diagramme

Wenn Ihre Helm-Charts in der GitRepository-Quelle gespeichert sind, die Sie als Teil der fluxConfigurations-Ressource konfigurieren, können Sie Ihrer HelmRelease-YAML-Datei wie im folgenden Beispiel gezeigt clusterconfig.azure.com/use-managed-source: "true" hinzufügen, um anzugeben, dass die konfigurierte Quelle als Quelle der Helm-Diagramme verwendet werden soll:

---
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
  name: somename
  namespace: somenamespace
  annotations:
    clusterconfig.azure.com/use-managed-source: "true"
spec:
  ...

Mit dieser Anmerkung wird die bereitgestellte HelmRelease-Instanz mit dem Verweis auf die konfigurierte Quelle gepatcht. Derzeit wird nur die GitRepository-Quelle unterstützt.

Mehrinstanzenfähigkeit

Flux v2 unterstützt Mehrinstanzenfähigkeit in Version 0.26. Diese Funktion wurde in Azure GitOps mit Flux v2 integriert.

[ !HINWEIS] Für die Mehrinstanzenfähigkeit müssen Sie wissen, ob Ihre Manifeste über eine namespaceübergreifende Quellverweise (sourceRef) für HelmRelease, Kustomization, ImagePolicy oder andere Objekte verfügen, oder ob Sie eine niedrigere Kubernetes-Version als 1.20.6verwenden. Treffen Sie folgende vorbereitende Maßnahmen:

  • Führen Sie ein Upgrade auf Kubernetes Version 1.20.6 oder höher durch.
  • Stellen Sie in Ihren Kubernetes-Manifesten sicher, dass alle Quellverweise (sourceRef) für Objekte innerhalb desselben Namespace festgelegt sind, in dem sich auch die GitOps-Konfiguration befindet.
    • Wenn Sie Zeit benötigen, um Ihre Manifeste zu aktualisieren, können Sie die Mehrinstanzenfähigkeit deaktivieren. Sie müssen jedoch weiterhin ein Upgrade Ihrer Kubernetes-Version durchführen.

Aktualisieren von Manifesten für Mehrinstanzenfähigkeit

Angenommen, Sie stellen eine Flux-Konfiguration (fluxConfiguration) in einem Kubernetes-Cluster im Namespace cluster-config mit Clusterbereich bereit. Sie konfigurieren die Quelle für die Synchronisierung des Repositorys https://github.com/fluxcd/flux2-kustomize-helm-example. Dies ist das gleiche Git-Beispielrepository, das im Tutorial weiter oben in diesem Dokument verwendet wurde. Nachdem Flux das Repository synchronisiert hat, werden die in den Manifesten (YAML-Dateien) beschriebenen Ressourcen bereitgestellt. Zwei der Manifeste beschreiben HelmRelease- und HelmRepository-Objekte.

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

Die Flux-Erweiterung stellt standardmäßig fluxConfigurations bereit. Dazu wird die Identität des Dienstkontos flux-applier angenommen, das nur im Namespace cluster-config bereitgestellt wird. Bei Verwendung der oben genannten Manifeste würde HelmRelease bei aktivierter Mehrinstanzenfähigkeit blockiert werden. Das liegt daran, dass sich HelmRelease im Namespace nginx befindet und auf HelmRepository im Namespace flux-system verweist. Darüber hinaus kann der Flux Helm-Controller HelmRelease nicht anwenden, da im nginx-Namespace kein flux-applier-Dienstkonto vorhanden ist.

Der richtige Ansatz zur Verwendung von Mehrinstanzenfähigkeit besteht in der Bereitstellung aller Flux-Objekte im gleichen Namespace, in dem sich auch fluxConfigurations befindet. Dadurch wird das Problem mit dem namespaceübergreifenden Verweis vermieden, und die Flux-Controller können die Berechtigungen zum Anwenden der Objekte erhalten. Für eine GitOps-Konfiguration, die im Namespace cluster-config erstellt wurde, würden sich die oben genannten Manifeste wie folgt ändern:

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

Deaktivieren der Mehrinstanzenfähigkeit

Wenn die microsoft.flux-Erweiterung installiert ist, wird die Mehrinstanzenfähigkeit standardmäßig aktiviert, um standardmäßige Sicherheit in Ihren Clustern zu gewährleisten. Wenn Sie die Mehrinstanzenfähigkeit jedoch deaktivieren müssen, können Sie dazu die Erweiterung microsoft.flux in Ihren Clustern mit „--configuration-settings multiTenancy.enforce=false“ erstellen oder aktualisieren.

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>

or

az k8s-extension update --configuration-settings multiTenancy.enforce=false -c CLUSTER_NAME -g RESOURCE_GROUP -n flux -t <managedClusters or connectedClusters>

Migrieren von Flux v1

Wenn Sie Flux v1 bereits in Kubernetes-Clustern mit Azure Arc-Unterstützung oder in AKS-Clustern verwendet haben und in denselben Clustern zu Flux v2 migrieren möchten, müssen Sie zuerst die sourceControlConfigurations für Flux v1 aus den Clustern löschen. Die microsoft.flux-Clustererweiterung wird nicht installiert, wenn der Cluster Flux v1sourceControlConfigurations-Ressourcen enthält.

Verwenden Sie die folgenden Azure CLI-Befehle, um vorhandene sourceControlConfigurations-Ressourcen in einem Cluster zu suchen und dann zu löschen:

az k8s-configuration list --cluster-name <Arc or AKS cluster name> --cluster-type <connectedClusters OR managedClusters> --resource-group <resource group name>
az k8s-configuration delete --name <configuration name> --cluster-name <Arc or AKS cluster name> --cluster-type <connectedClusters OR managedClusters> --resource-group <resource group name>

Sie können auch das Azure-Portal verwenden, um GitOps-Konfigurationen in Kubernetes-Clustern mit Azure Arc-Unterstützung oder AKS-Clustern anzuzeigen und zu löschen.

Allgemeine Informationen zur Migration von Flux v1 zu Flux v2 finden Sie im fluxed-Projekt: Migrieren von Flux v1 zu v2.

Nächste Schritte

Fahren Sie mit dem nächsten Tutorial fort, in dem Sie erfahren, wie Sie die Konfiguration mit Azure Policy im großen Stil anwenden.