Sobes.tech
Middle

Jak můžeme získat přístup ke kontejneru Kubernetes, ve kterém běží aplikace, z vnější sítě?

sobes.tech AI

Odpověď od AI

Existuje několik základních způsobů, jak získat přístup ke kontejneru Kubernetes z vnější sítě:

  1. Služba typu LoadBalancer:

    • Cloudoví poskytovatelé (AWS, GCP, Azure) vytvářejí externí vyvažovač zátěže, který směruje provoz na vaše kontejnery.
    • Přiděluje se externí IP adresa.
    • Nejjednodušší způsob v cloudovém prostředí.
  2. Služba typu NodePort:

    • Otevírá port na každém uzlu clusteru.
    • Tento port směruje provoz na službu vaší aplikace.
    • Přístup je možný přes IP libovolného uzlu a číslo NodePort.
    • Méně škálovatelné a bezpečnější než LoadBalancer.
  3. Služba typu ClusterIP spolu s Ingress:

    • ClusterIP je služba dostupná pouze uvnitř clusteru.
    • Ingress je objekt API, který řídí externí přístup ke službám v clusteru.
    • Ingress kontrolér (například Nginx Ingress Controller, Traefik) poslouchá externí provoz a směruje jej na odpovídající službu ClusterIP.
    • Umožňuje centralizovanou správu směrování, SSL terminaci, vyvažování zátěže.
    • Flexibilní a škálovatelný přístup.
  4. Služba typu ExternalName:

    • Vytváří alias pro externí doménu. Neposkytuje přímý přístup ke kontejneru přes tuto službu, ale umožňuje používat DNS jméno uvnitř clusteru k přístupu k externímu zdroji. Není vhodná pro přímý přístup ke kontejneru zvenčí.
  5. Přímý přístup k NodePort/HostPort na Pod:

    • Můžete specifikovat hostPort v definici podu, čímž otevřete port na uzlu, kde běží pod. Nedoporučuje se v produkčním prostředí kvůli nízké spravovatelnosti a potenciálním konfliktům portů.
    • Podobně lze specifikovat nodePort v typu služby NodePort.

Příklady konfigurace:

  • LoadBalancer služba:

    // 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 služba:

    // 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 # volitelné, Kubernetes jej přiřadí, pokud není uveden
      type: NodePort
    
  • Ingress (service typu ClusterIP):

    // service-clusterip.yaml (již existuje)
    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
    

Volba metody závisí na požadavcích na škálování, bezpečnost, prostředí nasazení (cloud nebo on-premise) a potřebě centralizované správy přístupu. Ingress je preferované řešení pro produkční systémy.