Ingress per i bilanciatori del carico delle applicazioni esterni


Questa pagina spiega come funziona Ingress per gli Application Load Balancer esterni in Google Kubernetes Engine (GKE). Puoi anche scoprire come configurare e utilizzare Ingress per il bilanciamento del carico esterno.

Per informazioni generali sull'utilizzo del bilanciamento del carico in GKE, consulta Ingress per i bilanciatori del carico delle applicazioni esterni.

Il networking di Google Kubernetes Engine (GKE) si basa su Cloud Load Balancing. Con Cloud Load Balancing, un singolo indirizzo IP anycast consente di determinare il percorso di routing con il costo più basso per il bilanciatore del carico Google Cloud più vicino.

Supporto per le funzionalità di Google Cloud

Puoi utilizzare un BackendConfig per configurare un bilanciatore del carico delle applicazioni esterno in modo da utilizzare funzionalità come:

BackendConfig è una risorsa personalizzata che contiene le informazioni di configurazione per le funzionalità di Google Cloud. Per scoprire di più sulle funzionalità supportate, consulta Configurazione di Ingress.

Supporto di WebSocket

Con i bilanciatori del carico delle applicazioni esterni, il protocollo WebSocket funziona senza alcuna configurazione.

Se intendi utilizzare il protocollo WebSocket, ti consigliamo di utilizzare un valore di timeout superiore ai 30 secondi predefiniti. Per il traffico WebSocket inviato tramite un bilanciatore del carico delle applicazioni esterno Google Cloud, il timeout del servizio di backend viene interpretato come il tempo massimo per cui una connessione WebSocket può rimanere aperta, indipendentemente dal fatto che sia inattiva o meno.

Per impostare il valore del timeout per un servizio di backend configurato tramite Ingress, crea un oggetto BackendConfig e utilizza l'annotazione beta.cloud.google.com/backend-config nel file manifest del servizio.

Per informazioni sulla configurazione, consulta Timeout della risposta del backend.

Indirizzi IP statici per i bilanciatori del carico HTTPS

Quando crei un oggetto Ingress, ottieni un indirizzo IP esterno stabile che i clienti possono utilizzare per accedere ai tuoi servizi e, a loro volta, ai tuoi container in esecuzione. L'indirizzo IP è stabile nel senso che dura per tutta la durata dell'oggetto Ingress. Se elimini l'Ingress e ne crei uno nuovo dallo stesso file manifest, non è garantito che otterrai lo stesso indirizzo IP esterno.

Se vuoi un indirizzo IP permanente che rimanga invariato durante l'eliminazione di Ingress e la creazione di un nuovo Ingress, devi prenotare un indirizzo IP esterno statico globale. Poi, nel manifest di Ingress, includi un'annotazione che indichi il nome del tuo indirizzo IP statico riservato. Se modifichi un Ingress esistente in modo da utilizzare un indirizzo IP statico anziché uno temporaneo, GKE potrebbe modificare l'indirizzo IP del bilanciatore del carico quando ricrea la regola di forwarding del bilanciatore del carico.

Ad esempio, supponiamo che tu abbia prenotato un indirizzo IP esterno statico globale denominato my-static-address. Nel manifest Ingress, includi un'annotazione kubernetes.io/ingress.global-static-ip-name come mostrato di seguito:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: my-static-address

Configurazione di HTTPS (TLS) tra client e bilanciatore del carico

Un bilanciatore del carico HTTP(S) funge da proxy tra i client e l'applicazione. Se vuoi accettare richieste HTTPS dai tuoi client, il bilanciatore del carico deve disporre di un certificato per dimostrare la propria identità ai client. Il bilanciatore del carico deve avere anche una chiave privata per completare l'handshake HTTPS.

Quando il bilanciatore del carico accetta una richiesta HTTPS da un client, il traffico tra il client e il bilanciatore del carico viene criptato utilizzando TLS. Tuttavia, il bilanciatore del carico termina la crittografia TLS e inoltra la richiesta senza crittografia all'applicazione. Per informazioni su come criptare il traffico tra il bilanciatore del carico e l'applicazione, consulta HTTPS tra il bilanciatore del carico e l'applicazione.

