2015-08-20 8 views
14

la mia applicazione Web è in esecuzione come pod Kubernetes dietro un proxy inverso nginx per SSL. Sia il proxy che la mia applicazione utilizzano i servizi di Kubernetes per il bilanciamento del carico (come descritto in here).Come leggere gli indirizzi IP dei client dalle richieste HTTP dietro i servizi di Kubernetes?

Il problema è che tutti i registri delle richieste HTTP mostrano solo gli indirizzi IP del cluster interno invece degli indirizzi dei client HTTP effettivi. C'è un modo per fare in modo che i servizi di Kubernetes passino queste informazioni ai miei server delle app?

risposta

3

Si può uscire Kube-proxy del loop interamente in 2 modi:

  1. Utilizzare un ingresso per configurare il nginx per bilanciare sulla base di IP di origine e di inviare il traffico direttamente al tuo punto finale (https://github.com/kubernetes/contrib/tree/master/ingress/controllers#ingress-controllers)

  2. Distribuire il haproxy serviceloadbalancer (https://github.com/kubernetes/contrib/blob/master/service-loadbalancer/service_loadbalancer.go#L51) e impostare l'annotazione del saldo sul server in modo che utilizzi "origine".

+0

Sembra la migliore opzione per risolvere questo problema in modo Kubernetes :) –

+0

@Prashanth B Abbiamo un caso d'uso simile nella nostra applicazione ma il nostro file conf di nginx è complicato (include il meccanismo di autenticazione complesso e tutti) per usare il controller di ingresso nginx . C'è qualche sviluppo dal post? Un approccio più semplice per ottenere l'IP del client originale nel servizio app (per affinità di sessione). –

2

In questo momento, no.

I servizi utilizzano kube_proxy per distribuire il traffico ai propri backend. Il proxy Kube utilizza iptables per instradare l'IP del servizio a una porta locale in ascolto, quindi apre una nuova connessione a uno dei backend. L'IP interno che vedi è l'IP: porta di kube-proxy in esecuzione su uno dei tuoi nodi.

Un proxy kube solo iptables è in the works. Ciò preserverebbe l'IP sorgente originale.

+0

Grazie per la spiegazione! –

+0

Qualcuno sa se "iptables only kube-proxy" è ora disponibile? – sambehera

2

A partire da Kubernetes 1.1, esiste un proxy kube basato su iptables che risolve questo problema in alcuni casi. È disabilitato per impostazione predefinita; vedi this post per le istruzioni su come abilitarlo. In sintesi, fare:

for node in $(kubectl get nodes -o name); do kubectl annotate $node net.beta.kubernetes.io/proxy-mode=iptables; done 

Nel caso di traffico Pod-a-Pod, con i iptables Kube-proxy ora vedrete la vera fonte-IP al pod di destinazione.

Tuttavia, se il servizio sta inoltrando il traffico dall'esterno del cluster (ad esempio un servizio NodePort, LoadBalancer), è necessario sostituire (SNAT) l'IP di origine. Questo perché stiamo eseguendo DNAT sul traffico in entrata per instradarlo al servizio Pod (potenzialmente su un altro nodo), quindi il DNATing Node deve inserirsi nel percorso di ritorno per poter annullare la risposta.

1

A partire da 1.5, se si sta eseguendo in GCE (per estensione GKE) o AWS, è sufficiente aggiungere un'annotazione al proprio Servizio per rendere operativa la conservazione della fonte HTTP.

... 
kind: Service 
metadata: 
    annotations: 
    service.beta.kubernetes.io/external-traffic: OnlyLocal 
... 

Si espone in sostanza il servizio direttamente tramite nodeports invece di fornire un proxy - esponendo una sonda di salute in ogni nodo, il bilanciamento del carico in grado di determinare quali nodi per instradare il traffico a.

In 1.7, questa configurazione è diventata GA, quindi è possibile impostare "externalTrafficPolicy": "Local" sulla specifica del servizio.

Click here to learn more

Problemi correlati