

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Semplifica la distribuzione di applicazioni multi-tenant Amazon EKS utilizzando Flux
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux"></a>

*Nadeem Rahaman, Aditya Ambati, Aniket Dekate e Shrikant Patil, Amazon Web Services*

## Riepilogo
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-summary"></a>

Molte aziende che offrono prodotti e servizi sono settori regolamentati dai dati, tenuti a mantenere le barriere relative ai dati tra le loro funzioni aziendali interne. Questo modello descrive come utilizzare la funzionalità multi-tenancy di Amazon Elastic Kubernetes Service (Amazon EKS) per creare una piattaforma dati che consenta l'isolamento logico e fisico tra tenant o utenti che condividono un singolo cluster Amazon EKS. Il modello fornisce l'isolamento attraverso i seguenti approcci:
+ Isolamento dello spazio dei nomi Kubernetes
+ Controllo degli accessi basato sui ruoli (RBAC)
+ Policy di rete
+ Quote delle risorse
+ AWS Identity and Access Management ruoli (IAM) per gli account di servizio (IRSA)

Inoltre, questa soluzione utilizza Flux per mantenere immutabile la configurazione del tenant durante la distribuzione delle applicazioni. È possibile distribuire le applicazioni tenant specificando il repository tenant che contiene il file Flux nella configurazione. `kustomization.yaml`

Questo modello implementa quanto segue:
+ Un AWS CodeCommit repository, AWS CodeBuild progetti e una AWS CodePipeline pipeline, creati distribuendo manualmente gli script Terraform.
+ Componenti di rete e di calcolo necessari per ospitare i tenant. Questi vengono creati tramite CodePipeline e CodeBuild utilizzando Terraform.
+ Namespace dei tenant, politiche di rete e quote di risorse, configurati tramite un grafico Helm.
+ Applicazioni che appartengono a tenant diversi, distribuite utilizzando Flux.

Ti consigliamo di pianificare e creare attentamente la tua architettura per la multi-tenancy in base ai tuoi requisiti unici e alle tue considerazioni di sicurezza. Questo modello fornisce un punto di partenza per l'implementazione.

## Prerequisiti e limitazioni
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-prereqs"></a>

