Tuyển dụng
Viettel IDC

DNS trong Kubernetes là gì? Cách hoạt động ra sao?

03/06/2026

Trong môi trường Kubernetes, địa chỉ IP của các ứng dụng thường xuyên thay đổi. Để duy trì kết nối ổn định, hệ thống phân giải tên miền nội bộ đóng vai trò như một danh bạ tự động. Cùng Viettel IDC giải mã chi tiết DNS trong Kubernetes hoạt động ra sao trong bài viết dưới đây.

DNS Kubernetes là gì?

DNS trong Kubernetes (K8s DNS) là hệ thống phân giải tên miền nội bộ có chức năng gán tên miền cho các Service và Pod. Hệ thống này tự động dịch các tên miền dễ nhớ thành địa chỉ IP, giúp các thành phần trong cụm (cluster) kết nối, khám phá nhau dễ dàng mà không cần dùng địa chỉ IP tĩnh.

DNS Kubernetes là gì?

Giải mã DNS trong Kubernetes hoạt động ra sao?

DNS trong Kubernetes hoạt động như một hệ thống phân giải tên miền tự động nội bộ, giúp dịch tên các dịch vụ (Service) và Pod thành địa chỉ IP để chúng dễ dàng giao tiếp với nhau. Khi một tài nguyên mới được triển khai, hệ thống CoreDNS tích hợp sẵn sẽ tự động cập nhật và tạo các bản ghi DNS theo thời gian thực dưới dạng tên miền mặc định là cluster.local. Nhờ cơ chế này, các ứng dụng trong cụm có thể kết nối với nhau một cách ổn định thông qua các tên gọi thân thiện thay vì phải theo dõi các địa chỉ IP động liên tục thay đổi.

Cấu trúc phân giải tên miền (Domain Name Structure)

Hệ thống DNS trong Kubernetes cấp phát tên miền cho các tài nguyên theo một cấu trúc tiêu chuẩn và phân cấp thống nhất. Cú pháp mặc định đối với Service được quy định như sau:

<service-name>.<namespace>.svc.cluster.local

Trong đó:

- <service-name>: Tên của Service đích cần truy cập.

- <namespace>: Tên không gian mạng (namespace) chứa Service đó.

- svc: Định dạng xác định đây là một bản ghi của Service (nếu là Pod, giá trị này sẽ là pod).

- cluster.local: Hậu tố gốc (base domain) mặc định của toàn cụm Kubernetes.

Ví dụ, nếu bạn có một Service mang tên my-database được triển khai trong namespace prod, tên miền phân giải đầy đủ sẽ là: my-database.prod.svc.cluster.local. Lưu ý nếu một Pod khác cũng nằm trong cùng namespace prod muốn kết nối tới cơ sở dữ liệu này, nó chỉ cần gọi tên ngắn gọn là my-database.

Các bước phân giải DNS qua Kubelet và CoreDNS

Quá trình tìm kiếm và chuyển đổi từ tên miền sang địa chỉ IP diễn ra tự động thông qua sự phối hợp của các thành phần hệ thống theo 4 bước sau:

- Bước 1: Pod gửi yêu cầu truy vấn. Khi ứng dụng bên trong Pod cần giao tiếp với một Service, nó sẽ khởi tạo một yêu cầu truy vấn tên miền (DNS query).

- Bước 2: Tham chiếu tệp /etc/resolv.conf. Để Pod biết cần gửi truy vấn đi đâu, thành phần kubelet trên máy chủ (Node) đã tự động thiết lập tệp tin /etc/resolv.conf bên trong Pod ngay khi khởi tạo. Tệp tin này trỏ trực tiếp đến địa chỉ IP của Service CoreDNS trong hệ thống (thường mặc định là 10.96.0.10).

- Bước 3: Định tuyến qua kube-proxy. Truy vấn từ Pod được gửi đến địa chỉ IP của CoreDNS. Tại tầng mạng, thành phần kube-proxy đóng vai trò cân bằng tải, điều hướng luồng truy vấn này đến một trong các Pod CoreDNS thực tế đang ở trạng thái hoạt động (Ready).

