Danh sách bài viết trong series Học Kubernetes Từ Cơ Bản Đến Chứng Chỉ CKAD
- Lộ Trình Học Kubernetes Từ Cơ Bản Đến Chứng Chỉ CKAD
- Bài 1: Giới Thiệu Kubernetes Và Khái Niệm Cluster Cho CKAD
- Bài 2: Cài Đặt Minikube Và sử dụng kubectl Cơ Bản
- Bài 3: Quản Lý Pod Cơ Bản (Create, Delete, Describe)
- Bài 4: Sử Dụng ConfigMap Và Secret Trong YAML
- Bài 5: Quản Lý Environment Variables Và Command/Args
- Bài 6: Cấu Hình Deployment Và Replica Set
- Bài 7: Thiết Kế Pod Với Nhiều Container
- Bài 8: Sử Dụng Sidecar Và Init Container
- Bài 9: Chia Sẻ Tài Nguyên Giữa Các Container
- Bài 10: Giám Sát Log Và Events Với kubectl logs
- Bài 11: Debug Pod Với kubectl describe Và exec
- Bài 12: Tối Ưu Pod Với Resource Limits Và Requests
- Bài 13: Sử Dụng Liveness Và Readiness Probes
- Bài 14: Tối Ưu Hóa Pod Với HPA (Horizontal Pod Autoscaler)
- Bài 15: Cấu Hình Service (ClusterIP, NodePort)
- Bài 16: Sử Dụng Ingress Và Network Policy
- Bài 17: Quản Lý DNS Và Load Balancing Trong Kubernetes
- Bài 18: Sử Dụng Volume (emptyDir, hostPath)
- Bài 19: Cấu Hình Persistent Volume Và Persistent Volume Claim
- Bài 20: Tổng Kết, Mẹo Thi CKAD, Bài Tập Thực Hành Cuối
Sau khi đã hoàn thành Ingress và Network Policy ở Bài 16, chúng ta kết thúc domain Services & Networking (20%) với DNS và Load Balancing hai thành phần then chốt quyết định khả năng truy cập và ổn định của hệ thống Kubernetes.
Bài viết này thuộc domain Services & Networking, tập trung vào việc hiểu và cấu hình CoreDNS (DNS nội bộ của cluster) cùng cơ chế Load Balancing (phân phối traffic giữa các Pod). Trong kỳ thi CKAD, bạn có thể gặp các task như cấu hình Pod với dnsPolicy, kiểm tra cách resolve Service giữa các namespace, debug lỗi DNS, hoặc verify traffic được load balance qua nhiều Pod trong cùng một Deployment. Đây là nhóm câu hỏi tưởng dễ nhưng rất dễ mất điểm nếu không nắm rõ format DNS, cách kube-proxy hoạt động, và cách endpoints map tới Service.
Phần 1: Quản Lý DNS Trong Kubernetes
1. DNS Hoạt Động Như Thế Nào?
Khi bạn tạo một Service, Kubernetes sẽ tự động đăng ký DNS record cho Service đó trong CoreDNS. Mọi Pod trong cluster có thể truy cập Service này bằng tên DNS thay vì IP, ví dụ:
<service-name>.<namespace>.svc.cluster.local
Ví dụ, Service web trong namespace default có thể được truy cập bằng:
web.default.svc.cluster.local
2. Kiểm Tra CoreDNS
CoreDNS là thành phần chịu trách nhiệm phân giải DNS trong cluster. Kiểm tra trạng thái:
kubectl get pods -n kube-system -l k8s-app=kube-dns
kubectl logs -n kube-system -l k8s-app=kube-dns
CKAD Tip: Nếu DNS không resolve được, bắt đầu bằng việc kiểm tra CoreDNS logs trước.
3. Các Kiểu dnsPolicy
| dnsPolicy | Ý nghĩa |
|---|---|
ClusterFirst (default) |
Dùng DNS của cluster để resolve các Service nội bộ. |
Default |
Dùng DNS cấu hình sẵn của node (thường là /etc/resolv.conf). |
ClusterFirstWithHostNet |
Dùng cho Pod có hostNetwork: true. |
None |
Tắt hoàn toàn, dùng dnsConfig tùy chỉnh. |
Ví dụ YAML:
apiVersion: v1
kind: Pod
metadata:
name: dns-test
spec:
containers:
- name: test
image: busybox
command: ["sleep", "3600"]
dnsPolicy: ClusterFirst
4. Kiểm Tra DNS Resolution
Tạo Pod busybox để test DNS:
kubectl run test-dns --image=busybox --rm -it --restart=Never -- nslookup kubernetes.default
Kết quả mong đợi:
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: kubernetes.default.svc.cluster.local
Address: 10.96.0.1
Nếu lỗi “no such host” => kiểm tra lại CoreDNS và dnsPolicy.
Phần 2: Load Balancing Trong Kubernetes
1. Load Balancing Ở Mức Service
Khi bạn tạo một Service kiểu ClusterIP hoặc NodePort, kube-proxy sẽ tự động phân phối traffic đến các Pod backend theo cơ chế round-robin (ngẫu nhiên hoặc IPVS).
Ví dụ:
Service web trỏ đến 3 Pod chạy cùng image nginx, khi gửi nhiều request liên tiếp, kube-proxy sẽ điều hướng lần lượt đến các Pod khác nhau.
2. Kiểm Tra Load Balancing
Tạo Deployment và Service mẫu:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
Expose bằng Service:
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
type: ClusterIP
Test từ Pod khác:
kubectl run test --image=busybox --rm -it --restart=Never -- sh
wget -qO- web-svc
Lặp nhiều lần lệnh wget để thấy response từ các Pod khác nhau => chứng minh load balancing hoạt động.
3. Load Balancing Với NodePort
Nếu bạn expose bằng NodePort:
apiVersion: v1
kind: Service
metadata:
name: web-nodeport
spec:
selector:
app: web
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30082
Test từ host (Minikube):
curl http://$(minikube ip):30082
CKAD Tip: NodePort không đảm bảo session persistence, nên request có thể đến các Pod khác nhau mỗi lần.
Liên Hệ Với Chứng Chỉ CKAD
Domain Services & Networking (20%) thường dành 1–2 câu cho phần DNS và Load Balancing. DNS thường xuất hiện trong các task như:
- “Từ Pod A, resolve Service ở namespace B.”
- “Chỉnh
dnsPolicycủa Pod để chỉ dùng DNS host.” - “Debug CoreDNS fail, không resolve được Service nội bộ.”
Trong khi đó, Load Balancing thường yêu cầu bạn tạo Deployment nhiều replicas và xác minh traffic được phân phối đều qua các Pod trong cùng một Service. Các lỗi phổ biến là quên đổi dnsPolicy, viết sai full DNS name (.svc.cluster.local), hoặc selector không khớp khiến endpoints rỗng.
Mẹo thi:
- Luôn nhớ format DNS đầy đủ:
service.namespace.svc.cluster.local. - Kiểm tra CoreDNS bằng
kubectl logs -n kube-system coredns-XXXXkhi không resolve được. - Test load balancing bằng vòng lặp
wgethoặccurltrong Pod busybox. - Check endpoints bằng `kubectl get ep
` để chắc chắn Service đang phân tải đến Pod thực. - Giữ
dnsPolicy: ClusterFirsttrừ khi đề bài yêu cầu khác.
Bài Tập CKAD (8 Phút)
Đề:
Tạo một Deployment web gồm 3 replicas, image nginx:alpine.
Tạo Service web-svc kiểu ClusterIP.
Tạo Pod test dns-client dùng image busybox để:
- Resolve
web-svc.default.svc.cluster.local - Kiểm tra load balancing bằng
wgetnhiều lần.
Đáp án:
web.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
web-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
type: ClusterIP
Test:
kubectl apply -f web.yaml
kubectl apply -f web-svc.yaml
kubectl run dns-client --image=busybox --rm -it --restart=Never -- sh
nslookup web-svc.default.svc.cluster.local
wget -qO- web-svc
Kết quả: mỗi lần wget trả về nội dung khác nhau từ các Pod => chứng minh load balancing hoạt động.
Tóm Tắt Kiến Thức Cho CKAD
| Chủ đề | Kiến thức cần nhớ |
|---|---|
| DNS format | service.namespace.svc.cluster.local |
| Default policy | dnsPolicy: ClusterFirst |
| DNS component | CoreDNS |
| Load Balancing | Thực hiện bởi kube-proxy |
| Endpoint check | kubectl get ep [svc] |
Kết Luận
Bài này mình đã hướng dẫn chi tiết cách quản lý DNS nội bộ và kiểm tra cơ chế Load Balancing trong Kubernetes, giúp bạn hiểu cách Service định tuyến và phân tải request giữa các Pod. Bạn giờ đã có thể tự tin debug các lỗi DNS, verify load balancing, và đảm bảo các Service hoạt động ổn định trong cluster. Tiếp theo, ở Bài 18: Triển Khai ConfigMap Và Secret, chúng ta sẽ rời khỏi domain Networking để bước vào Application Configuration (18%), học cách quản lý cấu hình và secrets trong Pod một cách an toàn và linh hoạt.








