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șiPod.metadata.labels: Service-ul se creează fără eroare, dar nu răspunde nimeni deoareceENDPOINTSeste gol. - Inversarea lui
portcutargetPort:porteste cel la care te conectezi din alte pod-uri, iartargetPorteste 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.