- Bước 4: CoreDNS tra cứu và trả kết quả. Sau khi tiếp nhận yêu cầu, CoreDNS tra cứu dữ liệu trong bộ nhớ đệm (cache) hoặc đối chiếu với bản ghi nội bộ (dữ liệu này được đồng bộ liên tục từ Kubernetes API Server). CoreDNS tìm ra kết quả và trả về địa chỉ IP chính xác của Service đích, cho phép ứng dụng thiết lập kết nối mạng.

Các bước phân giải DNS qua Kubelet và CoreDNS

Xử lý các truy vấn ra mạng bên ngoài (Upstream DNS)

Hệ thống mạng trong Kubernetes không hoàn toàn cô lập. Nếu ứng dụng bên trong Pod yêu cầu truy cập một tên miền nằm ngoài hạ tầng cluster (ví dụ: một API của bên thứ ba như api.github.com), CoreDNS sẽ nhanh chóng nhận diện tên miền này không thuộc phạm vi của đuôi .cluster.local.

Lúc này, CoreDNS sẽ hoạt động như một trạm chuyển tiếp (forwarder). Nó không báo lỗi mà sẽ gửi tiếp truy vấn đó ra các máy chủ DNS bên ngoài (Upstream DNS) đã được cấu hình sẵn trên máy chủ vật lý để lấy địa chỉ IP thực tế, sau đó phản hồi lại chính xác cho Pod yêu cầu.

Hướng dẫn Debug và khắc phục lỗi DNS thường gặp trong Kubernetes

Khi đã hiểu rõ DNS trong Kubernetes hoạt động ra sao, bạn sẽ dễ dàng chẩn đoán và xử lý khi các Pod không thể kết nối với nhau. Dưới đây là 4 bước kiểm tra các kỹ sư hệ thống thường áp dụng:

Bước 1: Kiểm tra trạng thái của các Pod CoreDNS

Lỗi phổ biến nhất là bản thân dịch vụ CoreDNS đang gặp sự cố. Bạn cần đảm bảo các Pod này đang ở trạng thái Running bằng câu lệnh:

kubectl get pods -n kube-system -l k8s-app=kube-dns

Lưu ý: Nếu Pod ở trạng thái CrashLoopBackOff hoặc Pending, bạn cần kiểm tra lại tài nguyên (CPU/RAM) của máy chủ hoặc xem log chi tiết.

Bước 2: Kiểm tra cấu hình /etc/resolv.conf trong Pod

Đôi khi Pod khởi tạo nhưng không nhận được đúng IP của máy chủ DNS. Bạn có thể chui vào bên trong Pod đang bị lỗi để đọc trực tiếp file cấu hình mạng:

kubectl exec -it <tên-pod-của-bạn> -- cat /etc/resolv.conf

Đảm bảo dòng nameserver đang trỏ đúng về địa chỉ IP của Service CoreDNS (ví dụ 10.96.0.10).

Bước 3: Phân giải thử bằng công cụ nslookup / dig

Để loại trừ nguyên nhân lỗi từ mã nguồn ứng dụng, bạn nên tạo một Pod tạm thời chứa các công cụ mạng (như image busybox hoặc dnsutils) để gửi thử truy vấn DNS:

kubectl run -i --tty --rm debug-dns --image=busybox:1.28 -- nslookup <tên-service-cần-gọi>

Nếu lệnh này trả về đúng địa chỉ IP, chứng tỏ hệ thống DNS vẫn hoạt động bình thường, lỗi có thể nằm ở cấu hình bên trong ứng dụng của bạn.

Bước 4: Kiểm tra nhật ký (Logs) của CoreDNS

Nếu các bước trên không giải quyết được vấn đề, hãy kiểm tra nhật ký hoạt động của CoreDNS để xem có yêu cầu nào bị từ chối hoặc lỗi đồng bộ từ API Server hay không:

kubectl logs -n kube-system -l k8s-app=kube-dns

Hướng dẫn cách sử dụng DNS trong Kubernetes (Thực hành chi tiết)

Trong thực tế, bạn không cần phải "cài đặt" DNS vì hệ thống CoreDNS đã được Kubernetes kích hoạt tự động ngay từ đầu. Tuy nhiên, để sử dụng DNS hiệu quả nhất trong kiến trúc Microservices, bạn cần nắm vững 3 kỹ thuật áp dụng dưới đây:

Giao tiếp giữa các Microservices bằng Tên miền nội bộ

