Services – ClusterIP
1. Bài toán: ứng dụng nhiều tầng
- Frontend cần gọi backend, backend cần gọi redis và mysql.
- IP Pod luôn thay đổi. Frontend nên gọi pod backend nào?
ClusterIP Service gom các Pod cùng loại sau một IP ảo + một tên cố định. Mỗi tầng chỉ cần biết tên Service của tầng sau.
💡
ClusterIP là loại mặc định, và chỉ gọi được từ bên trong cluster. Khoảng 80–90% Service trong thực tế là loại này.
2. File YAML
apiVersion: v1
kind: Service
metadata:
name: back-end
spec:
type: ClusterIP # có thể bỏ, mặc định là ClusterIP
selector:
app: myapp
type: back-end # khớp label Pod backend
ports:
- port: 80 # Pod khác gọi back-end:80
targetPort: 80 # port container backend
kubectl create -f service-definition.yml
kubectl get svc
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10d
# back-end ClusterIP 10.104.12.33 <none> 80/TCP 3s
- Service
kubernetesở namespacedefaultluôn có sẵn – nó trỏ tới kube-apiserver.
3. Ai chọn Pod?
Khi frontend gọi back-end:80:
- CoreDNS đổi
back-end→10.104.12.33. - Gói tin đi ra khỏi Pod frontend, gặp iptables trên chính node của frontend (do kube-proxy viết sẵn).
- iptables chọn ngẫu nhiên một Pod backend và DNAT sang IP đó.
- Calico đưa gói tin tới node chứa Pod backend.
Hiểu đúng
Không có "máy chủ Service" nào ở giữa. Việc chọn Pod diễn ra ngay trên node người gửi, bởi luật iptables mà kube-proxy viết.
4. Luôn gọi bằng tên
| Gọi bằng | Ổn định? |
|---|---|
IP Pod 10.244.1.7 | ❌ Đổi khi Pod chết |
ClusterIP 10.104.12.33 | ⚠️ Đổi nếu xóa và tạo lại Service |
Tên back-end | ✅ Luôn ổn định |
5. Lab: ứng dụng 3 tầng
kubectl create deployment backend --image=nginx --replicas=2
kubectl expose deployment backend --port=8080 --target-port=80 # Service port 8080 → container 80
kubectl run tester --image=busybox --rm -it --restart=Never -- \
wget -qO- http://backend:8080
kubectl get endpoints backend
- Service lắng nghe 8080, container nginx lắng nghe 80 → minh họa
port≠targetPort.