Sobes.tech
Middle

Jak możemy uzyskać dostęp do kontenera Kubernetes, w którym uruchomiona jest aplikacja, z sieci zewnętrznej?

sobes.tech AI

Odpowiedź od AI

Istnieje kilka głównych sposobów uzyskania dostępu do kontenera Kubernetes z sieci zewnętrznej:

  1. Usługa typu LoadBalancer:

    • Dostawcy chmury (AWS, GCP, Azure) tworzą zewnętrzny balansujący obciążenie, który kieruje ruch do podów Twojej aplikacji.
    • Przydzielany jest zewnętrzny adres IP.
    • Najprostszy sposób w środowisku chmurowym.
  2. Usługa typu NodePort:

    • Otwiera port na każdym węźle klastra.
    • Ten port przekierowuje ruch do usługi Twojej aplikacji.
    • Dostęp odbywa się przez IP dowolnego węzła i numer NodePort.
    • Mniej skalowalny i bezpieczny niż LoadBalancer.
  3. Usługa typu ClusterIP wraz z Ingress:

    • ClusterIP - usługa dostępna tylko wewnątrz klastra.
    • Ingress - obiekt API zarządzający zewnętrznym dostępem do usług w klastrze.
    • Kontroler Ingress (np. Nginx Ingress Controller, Traefik) nasłuchuje na zewnętrzny ruch i kieruje go do odpowiedniej usługi ClusterIP.
    • Umożliwia centralne zarządzanie routowaniem, SSL termination, load balancing.
    • Elastyczne i skalowalne podejście.
  4. Usługa typu ExternalName:

    • Tworzy alias dla zewnętrznej domeny. Nie zapewnia bezpośredniego dostępu do kontenera przez tę usługę, ale pozwala na użycie nazwy DNS w klastrze do odwołania się do zasobu zewnętrznego. Nie nadaje się do bezpośredniego dostępu do kontenera z zewnątrz.
  5. Bezpośredni dostęp do NodePort/HostPort na Pod:

    • Można określić hostPort w specyfikacji poda, aby otworzyć port na węźle, na którym uruchomiony jest pod. Zdecydowanie odradzane w środowiskach produkcyjnych ze względu na niską zarządzalność i potencjalne konflikty portów.
    • Podobnie, nodePort można określić w usłudze typu NodePort.

Przykłady konfiguracji:

  • Service typu 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
    
  • Service typu 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 # opcjonalnie, Kubernetes przypisze, jeśli nie określono
      type: NodePort
    
  • Ingress (dla usługi ClusterIP):

    // service-clusterip.yaml (założono, że już istnieje)
    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
    

Wybór metody zależy od wymagań dotyczących skalowalności, bezpieczeństwa, środowiska wdrożeniowego (chmura lub on-premise) oraz potrzeby centralnego zarządzania dostępem. Ingress jest preferowanym rozwiązaniem dla systemów produkcyjnych.