/etc/resolv.conf dành cho Kubernetes pod, tùy chọn ndots:5, điều này có thể tác động tiêu cực đến hiệu suất ứng dụng như thế nào

/etc/resolv.conf dành cho Kubernetes pod, tùy chọn ndots:5, điều này có thể tác động tiêu cực đến hiệu suất ứng dụng như thế nào

Gần đây chúng tôi đã ra mắt Kubernetes 1.9 trên AWS bằng Kops. Hôm qua, trong khi triển khai lưu lượng truy cập mới đến cụm Kubernetes lớn nhất một cách suôn sẻ, tôi bắt đầu nhận thấy các lỗi phân giải tên DNS bất thường được ứng dụng của chúng tôi ghi lại.

Có khá nhiều về điều này trên GitHub đã nói, nên tôi cũng quyết định tìm hiểu nó. Cuối cùng, tôi nhận ra rằng trong trường hợp của chúng tôi, điều này là do tải tăng lên trên kube-dns и dnsmasq. Điều thú vị và mới mẻ nhất đối với tôi chính là lý do khiến lưu lượng truy cập yêu cầu DNS tăng lên đáng kể. Bài viết của tôi là về điều này và phải làm gì với nó.

Độ phân giải DNS bên trong vùng chứa - như trong bất kỳ hệ thống Linux nào - được xác định bởi tệp cấu hình /etc/resolv.conf. Kubernetes mặc định dnsPolicy này ClusterFirst, điều đó có nghĩa là mọi yêu cầu DNS sẽ được chuyển tiếp tới dnsmasq, chạy trong một nhóm kube-dns bên trong cụm, từ đó sẽ chuyển tiếp yêu cầu đến ứng dụng kube-dns, nếu tên kết thúc bằng hậu tố cụm hoặc nói cách khác là đến máy chủ DNS cấp cao hơn.

hồ sơ /etc/resolv.conf bên trong mỗi vùng chứa mặc định sẽ trông như thế này:

nameserver 100.64.0.10
search namespace.svc.cluster.local svc.cluster.local cluster.local 
eu-west-1.compute.internal
options ndots:5

Như bạn có thể thấy, có ba chỉ thị:

  1. Name server là IP của dịch vụ kube-dns
  2. 4 miền tìm kiếm cục bộ được chỉ định search
  3. Có một lựa chọn ndots:5

Phần thú vị của cấu hình này là cách cài đặt và miền tìm kiếm cục bộ ndots:5 hòa hợp với nhau. Để hiểu điều này, bạn cần hiểu cách hoạt động của độ phân giải DNS đối với các tên không đủ tiêu chuẩn.

Tên đầy đủ là gì?

Tên đủ điều kiện là tên mà không cần tra cứu cục bộ và tên sẽ được coi là tuyệt đối trong quá trình phân giải tên. Theo quy ước, phần mềm DNS coi tên là đủ điều kiện nếu nó kết thúc bằng dấu chấm (.) và không đủ điều kiện nếu không. Đó là google.com. được xác định đầy đủ và google.com - KHÔNG.

Tên không đủ tiêu chuẩn được xử lý như thế nào?

Khi một ứng dụng kết nối với máy chủ từ xa được chỉ định trong tên, việc phân giải tên DNS thường được thực hiện bằng lệnh gọi hệ thống, ví dụ: getaddrinfo(). Nhưng nếu tên không đủ tiêu chuẩn (không kết thúc bằng .), tôi tự hỏi liệu cuộc gọi hệ thống sẽ cố gắng giải quyết tên đó dưới dạng tên tuyệt đối trước hay đi qua các miền tìm kiếm cục bộ trước? Nó phụ thuộc vào tùy chọn ndots.

Từ hướng dẫn sử dụng resolv.conf:

ndots:n

устанавливает порог для количества точек, которые должны появиться в имени, прежде чем будет сделан начальный абсолютный запрос. Значение по умолчанию для n равно 1, что означает, что если в имени есть какие-либо точки, имя будет сначала опробовано как абсолютное имя, прежде чем к нему будут добавлены какие-либо элементы списка поиска.

Điều này có nghĩa là nếu vì ndots được cung cấp giá trị 5 và tên chứa ít hơn 5 dấu chấm, lệnh gọi hệ thống sẽ cố gắng giải quyết nó một cách tuần tự, trước tiên sẽ duyệt qua tất cả các miền tìm kiếm cục bộ và nếu không thành công thì cuối cùng sẽ phân giải nó thành tên tuyệt đối.

Tại sao như vậy ndots:5 nó có thể tác động tiêu cực đến hiệu suất ứng dụng không?

Như bạn có thể tưởng tượng, nếu ứng dụng của bạn sử dụng nhiều lưu lượng truy cập bên ngoài, với mỗi kết nối TCP được thiết lập (hay chính xác hơn là với mỗi tên được giải quyết), nó sẽ đưa ra 5 truy vấn DNS trước khi tên được giải quyết chính xác, bởi vì trước tiên nó sẽ đi qua 4 miền tìm kiếm cục bộ và cuối cùng sẽ đưa ra yêu cầu phân giải tên tuyệt đối.

Biểu đồ sau đây hiển thị tổng lưu lượng truy cập trên 3 mô-đun kube-dns của chúng tôi trước và sau khi chúng tôi chuyển một số tên máy chủ được định cấu hình trong ứng dụng của mình sang tên máy chủ đủ điều kiện.

/etc/resolv.conf dành cho Kubernetes pod, tùy chọn ndots:5, điều này có thể tác động tiêu cực đến hiệu suất ứng dụng như thế nào

Sơ đồ sau đây cho thấy độ trễ của ứng dụng trước và sau khi chúng tôi chuyển một số tên máy chủ được định cấu hình trong ứng dụng của mình sang tên đầy đủ (đường dọc màu xanh lam là quá trình triển khai):

/etc/resolv.conf dành cho Kubernetes pod, tùy chọn ndots:5, điều này có thể tác động tiêu cực đến hiệu suất ứng dụng như thế nào

Giải pháp số 1 - Sử dụng tên đủ điều kiện

Nếu bạn có một vài tên tĩnh bên ngoài (tức là được xác định trong cấu hình ứng dụng) mà bạn tạo một số lượng lớn kết nối, có lẽ giải pháp đơn giản nhất là chuyển chúng sang tên đủ tiêu chuẩn bằng cách thêm chúng vào. cuối cùng.

Đây không phải là giải pháp cuối cùng nhưng nó giúp cải thiện tình hình một cách nhanh chóng, dù không rõ ràng. Chúng tôi đã áp dụng bản vá này để giải quyết vấn đề của mình, kết quả được hiển thị trong ảnh chụp màn hình ở trên.

Giải pháp số 2 - tùy chỉnh ndots в dnsConfig

Trong Kubernetes 1.9, chức năng xuất hiện ở chế độ alpha (phiên bản beta v1.10), cho phép bạn kiểm soát tốt hơn các tham số DNS thông qua thuộc tính pod trong dnsConfig. Trong số những thứ khác, nó cho phép bạn định cấu hình giá trị ndots cho một nhóm cụ thể, tức là

apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: dns-example
spec:
  containers:
    - name: test
      image: nginx
  dnsConfig:
    options:
      - name: ndots
        value: "1"

nguồn

Cũng đọc các bài viết khác trên blog của chúng tôi:

Nguồn: www.habr.com

Thêm một lời nhận xét