Puoi utilizzare certificati SSL gestiti da Google o certificati che gestisci autonomamente. Per ulteriori informazioni sulla creazione di un Ingress che utilizza i certificati gestiti da Google, consulta Utilizzare i certificati SSL gestiti da Google.

Per fornire a un bilanciatore del carico HTTP(S) un certificato e una chiave che hai creato personalmente, crea un oggetto Kubernetes Secret. Il secret contiene il certificato e la chiave. Aggiungi il secret al tls campo del manifest Ingress, come nell'esempio seguente:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress-2
spec:
  tls:
  - secretName: SECRET_NAME
  rules:
  - http:
      paths:
      - path: /*
        pathType: ImplementationSpecific
        backend:
          service:
            name: SERVICE_NAME
            port:
              number: 60000

Questo manifest include i seguenti valori:

  • SECRET_NAME: il nome del secret che hai creato.
  • SERVICE_NAME: il nome del servizio di backend.

Le modifiche ai secret vengono rilevate periodicamente, quindi se modifichi i dati all'interno del secret, saranno necessari al massimo 10 minuti per applicare le modifiche al bilanciatore del carico.

Per ulteriori informazioni, consulta Utilizzare più certificati SSL nel bilanciamento del carico HTTPS con Ingress.

Per proteggere Ingress con crittografia HTTPS per i tuoi cluster GKE, consulta l'esempio di Ingress sicuro.

Disattivazione di HTTP

Se vuoi che tutto il traffico tra il client e il bilanciatore del carico HTTP(S) utilizzi HTTPS, puoi disattivare HTTP includendo l'annotazione kubernetes.io/ingress.allow-http nel manifest di Ingress. Imposta il valore dell'annotazione su "false".

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress-2
  annotations:
    kubernetes.io/ingress.allow-http: "false"
spec:
  tls:
  - secretName: SECRET_NAME
  ...

Questi manifest includono SECRET_NAME, ovvero il nome del secret che hai creato.

Certificati precondivisi per i bilanciatori del carico

In alternativa all'utilizzo dei segreti Kubernetes per fornire i certificati al bilanciatore del carico per l'interruzione HTTP(S), puoi utilizzare i certificati caricati in precedenza nel tuo progetto Google Cloud. Per saperne di più, consulta Utilizzare i certificati precompartiti e Utilizzare più certificati SSL nel bilanciamento del carico HTTPS con Ingress.

HTTPS (TLS) tra il bilanciatore del carico e l'applicazione

Un bilanciatore del carico HTTP(S) funge da proxy tra i client e l'applicazione. I client possono utilizzare HTTP o HTTPS per comunicare con il proxy del bilanciatore del carico. La connessione dal proxy del bilanciatore del carico alla tua applicazione utilizza HTTP per impostazione predefinita. Tuttavia, se la tua applicazione, in esecuzione in un pod GKE, è in grado di ricevere richieste HTTPS, puoi configurare il bilanciatore del carico in modo che utilizzi HTTPS quando inoltra le richieste alla tua applicazione.

Per configurare il protocollo utilizzato tra il bilanciatore del carico e l'applicazione, utilizza l'annotazione cloud.google.com/app-protocols nel file manifest del servizio. Questo manifest del servizio deve includere type: NodePort, a meno che tu non stia utilizzando il bilanciamento del carico nativo del container. Se utilizzi il bilanciamento del carico nativo del container, utilizza type: ClusterIP.

Il seguente manifest del servizio specifica due porte. L'annotazione indica che quando un bilanciatore del carico HTTP(S) ha come target la porta 80 del servizio, deve utilizzare HTTP. Inoltre, quando il bilanciatore del carico ha come target la porta 443 del servizio, deve utilizzare HTTPS.

Il file manifest del servizio deve includere un valore name nell'annotazione della porta. Puoi modificare la porta di servizio solo facendo riferimento al valore name assegnato, non al valore targetPort.

apiVersion: v1
kind: Service
metadata:
  name: my-service-3
  annotations:
    cloud.google.com/app-protocols: '{"my-https-port":"HTTPS","my-http-port":"HTTP"}'
spec:
  type: NodePort
  selector:
    app: metrics
    department: sales
  ports:
  - name: my-https-port
    port: 443
    targetPort: 8443
  - name: my-http-port
    port: 80
    targetPort: 50001

Passaggi successivi