Thứ sáu, 19/10/2018 | 00:00 GMT+7

Giới thiệu về Dịch vụ DNS Kubernetes

Hệ thống domain (DNS) là một hệ thống để kết hợp nhiều loại thông tin khác nhau - chẳng hạn như địa chỉ IP - với những cái tên dễ nhớ. Theo mặc định, hầu hết các cụm Kubernetes tự động cấu hình dịch vụ DNS nội bộ để cung cấp một cơ chế nhẹ để khám phá dịch vụ. Khám phá dịch vụ tích hợp giúp các ứng dụng dễ dàng tìm thấy và giao tiếp với nhau trên các cụm Kubernetes, ngay cả khi các group và dịch vụ đang được tạo, xóa và di chuyển giữa các node .

Chi tiết triển khai của dịch vụ Kubernetes DNS đã thay đổi trong các version gần đây của Kubernetes. Trong bài viết này, ta sẽ xem xét cả version kube-dnsCoreDNS của dịch vụ DNS Kubernetes. Ta sẽ xem xét cách chúng hoạt động và các bản ghi DNS mà Kubernetes tạo ra.

Để hiểu rõ hơn về DNS trước khi bạn bắt đầu, vui lòng đọc Giới thiệu về Thuật ngữ, Thành phần và Khái niệm DNS . Đối với bất kỳ chủ đề Kubernetes nào mà bạn có thể không quen thuộc, bạn có thể đọc Giới thiệu về Kubernetes .

Dịch vụ DNS Kubernetes cung cấp những gì?

Trước version Kubernetes 1.11, dịch vụ DNS Kubernetes dựa trên kube-dns . Phiên bản 1.11 đã giới thiệu CoreDNS để giải quyết một số lo ngại về bảo mật và ổn định với kube-dns.

Dù phần mềm xử lý các bản ghi DNS thực tế là gì, cả hai triển khai đều hoạt động theo cách tương tự:

  • Một dịch vụ có tên kube-dns và một hoặc nhiều group được tạo.
  • Dịch vụ kube-dns lắng nghe các sự kiện dịch vụđiểm cuối từ API Kubernetes và cập nhật các bản ghi DNS của nó nếu cần. Các sự kiện này được kích hoạt khi bạn tạo, cập nhật hoặc xóa các dịch vụ Kubernetes và các group liên quan của chúng.
  • kubelet đặt mỗi tùy chọn nameserver /etc/resolv.conf của pod mới thành IP cụm của dịch vụ kube-dns , với các tùy chọn search thích hợp để cho phép sử dụng các tên server ngắn hơn:

    Resolutionv.conf
    nameserver 10.32.0.10 search namespace.svc.cluster.local svc.cluster.local cluster.local options ndots:5 
  • Các ứng dụng chạy trong containers sau đó có thể phân giải tên server như example-service.namespace thành địa chỉ IP cụm chính xác.

Bản ghi DNS Kubernetes mẫu

DNS đầy đủ A bản ghi của dịch vụ Kubernetes sẽ giống như ví dụ sau:

service.namespace.svc.cluster.local 

Một group sẽ có một bản ghi ở định dạng này, phản ánh địa chỉ IP thực của group :

10.32.0.125.namespace.pod.cluster.local 

Ngoài ra, các bản ghi SRV được tạo cho các cổng có tên của dịch vụ Kubernetes:

_port-name._protocol.service.namespace.svc.cluster.local 

Kết quả của tất cả những điều này là một cơ chế phát hiện dịch vụ dựa trên DNS được tích hợp sẵn, nơi ứng dụng hoặc dịch vụ vi mô của bạn có thể nhắm đến một tên server đơn giản và nhất quán để truy cập các dịch vụ hoặc group khác trên cụm.

Tìm kiếm domain và giải quyết tên server lưu trữ ngắn hơn

Do các hậu tố domain tìm kiếm được liệt kê trong resolv.conf , bạn thường sẽ không cần sử dụng tên server đầy đủ để liên hệ với dịch vụ khác. Nếu bạn đang giải quyết một dịch vụ trong cùng một không gian tên, bạn có thể chỉ sử dụng tên dịch vụ để liên hệ với nó:

other-service 

Nếu dịch vụ nằm trong một không gian tên khác, hãy thêm nó vào truy vấn:

other-service.other-namespace 

Nếu bạn đang nhắm đến một group , bạn cần sử dụng ít nhất những thứ sau:

pod-ip.other-namespace.pod 

Như ta đã thấy trong resolv.conf mặc định, chỉ .svc hậu tố .svc được hoàn thành tự động, vì vậy hãy đảm bảo bạn chỉ định mọi thứ lên đến .pod .

Bây giờ ta đã biết các ứng dụng thực tế của dịch vụ Kubernetes DNS, hãy cùng xem qua một số chi tiết về hai cách triển khai khác nhau.

Chi tiết triển khai DNS của Kubernetes

