Riprogettare l'applicazione Web AWS EKS per il servizio Azure Kubernetes

Ora che si ha una migliore comprensione delle differenze della piattaforma tra AWS e Azure, si esaminerà l'architettura dell'applicazione Web in AWS e le modifiche necessarie per renderla compatibile con il servizio Azure Kubernetes.

Architettura dell'applicazione Yelb

L'applicazione Web di esempio Yelb è costituita da un componente front-end denominato yelb-ui e da un componente dell'applicazione denominato yelb-appserver.

Diagramma dell'architettura dell'applicazione Web Yelb.

Il yelb-ui fornisce il codice JavaScript al browser. Questo codice viene compilato da un'applicazione Angular . Il yelb-ui componente può includere anche un nginx proxy a seconda del modello di distribuzione. yelb-appserver è un'applicazione Sinatra che interagisce con un server della cache (redis-server) e un database back-end Postgres (yelb-db). Cache Redis archivia il numero di visualizzazioni di pagina, mentre PostgreSQL mantiene i voti. Entrambi i servizi vengono distribuiti in Kubernetes senza usare alcun servizio gestito per l'archiviazione dei dati in AWS o Azure.

L'applicazione Yelb originale è autonoma e non si basa su servizi esterni, quindi è possibile eseguirne la migrazione da AWS ad Azure senza modifiche al codice. In Azure è possibile usare Redis gestito di Azure e Database di Azure per PostgreSQL come sostituzioni per i servizi Cache Redis e PostgreSQL distribuiti su AKS.

L'applicazione Yelb di esempio consente agli utenti di votare un set di alternative (ristoranti) e aggiorna dinamicamente i grafici a torta in base al numero di voti ricevuti. L'applicazione tiene inoltre traccia del numero di visualizzazioni pagina e visualizza il nome host dell'istanza yelb-appserver che gestisce la richiesta API al momento di un voto o di un aggiornamento della pagina. Questa funzionalità consente di demore l'applicazione in modo indipendente o collaborativo.

Screenshot dell'interfaccia del servizio Yelb.

Architettura in AWS

Per proteggere le applicazioni Web e le API da exploit Web comuni, AWS offre AWS Web Application Firewall (WAF) e AWS Firewall Manager.

Eseguire il mapping dei servizi AWS ai servizi di Azure

Per ricreare il carico di lavoro AWS in Azure con modifiche minime, usare un equivalente di Azure per ogni servizio AWS. La tabella seguente riepiloga i mapping dei servizi:

Mapping dei servizi Servizio AWS Servizio di Azure
Firewall di accesso Web AWS Web Application Firewall (WAF) Web application firewall di Azure (WAF)
Bilanciamento del carico dell'applicazione Application Load Balancer (ALB) Gateway applicazione di AzureGateway applicazione per container
Rete per la distribuzione di contenuti Amazon CloudFront Azure Front Door (AFD)
Orchestrazione Elastic Kubernetes Service (EKS) Servizio Azure Kubernetes (AKS)
Segreti di vault AWS Key Management Service (KMS) Azure Key Vault
Registro dei container Amazon Elastic Container Registry (ECR) Registro container di Azure
Domain Name System (DNS) Amazon Route 53 Azure DNS
Caching Amazon ElastiCache Redis gestito da Azure
NoSQL Amazon DynamoDB Database di Azure per PostgreSQL

Per un confronto completo tra i servizi di Azure e AWS, vedere Confronto tra aws e servizi di Azure.

Architettura in Azure

In questa soluzione l'applicazione Yelb viene distribuita in un cluster del servizio Azure Kubernetes ed è esposta tramite un controller di ingresso come il controller di ingresso NGINX. Il servizio controller in ingresso viene esposto tramite un load balancer interno (o privato). Per altre informazioni su come usare un servizio di bilanciamento del carico interno per limitare l'accesso alle applicazioni nel servizio Azure Kubernetes, vedere Usare un servizio di bilanciamento del carico interno con il servizio Azure Kubernetes.

Questo esempio supporta l'installazione di un controller di ingresso NGINX gestito con il componente aggiuntivo di routing dell'applicazione o un controller di ingresso NGINX non gestito usando il grafico Helm. Il componente aggiuntivo di routing dell'applicazione con il controller di ingresso NGINX offre le funzionalità seguenti:

Per altre configurazioni, vedere gli articoli seguenti:

L'applicazione Yelb è protetta con una risorsa del Application Gateway di Azure distribuita in una subnet dedicata all'interno della stessa rete virtuale del cluster AKS o in una rete virtuale con peering. È possibile proteggere l'accesso all'applicazione Yelb usando Web application firewall (WAF) di Azure, che offre una protezione centralizzata delle applicazioni Web da exploit e vulnerabilità comuni.