Đây là cách sử dụng cơ bản và phổ biến nhất. Giả sử bạn có một ứng dụng frontend cần gọi dữ liệu từ ứng dụng backend. Thay vì phải tìm địa chỉ IP của backend, bạn chỉ cần tạo một Service và gọi tên nó.

Bước 1: Tạo một Service cho Backend 

Lưu file dưới đây thành backend-svc.yaml và chạy lệnh kubectl apply -f backend-svc.yaml:

YAML

apiVersion: v1

kind: Service

metadata:

  name: api-backend

  namespace: default

spec:

  selector:

    app: backend

  ports:

    - protocol: TCP

      port: 8080

      targetPort: 80

 

Bước 2: Cấu hình gọi DNS từ Frontend 

Lúc này, Kubernetes đã tự động tạo một bản ghi DNS cho Service trên. Bên trong mã nguồn (source code) hoặc biến môi trường của ứng dụng frontend, bạn chỉ cần cấu hình đường dẫn kết nối API là:

- http://api-backend:8080 (Nếu frontend nằm cùng namespace default).

- http://api-backend.default.svc.cluster.local:8080 (Nếu frontend nằm ở namespace khác).

Gắn tên miền nội bộ cho Dịch vụ bên ngoài (Dùng ExternalName)

Trường hợp bạn có một cơ sở dữ liệu (Database) đang chạy bên ngoài Kubernetes (ví dụ: Amazon RDS có tên miền my-db.xyz.us-east-1.rds.amazonaws.com). Thay vì phải gán cứng (hardcode) cái tên miền dài ngoẵng này vào mã nguồn của mọi Pod, bạn có thể tạo một Service loại ExternalName để ánh xạ nó thành một tên miền nội bộ ngắn gọn.

Cách triển khai:

YAML

apiVersion: v1

kind: Service

metadata:

  name: db-local

  namespace: prod

spec:

  type: ExternalName

  externalName: my-db.xyz.us-east-1.rds.amazonaws.com

 

Ứng dụng trong Kubernetes giờ đây chỉ cần kết nối đến tên miền db-local.prod.svc.cluster.local. Hệ thống CoreDNS sẽ tự động làm nhiệm vụ chuyển tiếp (CNAME) ra cơ sở dữ liệu AWS RDS thực tế. Nếu sau này bạn đổi Database, bạn chỉ cần sửa file YAML này, không cần phải sửa code và build lại ứng dụng.

Tùy chỉnh hệ thống phân giải bằng CoreDNS ConfigMap

Nếu bạn muốn Kubernetes nhận diện một tên miền tùy chỉnh (custom domain) mà không cần phải thiết lập trên các máy chủ DNS bên ngoài, bạn có thể can thiệp trực tiếp vào tệp cấu hình của CoreDNS (được gọi là Corefile).

Bước 1: Mở tệp cấu hình ConfigMap của CoreDNS bằng lệnh:

Bash

kubectl edit configmap coredns -n kube-system

 

Bước 2: Bổ sung thêm plugin hosts vào khối cấu hình. Ví dụ dưới đây ép CoreDNS phân giải tên miền thongbao.congty.local về một địa chỉ IP nội bộ cụ thể (192.168.1.50):

YAML

apiVersion: v1

kind: ConfigMap

metadata:

  name: coredns

  namespace: kube-system

data:

  Corefile: |

    .:53 {

        errors

        health

        kubernetes cluster.local in-addr.arpa ip6.arpa {

           pods insecure

           fallthrough in-addr.arpa ip6.arpa

        }

        hosts {

           192.168.1.50 thongbao.congty.local

           fallthrough

        }

        prometheus :9153

        forward . /etc/resolv.conf

        cache 30

        loop

        reload

        loadbalance

    }

 

Sau khi lưu lại, CoreDNS sẽ tự động nạp lại cấu hình. Tất cả các Pod trong Cluster khi gọi đến thongbao.congty.local sẽ được hướng thẳng đến IP 192.168.1.50.

Kết luận

Hiểu rõ DNS trong Kubernetes hoạt động ra sao là bước nền tảng giúp bạn quản trị mạng nội bộ hiệu quả, đảm bảo các ứng dụng microservices luôn giao tiếp mượt mà. Tuy nhiên, việc tự xây dựng và vận hành một cụm Kubernetes hoàn chỉnh từ con số không thường tiêu tốn rất nhiều thời gian và đòi hỏi đội ngũ kỹ thuật có chuyên môn sâu. Để tối ưu hóa nguồn lực, doanh nghiệp có thể sử dụng Viettel Dedicated Kubernetes Service (vDKS) – giải pháp Managed Kubernetes giúp khởi tạo, vận hành hệ thống và cấu hình mạng hoàn toàn tự động, bảo mật 24/7.

