Networking

GKE On-Prem utilizza concetti di networking di Kubernetes come Service e Ingress. In questo documento viene spiegato come configurare immediatamente il networking di GKE On-Prem.

Operazioni dei servizi cluster e modalità Isola

GKE On-Prem utilizza una configurazione Modalità isola in cui i pod possono comunicare direttamente tra loro all'interno di un cluster, ma non sono raggiungibili dall'esterno del cluster. Questa configurazione costituisce un'isola all'interno della rete non collegata alla rete esterna. I cluster utilizzano BGP (tramite il plug-in ICN) di Calico per formare un mesh completo da nodo ai nodi del cluster, consentendo ai pod di raggiungere direttamente altri pod all'interno del cluster.

Tutto il traffico in uscita dal pod verso destinazioni all'esterno del cluster è NAT'd dall'IP del nodo. GKE On-Prem include un bilanciatore del carico L7 con un controller Ingress in base a Envoy che gestisce le regole degli oggetti Ingress per i servizi ClusterIP di cui è stato eseguito il deployment all'interno del cluster. Il controller in entrata è esposto come servizio NodePort nel cluster.

Il servizio NodePort in entrata può essere raggiunto tramite un bilanciatore del carico L3/L4 F5. L'installazione configura un indirizzo IP virtuale (VIP) (con porte 80 e 443) sul bilanciatore del carico. Il VIP indirizza alle porte nel servizio NodePort per il controller Ingress. Ecco come i client esterni possono accedere ai servizi nel cluster.

I cluster utente possono eseguire servizi di tipo LoadBalancer purché un campo loadBalancerIP sia configurato nella specifica del servizio. Nel campo loadBalancerIP, devi fornire il VIP che vuoi utilizzare. Questa configurazione verrà configurata su F5 e rimanda alle NodePorts del Service.

In alternativa all'utilizzo del bilanciatore del carico F5, puoi attivare la modalità di bilanciamento del carico manuale. Se scegli di utilizzare il bilanciamento del carico manuale , non puoi eseguire servizi di tipo LoadBalancer. In alternativa, puoi creare servizi di tipo NodePort e configurare manualmente il bilanciatore del carico in modo da utilizzarli come backend. Inoltre, puoi esporre i Servizi a client esterni utilizzando un oggetto Ingress.

Architettura di networking

Diagramma che descrive l'architettura di GKE On-Prem Figura: networking GKE On-Prem.

Indirizzi IP del nodo
Indirizzi DHCP o assegnati in modo statico per i nodi (alternativi chiamati macchine virtuali o VM). Deve essere instradabile all'interno del data center. Puoi assegnare manualmente IP statici.
Blocco CIDR pod
Blocco CIDR non instradabile per tutti i pod nel cluster. Da questo intervallo, vengono assegnati intervalli minori/24 per nodo. Se hai bisogno di un cluster di nodi N, assicurati che questo blocco sia abbastanza grande da supportare N /24 blocchi.
Blocco CIDR servizi
In modalità Isola, simile al blocco CIDR del pod, viene utilizzato solo all'interno del cluster. Qualsiasi blocco CIDR privato che non si sovrappone ai nodi, VIP o blocco CIDR di pod. Puoi condividere lo stesso blocco tra i cluster. La dimensione del blocco determina il numero di servizi. Sono necessari un IP di servizio per il servizio in entrata stesso e dieci o più IP per i servizi Kubernetes come DNS del cluster e così via.
Servizi VIP
Numero di indirizzi IP instradabili da configurare su F5 per l'accesso L4 quando esporti un servizio. Questi VIP sono gli stessi del valore loadBalancerIP generato che crei i servizi di tipo LoadBalancer.
VIP piano di controllo
Un indirizzo IP instradabile da configurare sul bilanciatore del carico F5 per il server API Kubernetes.
VIP in entrata
Un indirizzo IP instradabile da configurare sul bilanciatore del carico F5 per il traffico in entrata L7 in combinazione con i proxy Envoy in esecuzione su ciascun nodo.

Configurazione di network

Questi parametri vengono acquisiti nel campo network del file di configurazione del cluster.

Di seguito è riportato un esempio di un campo network che specifica la maggior parte dei parametri:

