Obiectul Service în Kubernetes (kubectl)

Obiecte Kubernetes (manifeste YAML) apiVersion: v1 / kind: Service

Oferă o adresă IP stabilă, un nume DNS intern și load-balancing către un grup de Pod-uri.

Sintaxă comandă
apiVersion: v1 | kind: Service | kubectl expose deployment/NUME --port=P --target-port=TP

Ce face Obiectul Service

Pod-urile sunt efemere: ori de câte ori un pod este recreat la un deploy sau după o cădere de nod, primește o altă adresă IP. Un obiect Service rezolvă această problemă oferind un IP virtual fix (ClusterIP) și un nume DNS stabil în interiorul clusterului: <nume-service>.<namespace>.svc.cluster.local (sau doar <nume-service> dacă apelantul este în același namespace).

Service-ul își găsește pod-urile prin spec.selector (de exemplu app: api) și trimite trafic doar către pod-urile care au trecut verificarea readinessProbe. Lista IP-urilor active o poți verifica oricând cu kubectl get endpoints NUME sau kubectl get endpointslices.

Există patru tipuri de Service (spec.type): ClusterIP (implicit, vizibil doar din interiorul clusterului), NodePort (deschide un port între 30000–32767 pe fiecare nod), LoadBalancer (cere cloud providerului un load balancer extern cu IP public) și ExternalName (alias CNAME către un nume DNS extern).

Opțiuni și argumente

Opțiune / Parametru Descriere
spec.type ClusterIP (implicit), NodePort, LoadBalancer sau ExternalName.
spec.selector Etichetele pod-urilor către care Service-ul distribuie traficul.
spec.ports[].port Portul pe care ascultă Service-ul în sine (cel apelat de clienți).
spec.ports[].targetPort Portul (număr sau nume, ex. http) pe care ascultă aplicația în container.
spec.ports[].nodePort La NodePort/LoadBalancer: portul deschis pe noduri (30000–32767; ales automat dacă e omis).
spec.clusterIP: None Creează un Headless Service (fără IP virtual; DNS-ul returnează direct IP-urile pod-urilor, folosit la StatefulSet).
kubectl expose deploy/NUME Comandă imperativă care generează sau creează un Service pentru un Deployment existent.

Exemple

Exemplul 1: Manifest YAML pentru un Service intern (ClusterIP)

Orice pod din namespace-ul shop poate apela acum http://api/v1/items (portul 80 al Service-ului este redirecționat către portul 8080 din containere).

apiVersion: v1
kind: Service
metadata:
  name: api
  namespace: shop
spec:
  type: ClusterIP
  selector:
    app: api
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: http

Ieșire în terminal

service/api created

Exemplul 2: Verificarea că Service-ul a găsit pod-urile (Endpoints)

Dacă lista ENDPOINTS este <none>, selectorul din Service nu se potrivește cu etichetele pod-urilor.

kubectl get svc,endpoints api -n shop

Ieșire în terminal

NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/api   ClusterIP   10.96.142.18   <none>        80/TCP    2m

NAME            ENDPOINTS                                         AGE
endpoints/api   10.244.1.14:8080,10.244.1.19:8080,10.244.2.8:8080 2m

Greșeli frecvente

  • Nepotrivirea etichetelor dintre Service.spec.selector și Pod.metadata.labels: Service-ul se creează fără eroare, dar nu răspunde nimeni deoarece ENDPOINTS este gol.
  • Inversarea lui port cu targetPort: port este cel la care te conectezi din alte pod-uri, iar targetPort este portul procesului din container.

Comenzi înrudite

  • Obiectul Deployment: Gestionează aplicații stateless replicabile: menține numărul de pod-uri, le înlocuiește când cad și face rolling updates.
  • Obiectul Ingress: Expune servicii HTTP și HTTPS în afara clusterului, cu rutare după domeniu/cale și terminare TLS.
  • kubectl port-forward: Redirecționează un port local de pe mașina ta către un Pod, Deployment sau Service din cluster.
  • kubectl describe: Afișează detaliile complete ale unei resurse, inclusiv evenimentele recente asociate.