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:
-
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.
-
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.
-
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.
-
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.
-
Bezpośredni dostęp do NodePort/HostPort na Pod:
- Można określić
hostPortw 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,
nodePortmożna określić w usłudze typu NodePort.
- Można określić
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.