Sobes.tech
Middle

Cum putem accesa containerul Kubernetes în care rulează aplicația din rețeaua externă?

sobes.tech AI

Răspuns de la AI

Există mai multe metode principale de a accesa un container Kubernetes dintr-o rețea externă:

  1. Serviciu de tip LoadBalancer:

    • Furnizorii de cloud (AWS, GCP, Azure) creează un echilibrator de încărcare extern care direcționează traficul către pod-urile aplicației tale.
    • Se atribuie o adresă IP externă.
    • Cea mai simplă metodă în mediul cloud.
  2. Serviciu de tip NodePort:

    • Deschide un port pe fiecare nod din cluster.
    • Acest port redirecționează traficul către serviciul aplicației tale.
    • Accesul se face prin IP-ul oricărui nod și numărul NodePort.
    • Mai puțin scalabil și sigur decât LoadBalancer.
  3. Serviciu de tip ClusterIP împreună cu Ingress:

    • ClusterIP - serviciu accesibil doar în interiorul clusterului.
    • Ingress - obiect API care gestionează accesul extern la serviciile din cluster.
    • Controlerul Ingress (de exemplu, Nginx Ingress Controller, Traefik) ascultă traficul extern și îl direcționează către serviciul ClusterIP corespunzător.
    • Permite gestionarea centralizată a rutării, terminării SSL, echilibrării încărcării.
    • Abordare flexibilă și scalabilă.
  4. Serviciu de tip ExternalName:

    • Creează un alias pentru un domeniu extern. Nu oferă acces direct la container prin acest serviciu, dar permite utilizarea unui nume DNS în interiorul clusterului pentru a accesa o resursă externă. Nu este potrivit pentru acces direct la container din exterior.
  5. Acces direct la NodePort/HostPort pe Pod:

    • Se poate specifica hostPort în specificația pod-ului pentru a deschide un port pe nodul pe care rulează pod-ul. Este foarte nerecomandat pentru mediile de producție din cauza gestionării slabe și a potențialelor conflicte de porturi.
    • În mod similar, nodePort poate fi specificat într-un serviciu de tip NodePort.

Exemple de configurații:

  • Serviciu 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
    
  • Serviciu 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 # opțional, Kubernetes va atribui dacă nu este specificat
      type: NodePort
    
  • Ingress (pentru serviciu ClusterIP):

    // service-clusterip.yaml (presupus  există deja)
    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
    

Alegerea metodei depinde de cerințele de scalabilitate, securitate, mediul de implementare (cloud sau on-premise) și necesitatea gestionării centralizate a accesului. Ingress este soluția preferată pentru sistemele de producție.