# Example of a network section with static node IPs
network:
  clusterip:
    servicecidr: 10.96.232.0/24
    podcidr: 192.168.0.0/16
  nodeip:
    mode: static
    addressblock:
      hostconfig:
        dns: 8.8.8.8
        tod: 192.138.210.214
      blocks:
        - netmask: 255.255.252.0
          gateway: 10.116.232.0
          ips:
            - ip: 10.116.232.23
              hostname: host1.enterprise.net
            - ip: 10.116.232.65
              hostname: host2.enterprise.net
            - ip: 10.116.232.66
              hostname: host3.enterprise.net
  loadbalancer:
    controlplaneip: 10.115.231.45
    ingressip: 10.115.231.54
    kind: F5BigIP
    f5bigip:
      server: 10.113.24.12
      username: # encoded value
      password: # encoded value
      partition: admin-partition

Il campo network è composto da tre sottocampi, clusterip, nodeip e loadbalancer, che configurano impostazioni di networking diverse per il cluster. Il sottocampo nodeip.blocks è facoltativo; devi specificare questo campo solo se nodeip.mode è impostato su statico.

Se i nodi sono configurati per ricevere IP tramite DHCP, devi configurare il campo network come segue:

# Example of a network section using DHCP for node IPs
network:
  clusterip:
    servicecidr: 10.96.232.0/24
    podcidr: 192.168.0.0/16
  nodeip:
    mode: dhcp
  loadbalancer:
    controlplaneip: 10.115.231.45
    ingressip: 10.115.231.54
    kind: F5BigIP
    f5bigip:
      server: 10.113.24.12
      username: admin
      password: secret
      partition: user-partition

Esempio: accedere a un'applicazione web tramite URL

Supponi di avere un'applicazione web guestbook in esecuzione nel tuo cluster come deployment denominato frontend. Vuoi connetterti all'applicazione utilizzando un URL, www.guestbook.com. Hai bisogno di un modo per mappare l'URL al deployment in esecuzione nel cluster. Puoi farlo utilizzando un oggetto Kubernetes Ingress.

Per iniziare, devi prima creare una voce DNS con carattere jolly per *.guestbook.com che rimandi al VIP Ingress in entrata del cluster:

*.guestbook.com    A   [INGRESS_VIP]

Il passo successivo è creare un servizio per il deployment frontend. L'esecuzione di kubectl expose crea un servizio che raggruppa logicamente i pod di deployment e fornisce loro un indirizzo IP comune all'interno del cluster:

kubectl expose deployment frontend

In questo modo viene creato un servizio di tipo ClusterIP, come segue:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: guestbook
  name: frontend
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: guestbook
  type: ClusterIP

Devi mappare l'URL, www.guestbook.com, al servizio frontend che hai appena creato. L'applicazione dell'oggetto Ingress seguente crea la mappatura:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: frontend
  labels:
    app: guestbook
spec:
  rules:
    - host: www.guestbook.com
      http:
        paths:
          - backend:
              serviceName: frontend   # name of the frontend Service
              servicePort: 80

Ora, visitando il sito www.guestbook.com si apre l'applicazione web nel browser.

Ecco come funziona:

  • Poiché hai creato la voce DNS con carattere jolly, quando visiti l'URL accedi nuovamente al VIP in entrata del cluster.
  • Il cluster cerca l'oggetto Ingress corretto in base al nome host, che in questo caso è www.guestbook.com.
  • Il traffico è inoltrato alle porte di un pod frontend.

Esempio: accedere a un'applicazione web tramite indirizzo IP

Se la tua applicazione non è un'applicazione web o se hai vincoli di rete, potresti voler creare un VIP specifico per il tuo servizio. Puoi farlo utilizzando un servizio Kubernetes di tipo LoadBalancer.

Il servizio riportato di seguito crea un VIP specifico per l'applicazione guestbook:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: guestbook
  name: frontend
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: guestbook
  type: LoadBalancer
  loadBalancerIP: [IP_ADDRESS]

Dopo aver applicato il servizio, puoi visualizzare il VIP nella console F5 e nel menu Pool della console puoi vedere gli indirizzi IP dei nodi. La visita all'indirizzo IP comporterebbe il caricamento dell'applicazione.