Cách dọn dẹp các nhiệm vụ Kubernetes Cũ
Đại lý web » Tin tức kỹ thuật số » Cách gỡ lỗi Kubernetes "FailedScheduling"

Cách gỡ lỗi Kubernetes "FailedScheduling"

Các vấn đề về lịch trình nhóm là một trong những lỗi Kubernetes phổ biến nhất. Có một số lý do tại sao một nhóm mới có thể bị kẹt trong một Pending bang với FailedScheduling như lý do của mình. Nhóm hiển thị trạng thái này sẽ không khởi động bất kỳ vùng chứa nào, vì vậy bạn sẽ không thể sử dụng ứng dụng của mình.

Các nhóm đang chờ xử lý do sự cố lên lịch thường sẽ không bắt đầu nếu không có sự can thiệp thủ công. Bạn sẽ cần tìm ra nguyên nhân gốc rễ và thực hiện hành động để sửa chữa cụm của mình. Trong bài viết này, bạn sẽ tìm hiểu cách chẩn đoán và khắc phục sự cố này để có thể tăng khối lượng công việc của mình.

Xác định lỗi lập lịch thất bại

Các nhóm hiển thị một Pending trạng thái trong một thời gian ngắn sau khi thêm chúng vào cụm của bạn. Kubernetes cần lên lịch các phiên bản vùng chứa trên các nút của bạn và các nút đó cần lấy hình ảnh từ sổ đăng ký của nó. Dấu hiệu đầu tiên của lỗi lập lịch nhóm là khi nó luôn hiển thị dưới dạng Pending sau khi thời gian khởi động thông thường đã trôi qua. Bạn có thể kiểm tra trạng thái bằng cách chạy Kubectl's get pods đã đặt hàng:

$ kubectl get pods TÊN TÌNH TRẠNG SẴN SÀNG KHỞI ĐỘNG LẠI TUỔI demo-pod 0/1 Đang chờ xử lý 0 4m05s

demo-pod hơn bốn phút, nhưng nó vẫn còn trong Pending Tiểu bang. Các nhóm thường không mất nhiều thời gian để khởi động các thùng chứa, vì vậy đã đến lúc bắt đầu điều tra những gì Kubernetes mong đợi.

Bước chẩn đoán tiếp theo là truy xuất lịch sử sự kiện của Pod bằng cách sử dụng describe pod đã đặt hàng:

$ kubectl description pod demo-pod ... Sự kiện: Nhập Lý do Tuổi Từ Thông báo ------ ---- ---- ------- ... Cảnh báo FailedScheduling 4m default- bộ lập lịch 0/4 nút khả dụng: 1 Quá nhiều nhóm, 3 Không đủ cpu.

Nhật ký sự kiện xác nhận một FailedScheduling lỗi là lý do cho phần mở rộng Pending Tiểu bang. Sự kiện này được báo cáo khi Kubernetes không thể phân bổ số lượng nhóm cần thiết cho một trong các nút worker của cụm của bạn.

Thông báo sự kiện tiết lộ lý do tại sao hiện không thể lập lịch trình: có bốn nút trong cụm nhưng không nút nào có thể lấy nhóm. Ba trong số các nút không đủ dung lượng CPU trong khi nút còn lại đã đạt đến mức trần về số lượng nhóm mà nó có thể chấp nhận.

Hiểu về lỗi FailedScheduling và các vấn đề tương tự

Kubernetes chỉ có thể lên lịch cho các nhóm trên các nút có tài nguyên dự phòng. Các nút hết CPU hoặc bộ nhớ không thể sử dụng nhóm nữa. Các nhóm cũng có thể không lập lịch trình nếu chúng yêu cầu rõ ràng nhiều tài nguyên hơn bất kỳ nút nào có thể cung cấp. Điều này giữ cho cụm của bạn ổn định.