Tham khảo chi tiết tại đây: https://viettelidc.com.vn/viettel-kubernetes-service

Để được hỗ trợ tư vấn và tìm hiểu các dịch vụ của Viettel, bạn có thể liên hệ trực tiếp tới Viettel IDC qua các kênh:

- Hotline: 1800 8088 (miễn phí cước gọi)

- Fanpage: https://www.facebook.com/viettelidc  

Bình luận ()

Đăng nhập | Đăng ký
để gửi bình luận
Ý kiến của bạn sẽ được xét duyệt trước khi đăng.
Ý kiến của bạn sẽ được xét duyệt trước khi đăng.
Ý kiến của bạn sẽ được xét duyệt trước khi đăng.
Xem thêm bình luận

Tin liên quan

05/11/2026

Lỗi msvcr100.dll là gì? Hướng dẫn cách sửa lỗi msvcr100 dll nhanh chóng

Lỗi msvcr100.dll khiến phần mềm không khởi chạy trên Windows. Xem hướng dẫn khắc phục từng bước để bổ sung thư viện còn thiếu và sửa chữa chương trình bị lỗi.

05/11/2026

Top 20 các extension visual studio code hữu ích cho lập trình viên

Các extension Visual Studio Code hữu ích mở rộng khả năng của trình soạn thảo, giúp lập trình viên tối ưu môi trường làm việc và nâng cao hiệu quả viết mã.

05/11/2026

Bridge là gì? Cách hoạt động và ứng dụng trong mạng LAN

Bridge là gì? Cầu nối mạng hoạt động dựa trên địa chỉ MAC để kết nối các phân đoạn LAN, kiểm soát luồng dữ liệu và hỗ trợ triển khai mạng vật lý lẫn mạng ảo.

05/11/2026

Lỗi Blocked due to other 4xx issue là gì? Nguyên nhân và cách fix lỗi

Lỗi Blocked due to other 4xx issue khiến Google không lập chỉ mục URL, cần xác định đúng mã HTTP và nguyên nhân để khắc phục hiệu quả trong Search Console.

05/11/2026

Test case là gì? Cách viết test case và mẫu minh họa cho người mới

Test case là gì và làm sao để viết rõ ràng, đúng yêu cầu? Nắm vững cách xây dựng trường hợp kiểm thử qua ví dụ cụ thể để phát hiện sai lệch trong hoạt động phần mềm.

05/11/2026

AI Inference là gì? Cơ chế và vai trò trong vận hành AI

AI inference là gì? Cách mô hình AI tạo kết quả sau huấn luyện, phân biệt với AI training, các hình thức triển khai và ứng dụng thực tế trong doanh nghiệp.

05/11/2026

DBeaver là gì? Hướng dẫn cài đặt và kết nối cơ sở dữ liệu với DBeaver

DBeaver là gì? Khám phá tính năng quản lý cơ sở dữ liệu, các phiên bản miễn phí và trả phí cùng hướng dẫn cài đặt, kết nối, chạy truy vấn SQL cho người mới.

05/11/2026

Cách thay đổi mật khẩu máy tính trên Windows 10, 11 đơn giản

Cách thay đổi mật khẩu máy tính trên Windows 10, 11 qua Settings, Control Panel, CMD và các công cụ quản trị được hướng dẫn chi tiết theo từng bước dễ thực hiện.

05/11/2026

Microsoft Management Console là gì? Cách sử dụng MMC cho người mới

Microsoft Management Console là gì? Đây là nền tảng tập hợp các công cụ quản trị Windows, hỗ trợ quản lý hệ thống, thêm snap-in và lưu console theo nhu cầu sử dụng.

05/11/2026

Rủi ro khi sử dụng giả lập online và cách phòng tránh

Rủi ro khi sử dụng giả lập online có thể gây lộ dữ liệu, mất quyền kiểm soát tài khoản, lừa đảo trực tuyến, vi phạm chính sách game, gián đoạn thao tác và phát sinh chi phí.