Distribuzioni di applicazioni con GitOps (Flux v2) per il servizio Azure Kubernetes e Kubernetes abilitato per Azure Arc
Azure offre una funzionalità di distribuzione automatica delle applicazioni usando GitOps che funziona con il servizio Azure Kubernetes e i cluster Kubernetes abilitati per Azure Arc. I vantaggi principali dell'adozione di GitOps per la distribuzione di applicazioni nei cluster Kubernetes includono:
- Visibilità continua sullo stato delle applicazioni in esecuzione nei cluster.
- Separazione dei compiti tra i team di sviluppo di applicazioni e i team dell'infrastruttura. I team delle applicazioni possono non avere esperienza con le distribuzioni Kubernetes. I team di progettazione della piattaforma creano in genere un modello self-service per i team delle applicazioni, consentendo loro di eseguire distribuzioni con maggiore attendibilità.
- Possibilità di ricreare i cluster con lo stesso stato desiderato in caso di arresto anomalo o in caso di aumento del numero di istanze.
Con GitOps si dichiara lo stato desiderato dei cluster Kubernetes nei file nei repository Git. I repository Git possono contenere i file seguenti:
- Manifesti in formato YAMLche descrivono le risorse Kubernetes (ad esempio spazi dei nomi, segreti, distribuzioni e altri)
- Grafici Helm per la distribuzione di applicazioni
- File Kustomize per descrivere le modifiche specifiche dell'ambiente
Poiché questi file vengono archiviati in un repository Git, le versioni vengono eseguite e le modifiche tra le versioni vengono facilmente rilevate. I controller Kubernetes vengono eseguiti nei cluster e riconciliano continuamente lo stato del cluster con lo stato desiderato dichiarato nel repository Git. Questi operatori estraggono i file dai repository Git e applicano lo stato desiderato ai cluster. Inoltre cli operatori assicurano continuamente che il cluster rimanga nello stato desiderato.
GitOps in Kubernetes o nel servizio Azure Kubernetes abilitato per Azure Arc usa Flux, un diffuso set di strumenti open source. Flux offre supporto per origini file comuni (repository Git e Helm, bucket, Archiviazione BLOB di Azure) e tipi di modello (YAML, Helm e Kustomize). Tra le altre funzionalità Flux supporta anche multi-tenancy e la gestione delle dipendenze della distribuzione.
Flux viene distribuito direttamente nel cluster e il piano di controllo di ogni cluster è separato logicamente. Ciò rende la scalabilità ottimale a centinaia e migliaia di cluster. Flux consente distribuzioni di applicazioni GitOps pure e basate sul pull. Non è necessario alcun accesso ai cluster dal repository di origine o da qualsiasi altro cluster.
Estensione del cluster Flux
GitOps è abilitato in un cluster Kubernetes o servizio Azure Kubernetes abilitato per Azure Arc come una risorsa di Microsoft.KubernetesConfiguration/extensions/microsoft.flux
estensione del cluster . L'estensione microsoft.flux
deve essere installata nel cluster prima che possano essere creati uno o più fluxConfigurations
. L'estensione viene installata automaticamente quando si crea il primo Microsoft.KubernetesConfiguration/fluxConfigurations
in un cluster oppure è possibile installarla manualmente usando il portale, l'interfaccia della riga di comando di Azure (az k8s-extension create --extensionType=microsoft.flux
), il modello di Resource Manager o l'API REST.
Controller
Per impostazione predefinita l'estensione microsoft.flux
installa i controller Flux (origine, Kustomize, Helm, notifica) e la definizione di risorsa personalizzata (CRD) di FluxConfig, fluxconfig-agent
e fluxconfig-controller
. Facoltativamente è anche possibile installare Flux image-automation
e i controller image-reflector
che forniscono funzionalità per l'aggiornamento e il recupero di immagini Docker.
Controller di origine Flux: controlla le risorse personalizzate
source.toolkit.fluxcd.io
. Gestisce la sincronizzazione tra repository Git, repository Helm, bucket e Archiviazione BLOB di Azure. Gestisce l'autorizzazione con l'origine per Git privati, repository Helm e account di Archiviazione BLOB di Azure. Visualizza le ultime modifiche apportate all'origine tramite un file di archivio tar.Controller Kustomize di Flux : controlla le risorse personalizzate
kustomization.toolkit.fluxcd.io
. Applica i file YAML non elaborati o kustomize dall'origine al cluster.Controller Helm di Flux: controlla le risorse personalizzate
helm.toolkit.fluxcd.io
. Recupera il grafico associato dall'origine del repository Helm rilevata dal controller di origine. Crea la risorsa personalizzataHelmChart
e applicaHelmRelease
con la versione, il nome e i valori definiti dal cliente specificati al cluster.Controller di notifica di Flux: controlla le risorse personalizzate
notification.toolkit.fluxcd.io
. Riceve notifiche da tutti i controller Flux. Esegue il push delle notifiche agli endpoint webhook definiti dall'utente.Definizioni di risorse personalizzate Flux:
kustomizations.kustomize.toolkit.fluxcd.io
imagepolicies.image.toolkit.fluxcd.io
imagerepositories.image.toolkit.fluxcd.io
imageupdateautomations.image.toolkit.fluxcd.io
alerts.notification.toolkit.fluxcd.io
providers.notification.toolkit.fluxcd.io
receivers.notification.toolkit.fluxcd.io
buckets.source.toolkit.fluxcd.io
gitrepositories.source.toolkit.fluxcd.io
helmcharts.source.toolkit.fluxcd.io
helmrepositories.source.toolkit.fluxcd.io
helmreleases.helm.toolkit.fluxcd.io
fluxconfigs.clusterconfig.azure.com
CRD FluxConfig: definizione di risorsa personalizzata per le risorse personalizzate
fluxconfigs.clusterconfig.azure.com
che definiscono oggetti KubernetesFluxConfig
.fluxconfig-agent
: responsabile del controllo in Azure delle risorsefluxConfigurations
nuove o aggiornate e responsabile dell'avvio della configurazione di Flux associata nel cluster. Inoltre è responsabile del push delle modifiche dello stato di Flux del cluster ad ogni risorsafluxConfigurations
di Azure.fluxconfig-controller
: controlla le risorse personalizzatefluxconfigs.clusterconfig.azure.com
e risponde alle modifiche con una configurazione nuova o aggiornata dei macchinari GitOps nel cluster.
Nota
L'estensione microsoft.flux
viene installata nello spazio dei nomi flux-system
e ha un ambito a livello di cluster. Non è possibile installare questa estensione nell'ambito dello spazio dei nomi.
Configurazioni di Flux
È possibile creare risorse di configurazione di Flux (Microsoft.KubernetesConfiguration/fluxConfigurations
) per abilitare la gestione di GitOps del cluster dai repository Git, dalle origini bucket o dall'archivio BLOB di Azure. Quando si crea una risorsa fluxConfigurations
, i valori forniti per i parametri, ad esempio il repository Git di destinazione, vengono usati per creare e configurare gli oggetti Kubernetes che abilitano il processo GitOps in tale cluster. Per garantire la sicurezza dei dati, i dati delle risorse fluxConfigurations
vengono archiviati come dati crittografati e inattivi in un database di Azure Cosmos DB da parte del servizio Configurazione cluster.
Gli agenti fluxconfig-agent
e fluxconfig-controller
, installati con l'estensione microsoft.flux
, gestiscono il processo di configurazione di GitOps.
fluxconfig-agent
è responsabile delle seguenti attività:
- Esegue il polling del servizio di piano dati di configurazione di Kubernetes per le risorse
fluxConfigurations
nuove o aggiornate. - Crea o aggiorna risorse personalizzate
FluxConfig
nel cluster con le informazioni di configurazione. - Controlla le risorse personalizzate
FluxConfig
ed esegue il push delle modifiche dello stato alle risorse di Azure fluxConfiguration associate.
fluxconfig-controller
è responsabile delle seguenti attività:
- Controlla gli aggiornamenti dello stato delle risorse personalizzate Flux create da
fluxConfigurations
gestito. - Crea una coppia di chiavi privata/pubblica esistente per la durata di
fluxConfigurations
. Questa chiave viene usata per l'autenticazione se l'URL è basato su SSH e se l'utente non fornisce la propria chiave privata durante la creazione della configurazione. - Crea un segreto di autenticazione personalizzato basato sui dati forniti dall'utente private-key/http basic-auth/known-hosts/no-auth.
- Configura il controllo degli accessi in base al ruolo (con provisioning dell'account del servizio, associazione di ruoli creata/assegnata, ruolo creato/assegnato).
- Crea risorse personalizzate
GitRepository
oBucket
e risorse personalizzateKustomization
dalle informazioni nella risorsa personalizzataFluxConfig
.
Ogni risorsa fluxConfigurations
in Azure è associata a una risorsa Flux GitRepository
o a una risorsa personalizzata Bucket
e a una o più risorse personalizzate Kustomization
in un cluster Kubernetes. Quando si crea una risorsa fluxConfigurations
, si specifica l'URL dell'origine (repository Git, bucket o archiviazione BLOB di Azure) e la destinazione di sincronizzazione nell'origine per ogni Kustomization
. È possibile configurare le dipendenze tra le risorse personalizzate Kustomization
per controllare la sequenza della distribuzione. È anche possibile creare più risorse fluxConfigurations
con ambito spazio dei nomi nello stesso cluster per applicazioni e team di app diversi.
Nota
fluxconfig-agent
monitora le risorse fluxConfiguration
nuove o aggiornate in Azure. L'agente richiede la connettività ad Azure per lo stato desiderato di fluxConfiguration
da applicare al cluster. Se l'agente non riesce a connettersi ad Azure, le modifiche nel cluster attendono fino a quando l'agente non riesce a connettersi. Se il cluster è disconnesso da Azure per più di 48 ore, si verifica il timeout della richiesta al cluster e le modifiche dovranno essere riapplicate in Azure.
Gli input dei clienti sensibili, ad esempio la chiave privata e il token/password, vengono archiviati per meno di 48 ore nel servizio di configurazione di Kubernetes. Se si aggiorna uno di questi valori in Azure, assicurarsi che i cluster si connettano ad Azure entro 48 ore.
È possibile monitorare lo stato e la conformità di Flux nel portale di Azure oppure usare le dashboard per monitorare lo stato, la conformità, l'utilizzo delle risorse e l'attività di riconciliazione. Per altre informazioni, vedere Monitorare lo stato di GitOps (Flux v2) e l'attività.
Supporto versione
Sono supportate la versione più recente dell'estensione (microsoft.flux
) Flux v2 e le due versioni precedenti (N-2). In genere è consigliabile usare la versione più recente dell'estensione. A partire da microsoft.flux
versione 1.7.0 i cluster basati su ARM64 sono supportati.
Nota
Se si usa Flux v1, è consigliabile eseguire la migrazione a Flux v2 il prima possibile.
Il supporto per le risorse di configurazione cluster basate su Flux v1 create prima del 1° gennaio 2024 terminerà il 24 maggio 2025. A partire dal 1° gennaio 2024, non sarà possibile creare nuove risorse di configurazione del cluster basate su Flux v1.
GitOps con collegamento privato
Se è stato aggiunto il supporto per il collegamento privato a un cluster Kubernetes abilitato per Azure Arc, l'estensione microsoft.flux
funziona automaticamente con la comunicazione con Azure. Per le connessioni al repository Git, al repository Helm o a qualsiasi altro endpoint necessario per distribuire i manifesti di Kubernetes, è necessario effettuare il provisioning di questi endpoint dietro il firewall o elencarli nel firewall in modo che il controller di origine Flux possa raggiungerli correttamente.
Residenza dei dati
Il servizio Azure GitOps (Gestione della configurazione di Azure Kubernetes) archivia/elabora i dati dei clienti. Per impostazione predefinita i dati dei clienti vengono replicati nell'area abbinata. Per le aree Singapore, Asia orientale e Brasile meridionale tutti i dati dei clienti vengono archiviati ed elaborati nell'area.
Applicare le configurazioni Flux su larga scala
Poiché Azure Resource Manager gestisce le configurazioni, è possibile automatizzare la creazione della stessa configurazione in tutte le risorse del servizio Azure Kubernetes e di Kubernetes abilitate per Azure Arc usando Criteri di Azure all'interno dell'ambito di una sottoscrizione o di un gruppo di risorse. Questa tutela su larga scala garantisce che specifiche configurazioni vengano applicate in modo coerente tra interi gruppi di cluster.
Per altre informazioni, vedere Distribuire le applicazioni in modo coerente su larga scala usando configurazioni di Flux v2 e Criteri di Azure.
Parametri
Per visualizzare tutti i parametri supportati da Flux v2 in Azure, vedere la documentazione az k8s-configuration
. L'implementazione di Azure attualmente non supporta tutti i parametri supportati da Flux.
Per informazioni sui parametri disponibili e su come usarli, vedere Parametri supportati di GitOps (Flux v2).
Multi-tenancy
Flux v2 supporta la multi-tenancy a partire dalla versione 0.26. Questa funzionalità è integrata in Flux v2 in Azure.
Nota
Per la funzionalità multi-tenancy è necessario che si sappia se i manifesti contengono un sourceRef tra gli spazi dei nomi per HelmRelease, Kustomization, ImagePolicy o altri oggetti oppure se si usa una versione di Kubernetes inferiore alla 1.20.6. Come prepararsi:
- Eseguire l'aggiornamento a Kubernetes versione 1.20.6 o successiva.
- Nei manifesti Kubernetes assicurarsi che tutti
sourceRef
siano a oggetti all'interno dello stesso spazio dei nomi della configurazione di GitOps.- Se è necessario tempo per aggiornare i manifesti, è possibile rifiutare esplicitamente la multi-tenancy. Tuttavia è comunque necessario aggiornare la versione di Kubernetes.
Aggiornare i manifesti per la multi-tenancy
Si supponga di distribuire un fluxConfiguration
in uno dei cluster Kubernetes nello spazio dei nomi cluster-config
con ambito cluster. Configurare l'origine per sincronizzare il repository https://github.com/fluxcd/flux2-kustomize-helm-example
. Questo è lo stesso repository Git di esempio usato nell'esercitazione per distribuire applicazioni con GitOps con Flux v2.
Flux, dopo che sincronizza il repository, distribuisce le risorse descritte nei manifesti (file YAML). Due dei manifesti descrivono gli oggetti HelmRelease
e HelmRepository
.
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
name: nginx
namespace: nginx
spec:
releaseName: nginx-ingress-controller
chart:
spec:
chart: nginx-ingress-controller
sourceRef:
kind: HelmRepository
name: bitnami
namespace: flux-system
version: "5.6.14"
interval: 1h0m0s
install:
remediation:
retries: 3
# Default values
# https://github.com/bitnami/charts/blob/master/bitnami/nginx-ingress-controller/values.yaml
values:
service:
type: NodePort
apiVersion: source.toolkit.fluxcd.io/v1beta1
kind: HelmRepository
metadata:
name: bitnami
namespace: flux-system
spec:
interval: 30m
url: https://charts.bitnami.com/bitnami
Per impostazione predefinita l'estensione Flux distribuisce fluxConfigurations
rappresentando l'account del servizio flux-applier
distribuito solo nello spazio dei nomi cluster-config
. Usando i manifesti precedenti, quando è abilitata la multi-tenancy, l'oggetto HelmRelease
viene bloccato. Ciò è dovuto al fatto che HelmRelease
si trova nello spazio dei nomi nginx
, ma fa riferimento a HelmRepository nello spazio dei nomi flux-system
. Inoltre, helm-controller
di Flux non può applicare HelmRelease
perché non esiste alcun account del servizioflux-applier
nello spazio dei nomi nginx
.
L'approccio corretto per usare la multi-tenancy consiste nel distribuire tutti gli oggetti Flux nello stesso spazio dei nomi di fluxConfigurations
. Questo approccio evita il problema di referenza degli spazi dei nomi e consente ai controller Flux di ottenere le autorizzazioni per applicare gli oggetti. Pertanto per una configurazione GitOps creata nello spazio dei nomi cluster-config
questi manifesti di esempio cambiano nel modo seguente:
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
Rifiutare esplicitamente la multi-tenancy
Quando l'estensione microsoft.flux
è installata, la multi-tenancy è abilitata per impostazione predefinita. Se è necessario disabilitare la multi-tenancy, è possibile rifiutare esplicitamente la creazione o l'aggiornamento dell'estensione microsoft.flux
nei cluster con --configuration-settings multiTenancy.enforce=false
, come illustrato in questi comandi di esempio:
az k8s-extension create --extension-type microsoft.flux --configuration-settings multiTenancy.enforce=false -c CLUSTER_NAME -g RESOURCE_GROUP -n flux -t <managedClusters or connectedClusters>
az k8s-extension update --configuration-settings multiTenancy.enforce=false -c CLUSTER_NAME -g RESOURCE_GROUP -n flux -t <managedClusters or connectedClusters>
Eseguire la migrazione da Flux v1
Se si usa ancora Flux v1, è consigliabile eseguire la migrazione a Flux v2 il prima possibile.
Per eseguire la migrazione all'uso di Flux v2 negli stessi cluster in cui si usa Flux v1, prima è necessario eliminare tutti sourceControlConfigurations
di Flux v1 dai cluster. Poiché Flux v2 ha un'architettura fondamentalmente diversa, l'estensione del cluster microsoft.flux
non verrà installata se sono presenti risorse sourceControlConfigurations
Flux v1 in un cluster. Il processo di rimozione delle configurazioni di Flux v1 e della distribuzione delle configurazioni di Flux v2 non dovrebbe richiedere più di 30 minuti.
La rimozione di sourceControlConfigurations
Flux v1 non arresta le applicazioni in esecuzione nei cluster. Tuttavia quando la configurazione di Flux v1 viene rimossa e l'estensione Flux v2 non è ancora completamente distribuita:
- Se sono presenti nuove modifiche nei manifesti dell'applicazione archiviati in un repository Git, queste modifiche non vengono estratte durante la migrazione e la versione dell'applicazione distribuita nel cluster non sarà aggiornata.
- Se sono presenti modifiche impreviste nello stato del cluster che si discosta dallo stato desiderato specificato nel repository Git di origine, il cluster non sarà in grado di eseguire la riparazione automatica.
È consigliabile testare lo scenario di migrazione in un ambiente di sviluppo prima di eseguire la migrazione dell'ambiente di produzione.
Visualizzare ed eliminare le configurazioni di Flux v1
Usare questi comandi dell'interfaccia della riga di comando di Azure per trovare ed eliminare sourceControlConfigurations
esistente in un cluster:
az k8s-configuration flux list --cluster-name <cluster name> --cluster-type <connectedClusters or managedClusters> --resource-group <resource group name>
az k8s-configuration flux delete --name <configuration name> --cluster-name <cluster name> --cluster-type <connectedClusters or managedClusters> --resource-group <resource group name>
Inoltre nel portale di Azure è possibile individuare ed eliminare le configurazioni GitOps esistenti di un cluster. A tal proposito passare al cluster in cui è stata creata la configurazione e selezionare GitOps nel riquadro sinistro. Selezionare la configurazione, quindi selezionare Elimina.
Distribuire configurazioni di Flux v2
Usare il portale di Azure o l'interfaccia della riga di comando di Azure per applicare le configurazioni di Flux v2 ai cluster.
Informazioni sul ritiro di Flux v1
Il progetto open source di Flux v1 è stato archiviato e lo sviluppo di funzionalità è stato interrotto a tempo indeterminato.
Flux v2 è stato lanciato come progetto open source e aggiornamento di Flux. Include una nuova architettura e supporta altri casi d'uso di GitOps. Nel maggio 2022 Microsoft ha lanciato una versione di un'estensione usando Flux v2. Da allora i clienti sono stati invitati a passare a Flux v2 entro tre anni, poiché il supporto per l'uso di Flux v1 terminerà nel maggio 2025.
Nuove funzionalità principali introdotte nell'estensione GitOps per Flux v2:
- Flux v1 è un operatore monolitico che esegue tutte le operazioni. Flux v2 separa le funzionalità in controller specializzati (controller di origine, controller Kustomize, controller Helm e controller di notifica).
- Supporta la sincronizzazione con più repository di origine.
- Supporta la multi-tenancy, ad esempio l'applicazione di ogni repository di origine con un proprio set di autorizzazioni.
- Fornisce informazioni operative dettagliate tramite controlli di integrità, eventi e avvisi.
- Supporta i rami Git, l'aggiunta a commit e tag e i seguenti intervalli di tag SemVer.
- Configurazione delle credenziali per risorsa GitRepository: chiave privata SSH, nome utente/password/token HTTP/S e chiavi pubbliche OpenPGP.
Passaggi successivi
- Usare l'esercitazione per informazioni su come abilitare GitOps nel servizio Azure Kubernetes o nei cluster di Kubernetes abilitato per Azure Arc.
- Sono disponibili informazioni sul Flusso di lavoro CI/CD tramite GitOps.