Trong hệ sinh thái Kubernetes, dịch vụ (Service) là thành phần trung tâm đảm nhiệm vai trò định tuyến lưu lượng mạng đến một tập hợp các Pod dựa trên nhãn (label selector). Khác với tài nguyên điều khiển vòng đời Pod như Deployment hay ReplicaSet, Service không quản lý trạng thái hay số lượng bản sao — mà chỉ cung cấp một điểm truy cập ổn định, độc lập với sự thay đổi động của địa chỉ IP Pod.
Phân biệt Service và Deployment
- Deployment chịu trách nhiệm triển khai, giám sát và đảm bảo số lượng Pod mong muốn luôn hoạt động. Nó xử lý việc scale up/down, rolling update, rollback và tự phục hồi khi Pod bị lỗi.
- Service không tham gia vào vòng đời Pod, mà chỉ định nghĩa cách thức kết nối tới chúng — thông qua tên miền DNS nội bộ hoặc biến môi trường — đồng thời cung cấp cơ chế cân bằng tải đơn giản giữa các Pod phù hợp với nhãn đã khai báo.
Cơ chế phát hiện dịch vụ (Service Discovery)
Kubernetes hỗ trợ hai phương thức chính để các Pod tìm thấy nhau:- DNS-based discovery: Khi cụm bật CoreDNS (hoặc kube-dns), mỗi Service sẽ được gán một tên miền dạng
<service-name>.<namespace>.svc.cluster.local. Các Pod trong cùng namespace có thể gọi trực tiếp bằng tên ngắn nhưexample-service. - Environment variable injection: Kubelet tự động tiêm các biến môi trường như
EXAMPLE_SERVICE_SERVICE_HOSTvàEXAMPLE_SERVICE_SERVICE_PORTvào mỗi Pod ngay sau khi Service được tạo — nhưng chỉ áp dụng với các Service tồn tại trước khi Pod khởi động.
Các kiểu Service phổ biến
Thuộc tínhspec.type xác định phạm vi khả dụng của Service:
ClusterIP(mặc định): Chỉ khả dụng bên trong cụm. Kubernetes cấp một địa chỉ IP ảo nội bộ và định tuyến lưu lượng tới các Pod đích.NodePort: Mở một cổng cố định (trong dải 30000–32767) trên mọi node vật lý. Cho phép truy cập từ bên ngoài cụm thông qua<node-ip>:<node-port>.LoadBalancer: Dành riêng cho môi trường cloud (AWS ELB, GCP LB, Alibaba Cloud SLB…). Tự động tạo và cấu hình trình cân bằng tải ngoại vi, ánh xạ tới NodePort hoặc ClusterIP bên trong.
Tạo Service cho ứng dụng mẫu
Giả sử ta đã triển khai ứng dụng web đơn giản với 3 bản sao bằng lệnh:kubectl create deployment demo-app --replicas=3 \
--image=nginx:alpine \
--labels="app=demo" \
--port=80
Sau khi kiểm tra trạng thái:
kubectl get deploy demo-app
kubectl get pods -l app=demo
Ta tạo Service kiểu ClusterIP để truy cập nội bộ:
kubectl expose deployment demo-app \
--name=web-svc \
--type=ClusterIP \
--port=8080 \
--target-port=80
Để kiểm thử từ máy cục bộ, dùng port-forwarding:
kubectl port-forward svc/web-svc 8080:8080
Sau đó mở trình duyệt truy cập http://localhost:8080.
Ví dụ triển khai NodePort bằng YAML
Dưới đây là file manifest mô tả Service mở cổng 30163 trên mọi node, chuyển tiếp tới cổng 80 của container:apiVersion: v1
kind: Service
metadata:
name: public-echo
labels:
tier: frontend
spec:
type: NodePort
selector:
app: echo-pod
ports:
- name: http
port: 8080
targetPort: 80
nodePort: 30163
protocol: TCP
Lưu ý rằng nodePort phải nằm trong khoảng hợp lệ và chưa bị chiếm. Nếu bỏ trống, Kubernetes sẽ tự chọn giá trị ngẫu nhiên từ dải cho phép.