Như đã lưu ý trong phần trước, Kubernetes version 1.11 đã giới thiệu phần mềm mới để xử lý dịch vụ kube-dns . Động lực cho sự thay đổi là để tăng hiệu suất và tính bảo mật của dịch vụ. Trước tiên, hãy xem cách triển khai kube-dns đầu.

kube-dns

Dịch vụ kube-dns trước Kubernetes 1.11 được tạo thành từ ba containers chạy trong một group kube-dns trong không gian tên kube-system . Ba container là:

  • kube-dns: một containers chạy SkyDNS , thực hiện phân giải truy vấn DNS
  • dnsmasq: một trình phân giải DNS và bộ nhớ cache nhẹ phổ biến lưu trữ các phản hồi từ SkyDNS
  • sidecar: một containers sidecar xử lý báo cáo chỉ số và phản hồi các kiểm tra tình trạng cho dịch vụ

Các lỗ hổng bảo mật trong Dnsmasq và các vấn đề về hiệu suất mở rộng với SkyDNS đã dẫn đến việc tạo ra một hệ thống thay thế, CoreDNS.

CoreDNS

Kể từ Kubernetes 1.11, một dịch vụ DNS Kubernetes mới, CoreDNS đã được nâng cấp lên Tính khả dụng chung. Điều này nghĩa là nó đã sẵn sàng để sử dụng production và sẽ là dịch vụ DNS cụm mặc định cho nhiều công cụ cài đặt và các nhà cung cấp Kubernetes được quản lý.

CoreDNS là một quy trình duy nhất, được viết bằng Go, bao gồm tất cả các chức năng của hệ thống trước đó. Một containers duy nhất giải quyết và lưu trữ các truy vấn DNS, phản hồi các kiểm tra tình trạng và cung cấp các chỉ số.

Ngoài việc giải quyết các vấn đề liên quan đến hiệu suất và bảo mật, CoreDNS còn sửa một số lỗi nhỏ khác và thêm một số tính năng mới:

  • Một số vấn đề về sự không tương thích giữa việc sử dụng steDomains và các dịch vụ bên ngoài đã được khắc phục
  • CoreDNS có thể tăng cường cân bằng tải vòng quanh dựa trên DNS bằng cách ngẫu nhiên hóa thứ tự mà nó trả về các bản ghi nhất định
  • Một tính năng được gọi là autopath có thể cải thiện thời gian phản hồi DNS khi phân giải tên server bên ngoài, bằng cách thông minh hơn trong việc lặp qua từng hậu tố domain tìm kiếm được liệt kê trong resolv.conf
  • Với kube-dns 10.32.0.125.namespace.pod.cluster.local sẽ luôn phân giải thành 10.32.0.125 , ngay cả khi pod không thực sự tồn tại. CoreDNS có chế độ “ group được xác minh” sẽ chỉ giải quyết thành công nếu group tồn tại với đúng IP và trong không gian tên phù hợp.

Để biết thêm thông tin về CoreDNS và sự khác biệt của nó với kube-dns, bạn có thể đọc thông báo Kubernetes CoreDNS GA .

Tùy chọn cấu hình bổ sung

Các nhà khai thác Kubernetes thường muốn tùy chỉnh cách các group và containers của họ phân giải các domain tùy chỉnh nhất định hoặc cần điều chỉnh server tên ngược dòng hoặc hậu tố domain tìm kiếm được cấu hình trong resolv.conf . Bạn có thể làm điều này với tùy chọn dnsConfig trong thông số kỹ thuật của group của bạn:

example_pod.yaml
apiVersion: v1 kind: Pod metadata:   namespace: example   name: custom-dns spec:   containers:     - name: example       image: nginx   dnsPolicy: "None"   dnsConfig:     nameservers:       - 203.0.113.44     searches:       - custom.dns.local 

Cập nhật cấu hình này sẽ viết lại một pod resolv.conf để cho phép các thay đổi. Cấu hình ánh xạ trực tiếp đến các tùy chọn resolv.conf tiêu chuẩn, vì vậy cấu hình trên sẽ tạo một file với nameserver 203.0.113.44search custom.dns.local các dòng nameserver 203.0.113.44 .

Kết luận

Trong bài viết này, ta đã trình bày những kiến thức cơ bản về những gì mà dịch vụ Kubernetes DNS cung cấp cho các nhà phát triển, hiển thị một số bản ghi DNS mẫu cho các dịch vụ và group , thảo luận về cách hệ thống được triển khai trên các version Kubernetes khác nhau và nêu bật một số tùy chọn cấu hình bổ sung có sẵn để tùy chỉnh cách group của bạn giải quyết các truy vấn DNS.

Để biết thêm thông tin về dịch vụ Kubernetes DNS, vui lòng tham khảo tài liệu chính thức của Kubernetes DNS cho Dịch vụ và Group .


Tags:

Các tin liên quan