Progettazione dell'architettura della soluzione

Il diagramma seguente illustra l'architettura consigliata in Azure:

Diagramma della soluzione basata su Gateway Applicazione WAFv2 e sul controller di ingresso NGINX.

L'architettura della soluzione è costituita dai seguenti elementi:

  1. Il gateway applicativo gestisce la terminazione TLS e comunica con l'applicazione di back-end attraverso HTTPS.
  2. Il listener del gateway applicazione usa un certificato SSL ottenuto da Azure Key Vault.
  3. La politica WAF di Azure associata al listener esegue regole OWASP e regole personalizzate contro le richieste in ingresso e blocca attacchi dannosi.
  4. Le impostazioni HTTP del back-end del gateway dell'applicazione richiamano l'applicazione Yelb tramite HTTPS sulla porta 443.
  5. Il pool back-end del gateway applicazione e il probe di integrità chiamano il controller NGINX in ingresso tramite il load balancer interno di AKS utilizzando HTTPS.
  6. Il controller di ingresso NGINX utilizza il bilanciatore del carico interno di AKS.
  7. Il cluster AKS è configurato con il provider di Azure Key Vault per il componente aggiuntivo del driver CSI dell'archivio segreti per recuperare segreti, certificati e chiavi da Azure Key Vault tramite un volume CSI.
  8. Da Azure Key Vault, SecretProviderClass recupera lo stesso certificato utilizzato dall'Application Gateway.
  9. Un oggetto ingress Kubernetes utilizza il controller di ingressi NGINX per esporre l'applicazione tramite HTTPS attraverso il bilanciamento del carico interno di AKS.
  10. Il servizio Yelb è di tipo ClusterIP ed è esposto tramite il controller di ingresso NGINX.

Per istruzioni complete sulla distribuzione dell'applicazione Yelb nel servizio Azure Kubernetes usando questa architettura, vedere l'esempio complementare.

Soluzioni alternative

Azure offre diverse opzioni per distribuire un'applicazione Web in un cluster del servizio Azure Kubernetes e proteggerla con un web application firewall:

Il Application Gateway Ingress Controller (AGIC) è un'applicazione Kubernetes, quindi è possibile sfruttare il Application Gateway nativo di Azure come bilanciatore di carico L7 per esporre il software cloud a Internet per i carichi di lavoro del Azure Kubernetes Service (AKS). AGIC monitora il cluster Kubernetes su cui è ospitato e aggiorna continuamente un gateway applicazioni in modo che i servizi selezionati vengano esposti su Internet.

Diagramma della soluzione basata sul controller dell'ingresso dell'Azure Application Gateway.

Il controller in ingresso viene eseguito nel proprio pod nel cluster AKS. AGIC monitora un sottoinsieme delle risorse Kubernetes per le modifiche, converte lo stato del cluster in una configurazione specifica del gateway applicativo e lo applica ad Azure Resource Manager (ARM). Per altre informazioni, vedere Che cos'è il controller Ingress di Application Gateway?.

La tabella seguente illustra i vantaggi e gli svantaggi dell'Application Gateway Ingress Controller (AGIC):

Vantaggi Svantaggi
* Integrazione nativa: AGIC offre l'integrazione nativa con i servizi di Azure, in particolare con Azure Application Gateway, che consente un routing semplice ed efficiente del traffico ai servizi in esecuzione su AKS.
* Distribuzioni semplificate: la distribuzione di AGIC come componente aggiuntivo del servizio Azure Kubernetes è semplice e semplice rispetto ad altri metodi. Consente una configurazione rapida e semplice di un gateway applicativo e di un cluster AKS con AGIC abilitato.
* Servizio completamente gestito: AGIC come componente aggiuntivo è un servizio completamente gestito, offrendo vantaggi come gli aggiornamenti automatici e l'aumento del supporto di Microsoft. Garantisce che il controller di ingresso rimanga up-to-date e aggiunga un ulteriore livello di supporto.
* Approccio cloud singolo: AGIC viene adottato principalmente dai clienti che adottano un approccio a cloud singolo. Potrebbe non essere la scelta migliore se è necessaria un'architettura multicloud in cui la distribuzione in piattaforme cloud diverse è un requisito. In questo caso, si consiglia di usare un controller di ingresso cloud-agnostico, ad esempio NGINX, Traefik o HAProxy, per evitare problemi di vendor lock-in.

Per ulteriori informazioni, vedi le seguenti risorse: