Bài 17: Quản Lý DNS Và Load Balancing Trong Kubernetes

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

https://picluster.ricsanfre.com/assets/img/core-dns-architecture.png

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

https://lh4.googleusercontent.com/7J3zk3Wx4GKskPdrHlSjTpsaU_jQRR0w7u5hagjYJPjMPgsZT915b4RdhEeoB_gWQ1rQgyuwV7wGXiFKgCgOVQi40CneLetZWkmFjUA6YvbjV6ckDvtaKRijhjdxtSEuPh1WaZYXhdYJ9jj6Suu41p4

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 DNSLoad Balancing. DNS thường xuất hiện trong các task như:

  • “Từ Pod A, resolve Service ở namespace B.”
  • “Chỉnh dnsPolicy củ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-XXXX khi không resolve được.
  • Test load balancing bằng vòng lặp wget hoặc curl trong 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: ClusterFirst trừ 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 để:

  1. Resolve web-svc.default.svc.cluster.local
  2. Kiểm tra load balancing bằng wget nhiề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.

Điều hướng chuỗi bài viết<< Bài 16: Sử Dụng Ingress Và Network Policy
>> Bài 18: Sử Dụng Volume (emptyDir, hostPath)

Thông tin nổi bật

Sự kiện phát trực tiếp​

Event Thumbnail

Báo cáo quan trọng

Article Thumbnail
Article Thumbnail
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận

Tiêu điểm chuyên gia