Mặt phẳng điều khiển Kubernetes biết nhóm nào đã được phân bổ cho các nút trong cụm của bạn. Nó sử dụng thông tin này để xác định tập hợp các nút có thể nhận một nhóm mới. Xảy ra lỗi lập lịch trình khi không có ứng viên nào, khiến nhóm bị kẹt Pending cho đến khi khả năng được giải phóng.

Kubernetes cũng có thể không lên lịch cho các nhóm vì những lý do khác. Các nút có thể được coi là không đủ điều kiện để lưu trữ Pod theo một số cách, ngay cả khi chúng có đủ tài nguyên hệ thống:

  • Nút có thể đã bị quản trị viên khóa để ngăn nút nhận nhóm mới trước khi vận hành bảo trì.
  • Nút có thể có tác dụng ngăn các nhóm lên lịch. Nhóm của bạn sẽ không được nút chấp nhận trừ khi nhóm đó có dung sai phù hợp.
  • Nhóm của bạn có thể đang yêu cầu một hostPort đã được liên kết với nút. Các nút chỉ có thể cung cấp một số cổng cụ thể cho một Pod tại một thời điểm.
  • Nhóm của bạn có thể đang sử dụng một nodeSelector điều này có nghĩa là nó phải được lập trình trên một nút có nhãn cụ thể. Các nút không được gắn thẻ sẽ không đủ điều kiện.
  • Các mối quan hệ và phản đối mối quan hệ của các nhóm và nút có thể không đạt yêu cầu, gây ra xung đột lập lịch khiến các nhóm mới không được chấp nhận.
  • Pod có thể có một nodeName trường xác định một nút cụ thể để lên lịch. Nhóm sẽ bị tạm dừng nếu nút này ngoại tuyến hoặc không được lên lịch.

Đó là trách nhiệm của kube-scheduler, bộ lập lịch Kubernetes, để xử lý các điều kiện này và xác định tập hợp các nút có thể lưu trữ một nhóm mới. Một FailedScheduling Sự kiện xảy ra khi không có nút nào đáp ứng tiêu chí.

Giải quyết trạng thái lịch trình không thành công

Thông báo hiển thị bên cạnh FailedScheduling thường tiết lộ lý do tại sao mỗi nút trong cụm của bạn không thể lấy nhóm. Bạn có thể sử dụng thông tin này để bắt đầu khắc phục sự cố. Trong ví dụ trên, cụm có bốn nhóm, ba nhóm đã đạt đến giới hạn CPU và một nhóm đã vượt quá giới hạn số lượng nhóm.

Dung lượng cụm là nguyên nhân gốc rễ trong trường hợp này. Bạn có thể mở rộng quy mô cụm của mình bằng các nút mới để giải quyết các vấn đề về mức tiêu thụ phần cứng, thêm các tài nguyên sẽ mang lại sự linh hoạt bổ sung. Vì điều này cũng sẽ làm tăng chi phí của bạn, nên trước tiên bạn nên kiểm tra xem mình có các nhóm dư thừa trong cụm của mình hay không. Loại bỏ các tài nguyên không sử dụng sẽ giải phóng dung lượng cho các tài nguyên mới.

Bạn có thể kiểm tra các tài nguyên có sẵn trên mỗi nút của mình bằng cách sử dụng describe node đã đặt hàng:

$ kubectl description node demo-node ... Tài nguyên được phân bổ: (Tổng giới hạn có thể trên 100 phần trăm, nghĩa là vượt quá giới hạn.) Giới hạn yêu cầu tài nguyên -------------------------- -- cpu 812m (90%) Bộ nhớ 202m (22%) 905Mi (57%) 715Mi (45%) lưu trữ tạm thời 0 (0%) 0 (0%) ôm trang-2Mi 0 (0%) 0 (0%)

