Lộ trình
Cloud Native Computing FoundationAssociateTuần 4: Tối ưu & vận hànhBài 23 / 30

Ngày 23: Service các loại

Thời lượng: 45 phút
Mục tiêu: 2 nhiệm vụ chính
Tiến độ lộ trình
ckadngày 23
hoàn thành23 / 30 bài
Bối cảnh bài học

Phân biệt Service ClusterIP, NodePort và ExternalName; expose Deployment nhanh nhưng vẫn kiểm tra selector, EndpointSlice, ports, DNS và network scope.

đọc hiểuthực hànhcheckpoint
Bài giảng hôm nay

Học hiểu, rồi mới thực hành

Phân biệt Service ClusterIP, NodePort và ExternalName; expose Deployment nhanh nhưng vẫn kiểm tra selector, EndpointSlice, ports, DNS và network scope.

Bắt đầu đọc bài giảng

Nhiệm vụ bài học hôm nay

  • Ôn lại ClusterIP, NodePort, ExternalName
  • Luyện expose Deployment nhanh bằng kubectl expose
Instructor walkthrough

Bài giảng chi tiết: từ bài toán đến bằng chứng

Scenario xuyên suốt

Service object tồn tại nhưng không route vì selector/targetPort sai; NodePort chỉ mở node path chứ không đảm bảo firewall; ExternalName là DNS alias không tạo proxy endpoint. Bài học đi từ request path đến đúng service type.

01Đọc bài toán

Xác định actor, workload, constraint và trạng thái cuối cần đạt.

02Vẽ luồng / boundary

Chỉ ra request, dependency, identity và failure domain trước khi chọn công cụ.

03Chọn và thực hành

Thay đổi nhỏ nhất trong lab cô lập; command nào cũng phải nói rõ nó kiểm tra điều gì.

04Kiểm chứng / recovery

Đối chiếu trạng thái thực tế, tạo một failure variant và ghi cách hoàn tác.

Cách nối lý thuyết với thực tế
  • ClusterIP cung cấp virtual IP nội bộ; NodePort thêm port trên node và phụ thuộc kube-proxy/firewall/node reachability; ExternalName trả CNAME/DNS behavior, không tạo EndpointSlice backend như selector Service.
  • `kubectl expose` tạo Service từ labels/port defaults nhưng cần inspect selector, port/targetPort, protocol và namespace.
  • EndpointSlice phản ánh backend/conditions; Service có selector đúng nhưng Pod chưa Ready hoặc targetPort sai vẫn không có traffic thành công.
  • NodePort/LoadBalancer/external path có cloud/firewall dependency; test từ đúng network location và tách DNS, dataplane, application listener.

Service theo network scope

  • ClusterIP: virtual IP nội bộ, route tới EndpointSlice.
  • NodePort: thêm node port, phụ thuộc node/kube-proxy/firewall; không tự đảm bảo external access.
  • ExternalName: DNS CNAME alias, không proxy traffic và không tạo backend EndpointSlice như selector Service.

Expose và debug

kubectl expose là skeleton nhanh; inspect selector, port/targetPort, protocol, namespace và readiness. Nếu endpoint rỗng: label/selector/Pod Ready. Nếu endpoint có nhưng timeout/refused: test in-cluster, port/listener, policy/kube-proxy/firewall/DNS theo lớp.

Bài tập

Expose Deployment ClusterIP, tạo NodePort và ExternalName, test từng path, cố ý sai selector/port/readiness, sửa và tạo variant. Ghi limitation network, cleanup nodePort/DNS và không dùng external endpoint nhạy cảm.

Terminal reference

Command list và cách dùng

Chạy từng lệnh theo đúng thứ tự. Trước các lệnh có thể tạo hoặc thay đổi tài nguyên, hãy kiểm tra profile, account và region.

Commands · read-only checkpoints
kubectl expose deployment web --port=80 --target-port=8080 --name=web -n ckad-day23
kubectl get svc,endpointslice -n ckad-day23 -o wide
kubectl describe svc web -n ckad-day23
kubectl get svc web -n ckad-day23 -o yaml
kubectl run net-debug -n ckad-day23 --rm -it --restart=Never --image=curlimages/curl -- sh
kubectl get events -n ckad-day23 --sort-by=.lastTimestamp
Hands-on lab

Thực hành theo scenario

  1. Tạo namespace `ckad-day23`, Deployment backend có labels/ports/readiness; dùng `kubectl expose` tạo ClusterIP rồi inspect selector/ports/EndpointSlice và test từ debug Pod.
  2. Tạo NodePort trong lab, ghi nodePort/targetPort/ClusterIP, test nội bộ và node path nếu runtime hỗ trợ; ghi limitation nếu local cluster không có external firewall/load balancer.
  3. Tạo ExternalName tới domain test an toàn, kiểm tra DNS từ Pod và chứng minh không có backend EndpointSlice/proxy; so sánh với ClusterIP.
  4. Cố ý sai selector/targetPort/port/readiness hoặc expose nhầm namespace; debug get/describe/endpointslice/DNS/events và sửa minimal. Tạo variant đổi label/type/namespace.
  5. Cleanup Services/Deployment/ExternalName/NodePort/debug Pod; giải phóng nodePort và không test domain/endpoint nhạy cảm.
Evidence checkpoint

Kiểm chứng kết quả

Không coi lệnh chạy thành công là đủ. Hãy đối chiếu output với trạng thái mong đợi:

  • ClusterIP/NodePort/ExternalName semantics đúng.
  • Expose output/selector/ports được inspect.
  • EndpointSlice/readiness/request path có evidence.
  • Internal vs node/external/DNS limitation được phân biệt.
  • Cleanup service types/ports/DNS an toàn.
Transfer to exam / production

Bẫy thường gặp và trade-off

CKAD Service task: đọc selector và targetPort trước, kiểm tra EndpointSlice rồi test từ đúng vị trí. `kubectl expose` nhanh nhưng defaults có thể không đúng đề; ExternalName không tạo backend Pod.

Checkpoint · 3 phút

Kiểm tra nhanh

Câu hỏi: ExternalName Service trỏ tới domain nhưng `kubectl get endpointslice` không có Pod endpoint. Điều này có bất thường không?

Kết thúc bài

Checklist trước khi sang Ngày 2