Sobes.tech
Middle

Kako možemo pristupiti Kubernetes kontejneru u kojem se pokreće aplikacija iz spoljašnje mreže?

sobes.tech АИ

Одговор од АИ

Postoji nekoliko osnovnih načina za pristup Kubernetes kontejneru iz spoljašnje mreže:

  1. Servis tipa LoadBalancer:

    • Cloud provajderi (AWS, GCP, Azure) kreiraju eksterni balansator saobraćaja koji usmerava saobraćaj na vaše podove.
    • Dodeljuje se eksterni IP adresa.
    • Najjednostavniji način u cloud okruženju.
  2. Servis tipa NodePort:

    • Otvara port na svakom čvoru u klasteru.
    • Ovaj port usmerava saobraćaj na servis vaše aplikacije.
    • Pristup je putem IP adrese bilo kog čvora i broja NodePort.
    • Manje skalabilno i sigurnije od LoadBalancer.
  3. Servis tipa ClusterIP zajedno sa Ingress:

    • ClusterIP je servis dostupan samo unutar klastera.
    • Ingress je API objekat koji upravlja spoljnim pristupom ka servisima u klasteru.
    • Ingress kontroler (npr. Nginx Ingress Controller, Traefik) sluša spoljašnji saobraćaj i usmerava ga na odgovarajući ClusterIP servis.
    • Omogućava centralizovano upravljanje rutiranjem, SSL terminacijom, balansiranjem opterećenja.
    • Fleksibilan i skalabilan pristup.
  4. Servis tipa ExternalName:

    • Kreira pseudonim za eksternu domenu. Ne pruža direktan pristup kontejneru putem ovog servisa, ali omogućava korišćenje DNS imena unutar klastera za pristup eksternom resursu. Nije pogodno za direktan pristup kontejneru spolja.
  5. Direktan pristup NodePort/HostPort na Pod-u:

    • Možete navesti hostPort u specifikaciji poda, da otvorite port na čvoru gde je pokrenut pod. Ne preporučuje se u produkcionom okruženju zbog niske upravljivosti i potencijalnih konflikata portova.
    • Slično, nodePort možete navesti u tipu servisa NodePort.

Primeri konfiguracija:

  • LoadBalancer servis:

    // 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
    
  • NodePort servis:

    // 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 # opciono, Kubernetes će ga dodeliti ako nije naveden
      type: NodePort
    
  • Ingress (ClusterIP servis):

    // service-clusterip.yaml (već postoji)
    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
    

Izbor metode zavisi od zahteva za skaliranjem, bezbednošću, okruženjem za implementaciju (oblaku ili on-premise) i potrebom za centralizovanim upravljanjem pristupom. Ingress je preferirano rešenje za produkcione sisteme.