Chuyển tới nội dung chính

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 ở namespace default luôn có sẵn – nó trỏ tới kube-apiserver.

3. Ai chọn Pod?​

Khi frontend gọi back-end:80:

  1. CoreDNS đổi back-end → 10.104.12.33.
  2. 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).
  3. iptables chọn ngẫu nhiên một Pod backend và DNAT sang IP đó.
  4. 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.