Các nhóm trên nút này đã yêu cầu 57% bộ nhớ khả dụng. Nếu một nhóm mới yêu cầu 1 Gi cho chính nó, nút sẽ không thể chấp nhận yêu cầu lập lịch trình. Theo dõi thông tin này cho từng nút của bạn có thể giúp bạn đánh giá xem cụm của bạn có đang được cung cấp quá mức hay không. Điều quan trọng là phải có dung lượng dự phòng trong trường hợp một trong các nút của bạn bị lỗi và khối lượng công việc của nó cần được sắp xếp lại trên một nút khác.

Lập lịch thất bại do thiếu các nút có thể lập lịch sẽ hiển thị một thông báo tương tự như sau trong FailedScheduling Biến cố:

0/4 nút khả dụng: 4 nút không thể lên lịch

Các nút không thể được lên lịch vì chúng đã được lặp lại sẽ bao gồm SchedulingDisabled trong trường trạng thái của họ:

$ kubectl lấy các nút TÊN TÌNH TRẠNG VAI TRÒ TUỔI PHIÊN BẢN nút-1 Sẵn sàng,Lập kế hoạchĐã tắt mặt phẳng điều khiển,chính 26m v1.23.3

Bạn có thể hủy liên kết nút để cho phép nút nhận nhóm mới:

$ kubectl uncordon node-1 node/node-1 uncordoned

Khi các nút không được đóng và có đủ tài nguyên, lỗi lập lịch thường do nhiễm bẩn hoặc lỗi nodeSelector trường trên Pod của bạn. Nếu bạn dùng nodeSelectorxác minh rằng bạn không mắc lỗi đánh máy và có các nhóm trong cụm của bạn có nhãn bạn đã chỉ định.

Khi các nút bị nhiễm bẩn, hãy đảm bảo rằng bạn đã bao gồm dung sai tương ứng trong bảng kê khai nhóm của mình. Ví dụ: đây là một nút đã bị nhiễm nên các nhóm sẽ không lên lịch trừ khi chúng có demo-taint: allow sức chịu đựng:

$ nút kubectl taint node-1 demo-taint=allow:NoSchedule

Chỉnh sửa bảng kê khai nhóm của bạn để chúng có thể lên lịch trên nút:

suy nghi:
  dung sai:
    - Chìa khóa: bản demo
      nhà điều hành: bằng
      giá trị: cho phép
      hiệu lực: Không có lịch

Giải quyết vấn đề gây ra FailedScheduling state sẽ cho phép Kubernetes tiếp tục lên lịch cho các nhóm đang chờ xử lý của bạn. Chúng sẽ bắt đầu chạy tự động ngay sau khi mặt phẳng điều khiển phát hiện các thay đổi đối với các nút của bạn. Bạn không cần phải khởi động lại hoặc tạo lại nhóm của mình theo cách thủ công trừ khi sự cố xảy ra do lỗi trong bảng kê khai nhóm của bạn, chẳng hạn như mối quan hệ không chính xác hoặc nodeSelector cánh đồng.

tóm lại

FailedScheduling lỗi xảy ra khi Kubernetes không thể đặt một nhóm mới trên một nút trong cụm của bạn. Điều này thường xảy ra do các nút hiện tại của bạn hết tài nguyên phần cứng như CPU, bộ nhớ và ổ đĩa. Trong trường hợp này, bạn có thể khắc phục sự cố bằng cách mở rộng cụm của mình để bao gồm các nút bổ sung.

Lỗi lập lịch trình cũng xảy ra khi các nhóm chỉ định các mối quan hệ nút, chống mối quan hệ và bộ chọn hiện không thể được đáp ứng bởi các nút có sẵn trong cụm của bạn. Các nút bị chặn và bị ô nhiễm làm giảm thêm các tùy chọn có sẵn cho Kubernetes. Loại vấn đề này có thể được giải quyết bằng cách kiểm tra bảng kê khai của bạn để tìm lỗi chính tả trong nhãn và loại bỏ các ràng buộc mà bạn không cần nữa.

★ ★ ★ ★ ★