Skip to content

Działanie ClusterIP

Najlepszym sposobem na udostępnianie komunikacji między Deployment'ami, Pod'ami powinna odbywać się z użyciem ClusterIP. Service tego rodzaju tworzony jest tylko wewnątrz klastra, nie jest wystawiany na zewnątrz klastra.

Przy tworzeniu ClusterIP tworzony jest jeden konkretny adres IP, który rozrzuca na wiele Pod'ów przypisanych do tego serwisu. Dzięki czemu, przykładowo, backend może komunikować się z frontendem.

Struktura ClusterIP

services-clusterip_structure

Tworzony jest wirtualny adres IP wewnątrz klastra, żeby umożliwić dostęp do usług wewnątrz klastra dla innych zasobów, np. połączenie backendu z frontendem.

Dzięki ClusterIP jest dostęp do zasobów wewnątrz klastra, czyli pomiędzy jednymi zasobami wewnątrz klastra, do innych.

Przy łączeniu Pod dobierany jest losowo, raz jeden, raz drugi, przy okazji nie udostępniając nic po za klaster. Wystawiany jest Service z konkretnym adresem IP.

Najlepsze rozwiązanie dla łączenia frontend <-> backend w obrębie jednego klastra Kubernetes.

ClusterIP w manifeście

Wystawiamy Service z wykorzystaniem spec.selector, aby zebrać jakie Pody mają być wystawione. targetPort to port na którym działa aplikacja uruchomiona na Podach, zaś port jest to port na którym wystawiamy już bezpośrednio Service.

apiVersion: v1
kind: Service
metadata:
    name: <service_name>

spec:
    type: ClusterIP
    ports:
        - targetPort: <pod_port>
          port: <service_exposed_port>
    selector:
        <label_key>: <label_value>
  • spec.ports.targetPort - port na którym działa jakaś usługa na Pod'ach
  • spec.ports.port - port na którym porcie Service jest udostępniony
  • spec.selector - sekcja do utożsamiania Service z danym Pod'em lub grupą Pod'ów, dodajemy tutaj labele

Sprawdzenie które pody zostały przypisane

Aby sprawdzić, który Pod został przypisany do Service możemy:

  1. Wyświetlić szczegóły Service, sprawdzić pole Endpoints
kubectl describe service <service_name>

przykład:

╰─$ k describe svc frontend
Name:                     frontend
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 app=nginx,type=frontend
Type:                     ClusterIP
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.97.1.199
IPs:                      10.97.1.199
Port:                     <unset>  8080/TCP
TargetPort:               80/TCP
Endpoints:                10.244.0.3:80
Session Affinity:         None
Internal Traffic Policy:  Cluster
Events:                   <none>
  1. Sprawdzamy adres Pod'a (lub wielu):
kubectl get pods -o wide

przykład:

╰─$ k get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE     IP           NODE       NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          5m44s   10.244.0.3   minikube   <none>           <none>