Sobes.tech
Middle

Come possiamo accedere al contenitore Kubernetes in cui è in esecuzione l'applicazione dalla rete esterna?

sobes.tech AI

Risposta dell'AI

Esistono diversi metodi principali per accedere a un contenitore Kubernetes da una rete esterna:

  1. Servizio di tipo LoadBalancer:

    • I provider cloud (AWS, GCP, Azure) creano un bilanciatore di carico esterno che indirizza il traffico ai pod della tua applicazione.
    • Viene assegnato un indirizzo IP esterno.
    • Il metodo più semplice in un ambiente cloud.
  2. Servizio di tipo NodePort:

    • Apre una porta su ogni nodo del cluster.
    • Questa porta reindirizza il traffico al servizio della tua applicazione.
    • L'accesso avviene tramite l'IP di qualsiasi nodo e il numero di NodePort.
    • Meno scalabile e sicuro rispetto a LoadBalancer.
  3. Servizio di tipo ClusterIP insieme a Ingress:

    • ClusterIP - servizio accessibile solo all'interno del cluster.
    • Ingress - oggetto API che gestisce l'accesso esterno ai servizi nel cluster.
    • Il controller Ingress (ad esempio, Nginx Ingress Controller, Traefik) ascolta il traffico esterno e lo instrada al servizio ClusterIP appropriato.
    • Permette di gestire centralmente il routing, la terminazione SSL, il bilanciamento del carico.
    • Approccio flessibile e scalabile.
  4. Servizio di tipo ExternalName:

    • Crea un alias per un dominio esterno. Non fornisce accesso diretto al contenitore tramite questo servizio, ma permette di usare un nome DNS all'interno del cluster per accedere a una risorsa esterna. Non adatto per accesso diretto al contenitore dall'esterno.
  5. Accesso diretto a NodePort/HostPort su Pod:

    • È possibile specificare hostPort nella specifica del pod per aprire una porta sul nodo in cui è in esecuzione il pod. Fortemente sconsigliato per ambienti di produzione a causa della bassa gestibilità e dei potenziali conflitti di porte.
    • Allo stesso modo, nodePort può essere specificato in un servizio di tipo NodePort.

Esempi di configurazione:

  • Servizio LoadBalancer:

    // service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: my-app-service
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      type: LoadBalancer
    
  • Servizio NodePort:

    // service-nodeport.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: my-app-service-np
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
          nodePort: 30000 # opzionale, Kubernetes assegnerà se non specificato
      type: NodePort
    
  • Ingress (per servizio ClusterIP):

    // service-clusterip.yaml (si presume esista già)
    apiVersion: v1
    kind: Service
    metadata:
      name: my-app-service-ci
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      type: ClusterIP
    
    // ingress.yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-app-ingress
    spec:
      rules:
        - host: myapp.example.com
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: my-app-service-ci
                    port:
                      number: 80
    

La scelta del metodo dipende dai requisiti di scalabilità, sicurezza, ambiente di distribuzione (cloud o on-premise) e dalla necessità di gestione centralizzata dell'accesso. Ingress è la soluzione preferita per i sistemi di produzione.