**Prerequisiti**
+ Un attivo Account AWS
+ AWS Command Line Interface [(AWS CLI) versione 2.11.4 o successiva, [installata](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) e configurata](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)
+ [Terraform](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) versione 0.12 o successiva installata sul computer locale
+ [Terraform AWS Provider](https://registry.terraform.io/providers/hashicorp/aws/latest) versione 3.0.0 o successiva
+ [Kubernetes Provider versione 2.10 o successiva](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs)
+ [Helm Provider versione 2.8.0](https://registry.terraform.io/providers/hashicorp/helm/latest/docs) o successiva
+ [Kubectl](https://registry.terraform.io/providers/gavinbunney/kubectl/latest/docs) Provider versione 1.14 o successiva

**Limitazioni**
+ **Dipendenza dalle distribuzioni manuali di Terraform:** la configurazione iniziale del flusso di lavoro, inclusa la creazione di CodeCommit repository, CodeBuild progetti e pipeline, si basa sulle implementazioni manuali di Terraform. CodePipeline Ciò introduce una potenziale limitazione in termini di automazione e scalabilità, poiché richiede un intervento manuale per le modifiche all'infrastruttura.
+ **CodeCommit dipendenza dal repository:** il flusso di lavoro si basa sui CodeCommit repository come soluzione di gestione del codice sorgente ed è strettamente associato a. Servizi AWS

## Architecture
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-architecture"></a>

**Architetture di destinazione**

Questo modello implementa tre moduli per creare la pipeline, la rete e l'infrastruttura di calcolo per una piattaforma dati, come illustrato nei diagrammi seguenti.

*Architettura della pipeline:*

![Infrastruttura di pipeline per l'architettura multi-tenant di Amazon EKS](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/images/pattern-img/97b700a7-74b6-4f9d-b53a-76de42409a8e/images/76a4a23d-4275-427a-ae36-51c9a3803128.png)


*Architettura di rete:*

![Infrastruttura di rete per l'architettura multi-tenant di Amazon EKS](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/images/pattern-img/97b700a7-74b6-4f9d-b53a-76de42409a8e/images/e542249a-19a3-4c99-b6f5-fdf80fee4edf.png)


*Architettura di calcolo:*

![Infrastruttura di elaborazione per l'architettura multi-tenant di Amazon EKS](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/images/pattern-img/97b700a7-74b6-4f9d-b53a-76de42409a8e/images/91bd1ca8-17f0-433c-8600-4c8e6c474e31.png)


## Tools (Strumenti)
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-tools"></a>

**Servizi AWS**
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html)è un servizio di compilazione completamente gestito che ti aiuta a compilare codice sorgente, eseguire test unitari e produrre artefatti pronti per la distribuzione.
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html)è un servizio di controllo delle versioni che consente di archiviare e gestire in modo privato gli archivi Git, senza dover gestire il proprio sistema di controllo del codice sorgente.
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html)ti aiuta a modellare e configurare rapidamente le diverse fasi di una versione del software e ad automatizzare i passaggi necessari per rilasciare continuamente le modifiche al software.
+ [Amazon Elastic Kubernetes Service (Amazon EKS) ti aiuta a eseguire Kubernetes](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) su AWS Kubernetes senza dover installare o gestire il tuo piano di controllo o i tuoi nodi Kubernetes.
+ [AWS Transit Gateway](https://docs.aws.amazon.com/vpc/latest/tgw/what-is-transit-gateway.html)è un hub centrale che collega cloud privati virtuali () e reti locali. VPCs
+ [Amazon Virtual Private Cloud (Amazon VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) ti aiuta a lanciare AWS risorse in una rete virtuale che hai definito. Questa rete virtuale è simile a una comune rete da gestire all'interno del proprio data center, ma con i vantaggi dell'infrastruttura scalabile di AWS.

**Altri strumenti**
+ Le [politiche di rete Cilium supportano le politiche di rete](https://cilium.io/use-cases/network-policy/#:~:text=Cilium%20implements%20Kubernetes%20Network%20Policies,%2C%20Kafka%2C%20gRPC%2C%20etc.) Kubernetes L3 e L4. Possono essere estesi con policy L7 per fornire sicurezza a livello di API per HTTP, Kafka e gRPC e altri protocolli simili.
+ [Flux](https://fluxcd.io/) è uno strumento di distribuzione continua (CD) basato su Git che automatizza le implementazioni delle applicazioni su Kubernetes.
+ [Helm](https://helm.sh/docs/) è un gestore di pacchetti open source per Kubernetes che ti aiuta a installare e gestire le applicazioni sul tuo cluster Kubernetes.
+ [Terraform](https://www.terraform.io/) è uno strumento di infrastruttura come codice (IaC) HashiCorp che ti aiuta a creare e gestire risorse cloud e locali.

**Archivio di codici**

Il codice per questo pattern è disponibile nel repository GitHub [EKS Multi-Tenancy Terraform](https://github.com/aws-samples/aws-eks-multitenancy-deployment) Solution.

## Best practice
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-best-practices"></a>

Per le linee guida e le migliori pratiche per l'utilizzo di questa implementazione, consulta quanto segue:
+ [Best practice per la multi-tenancy di Amazon EKS](https://aws.github.io/aws-eks-best-practices/security/docs/multitenancy/)
+ [Documentazione Flux](https://fluxcd.io/flux/get-started/)

## Epiche
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-epics"></a>

### Crea pipeline per le fasi di costruzione, test e distribuzione di Terraform
<a name="create-pipelines-for-terraform-build-test-and-deploy-stages"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Clona il repository del progetto. | Clona il repository GitHub [EKS Multi-Tenancy Terraform Solution](https://github.com/aws-samples/aws-eks-multitenancy-deployment) eseguendo il seguente comando in una finestra di terminale:<pre>git clone https://github.com/aws-samples/aws-eks-multitenancy-deployment.git</pre> | AWS DevOps | 
| Avvia il bucket Terraform S3 e Amazon DynamoDB. | 1. Nella `bootstrap` cartella, apri il `bootstrap.sh` file e aggiorna i valori delle variabili per il nome del bucket S3, il nome della tabella DynamoDB e: Regione AWS<pre>S3_BUCKET_NAME="<S3_BUCKET_NAME>" <br />DYNAMODB_TABLE_NAME="<DYNAMODB_NAME>" <br />REGION="<AWS_REGION>"</pre><br />2. Eseguire lo script `bootstrap.sh`. [Lo script richiede il AWS CLI, che hai installato come parte dei prerequisiti.](#simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-prereqs)<pre>cd bootstrap<br />./bootstrap.sh</pre> | AWS DevOps | 
| Aggiorna i `locals.tf` file `run.sh` and. | 1. Una volta completato correttamente il processo di bootstrap, copia il bucket S3 e il nome della tabella DynamoDB dalla sezione dello script: `variables` `bootstrap.sh`<pre># Variables<br />S3_BUCKET_NAME="<S3_BUCKET_NAME>"<br />DYNAMODB_TABLE_NAME="<DYNAMODB_NAME"</pre><br />2. Incolla questi valori nello `run.sh` script, che si trova nella directory principale del progetto:<pre>BACKEND_BUCKET_ID="<SAME_NAME_AS_S3_BUCKET_NAME>"<br />DYNAMODB_ID="<SAME_NAME_AS_DYNAMODB_NAME>"</pre><br />3. Carica il codice del progetto in un CodeCommit repository. Puoi creare automaticamente questo repository tramite Terraform impostando la seguente variabile su `true` nel file: `demo/pipeline/locals.tf`<pre>create_new_repo = true</pre><br />4. Aggiorna il `locals.tf` file in base alle tue esigenze per creare risorse di pipeline. | AWS DevOps | 
| Implementa il modulo pipeline. | Per creare risorse di pipeline, esegui manualmente i seguenti comandi Terraform. Non esiste alcuna orchestrazione per l'esecuzione automatica di questi comandi.<pre>./run.sh -m pipeline -e demo -r <AWS_REGION> -t init<br />./run.sh -m pipeline -e demo -r <AWS_REGION> -t plan<br />./run.sh -m pipeline -e demo -r <AWS_REGION> -t apply</pre> | AWS DevOps | 

### Crea l'infrastruttura di rete
<a name="create-the-network-infrastructure"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Avvia la pipeline. | 1. Nella `templates` cartella, assicuratevi che per i `buildspec` file sia impostata la seguente variabile su: `network`<pre>TF_MODULE_TO_BUILD: "network"</pre><br />2. Sulla [CodePipeline console](https://console.aws.amazon.com/codesuite/codepipeline/home), nella pagina dei dettagli della pipeline, avvia la pipeline scegliendo **Release** change.Dopo questa prima esecuzione, la pipeline si avvia automaticamente ogni volta che esegui una modifica al ramo principale del CodeCommit repository.<br />[La pipeline include le seguenti fasi:](https://docs.aws.amazon.com/codepipeline/latest/userguide/concepts.html#concepts-stages)+ `validate`inizializza Terraform, esegue le scansioni di sicurezza Terraform utilizzando gli strumenti [checkov e [tfsec](https://github.com/aquasecurity/tfsec) e carica](https://www.checkov.io/) i report di scansione nel bucket S3.<br />+ `plan `mostra il piano Terraform e carica il piano nel bucket S3.<br />+ `apply`applica l'output del piano Terraform dal bucket S3 e crea risorse. AWS <br />+ `destroy`rimuove le AWS risorse create durante la fase. `apply` Per abilitare questa fase opzionale, imposta la seguente variabile su `true` nel `demo/pipeline/locals.tf` file:<pre>enable_destroy_stage = true</pre> | AWS DevOps | 
| Convalida le risorse create tramite il modulo di rete. | Verifica che le seguenti AWS risorse siano state create dopo la corretta implementazione della pipeline:+ Un VPC in uscita con tre sottoreti pubbliche e tre private, gateway Internet e gateway NAT.<br />+ Un VPC Amazon EKS con tre sottoreti private.<br />+ Tenant 1 e Tenant 2 VPCs con tre sottoreti private ciascuna.<br />+ Un gateway di transito con tutti gli allegati VPC e i percorsi verso ogni sottorete privata.<br />+ Un gateway di transito statico per il VPC di uscita Amazon EKS con un blocco CIDR di destinazione di. `0.0.0.0/0` Ciò è necessario per consentire a tutti di accedere VPCs a Internet in uscita tramite il VPC di uscita di Amazon EKS. | AWS DevOps | 

### Crea l'infrastruttura di elaborazione
<a name="create-the-compute-infrastructure"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Aggiorna `locals.tf` per consentire l'accesso del CodeBuild progetto al VPC. | Per distribuire i componenti aggiuntivi per il cluster privato Amazon EKS, il CodeBuild progetto deve essere collegato al VPC Amazon EKS.1. Nella `demo/pipeline` cartella, apri il `locals.tf` file e imposta la `vpc_enabled` variabile su. `true`<br />2. Esegui lo `run.sh` script per applicare le modifiche al modulo pipeline:<pre>demo/pipeline/locals.tf<br />./run.sh -m pipeline -env demo -region <AWS_REGION> -tfcmd init<br />./run.sh -m pipeline -env demo -region <AWS_REGION> -tfcmd plan <br />./run.sh -m pipeline -env demo -region <AWS_REGION> -tfcmd apply</pre> | AWS DevOps | 
| Aggiorna i `buildspec` file per creare il modulo di calcolo. | Nella `templates` cartella, in tutti i file `buildspec` YAML, imposta il valore della `TF_MODULE_TO_BUILD` variabile da a: `network` `compute`<pre>TF_MODULE_TO_BUILD: "compute"</pre> | AWS DevOps | 
| Aggiorna il `values` file per il diagramma Helm di gestione dei tenant. | 1. Aprire il `values.yaml` file nella seguente posizione:<pre>cd cfg-terraform/demo/compute/cfg-tenant-mgmt</pre><br />Il file ha il seguente aspetto:<pre>---<br />global:<br />  clusterRoles:<br />    operator: platform-tenant<br />    flux: flux-tenant-applier<br />  flux:<br />    tenantCloneBaseUrl: ${TEANT_BASE_URL}<br />    repoSecret: ${TENANT_REPO_SECRET}<br />tenants:<br />  tenant-1:<br />    quotas:<br />      limits:<br />        cpu: 1<br />        memory: 1Gi<br />    flux:<br />      path: overlays/tenant-1<br />  tenant-2:<br />    quotas:<br />      limits:<br />        cpu: 1<br />        memory: 2Gi<br />    flux:<br />      path: overlays/tenant-2</pre><br />2. Nelle `tenants` sezioni `global` e, aggiorna la configurazione in base alle tue esigenze:`tenantCloneBaseUrl`— Percorso del repository che ospita il codice per tutti i tenant (utilizziamo lo stesso repository Git per tutti i tenant)`repoSecret`— Segreto Kubernetes che contiene le chiavi SSH e gli host noti per l'autenticazione nel repository Git dei tenant globali`quotas`— Quote di risorse Kubernetes da applicare a ciascun tenant`flux path`— Percorso dei file YAML dell'applicazione tenant nel repository globale dei tenant | AWS DevOps | 
| Convalida le risorse di calcolo. | Dopo aver aggiornato i file nei passaggi precedenti, si CodePipeline avvia automaticamente. Verifica che abbia creato le seguenti AWS risorse per l'infrastruttura di elaborazione:+ Cluster Amazon EKS con endpoint privato<br />+ Nodi di lavoro Amazon EKS<br />+ Componenti aggiuntivi Amazon EKS: segreti esterni `aws-loadbalancer-controller` e `metrics-server`<br />+ GitOps modulo, diagramma Flux Helm, diagramma Cilium Helm e tabella Helm per la gestione degli inquilini | AWS DevOps | 

### Controlla la gestione dei tenant e altre risorse
<a name="check-tenant-management-and-other-resources"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Convalida le risorse di gestione dei tenant in Kubernetes. | Esegui i seguenti comandi per verificare che le risorse di gestione dei tenant siano state create correttamente con l'aiuto di Helm.1. I namespace dei tenant sono stati creati, come specificato in: `values.yaml`<pre>kubectl get ns -A</pre><br />2. Le quote vengono assegnate a ogni spazio dei nomi dei tenant, come specificato in: `values.yaml`<pre>kubectl get quota --namespace=<tenant_namespace></pre><br />3. I dettagli delle quote sono corretti per ogni spazio dei nomi dei tenant:<pre>kubectl describe quota cpu-memory-resource-quota-limit -n <tenant_namespace></pre><br />4. Le politiche di rete Cilium sono state applicate a ogni spazio dei nomi dei tenant:<pre>kubectl get CiliumNetworkPolicy -A</pre> | AWS DevOps | 
| Verifica le distribuzioni delle applicazioni tenant. | Esegui i seguenti comandi per verificare che le applicazioni tenant siano state distribuite.1. Flux è in grado di connettersi al CodeCommit repository specificato nel modulo: GitOps <pre>kubectl get gitrepositories -A</pre><br />2. Il controller di personalizzazione Flux ha distribuito i file YAML nel repository: CodeCommit <pre>kubectl get kustomizations -A</pre><br />3. Tutte le risorse dell'applicazione vengono distribuite nei relativi namespace dei tenant:<pre>kubectl get all -n <tenant_namespace></pre><br />4. È stato creato un ingresso per ogni tenant:<pre>kubectl get ingress -n <tenant_namespace></pre> |  | 

## risoluzione dei problemi
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-troubleshooting"></a>


| Problema | Soluzione | 
| --- | --- | 
| Viene visualizzato un messaggio di errore simile al seguente:<br />`Failed to checkout and determine revision: unable to clone unknown error: You have successfully authenticated over SSH. You can use Git to interact with AWS CodeCommit.` | Segui questi passaggi per risolvere il problema:1. Verifica l'archivio delle applicazioni tenant: un repository vuoto o configurato in modo errato potrebbe causare l'errore. Assicurati che il repository dell'applicazione tenant contenga il codice richiesto.<br />2. Ridistribuisci il `tenant_mgmt` modulo: nel file di configurazione del `tenant_mgmt` modulo, individua il `app` blocco, quindi imposta il parametro su: `deploy` `0`<pre>deploy = 0</pre><br />Dopo aver eseguito il `apply` comando Terraform, modifica nuovamente il valore del `deploy` parametro in: `1`<pre>deploy = 1</pre><br />3. Ricontrolla lo stato: dopo aver eseguito i passaggi precedenti, utilizza il seguente comando per verificare se il problema persiste:<pre> kubectl get gitrepositories -A</pre><br />[Se il problema persiste, valuta la possibilità di approfondire i log di Flux per maggiori dettagli o consulta la guida generale alla risoluzione dei problemi di Flux.](https://fluxcd.io/flux/cheatsheets/troubleshooting/) | 

## Risorse correlate
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-resources"></a>
+ [Progetti Amazon EKS per Terraform](https://github.com/aws-ia/terraform-aws-eks-blueprints)
+ [Guide alle best practice di Amazon EKS, sezione Multi-tenancy](https://aws.github.io/aws-eks-best-practices/security/docs/multitenancy/)
+ [Sito web Flux](https://fluxcd.io/)
+ [Sito web Helm](https://helm.sh/)

## Informazioni aggiuntive
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-additional"></a>

Ecco un esempio di struttura di repository per la distribuzione di applicazioni tenant:

```
applications
sample_tenant_app
├── README.md
├── base
│   ├── configmap.yaml
│   ├── deployment.yaml
│   ├── ingress.yaml
│   ├── kustomization.yaml
│   └── service.yaml
└── overlays
    ├── tenant-1
    │   ├── configmap.yaml
    │   ├── deployment.yaml
    │   └── kustomization.yaml
    └── tenant-2
        ├── configmap.yaml
        └── kustomization.yaml
```