Troubleshooting K8s Status: Degraded¶
Trong quá trình quản lý và vận hành một cụm Kubernetes (K8s), việc nắm vững các trạng thái của K8s và tương quan giữa trạng thái của cluster với các Node Pool là rất quan trọng. Trạng thái của K8s thể hiện sự sẵn sàng và khả năng hoạt động của hệ thống, trong khi Node Pool chịu trách nhiệm quản lý và duy trì tài nguyên tính toán (compute resources) cho các ứng dụng đang chạy.
I. Các trạng thái của Kubernetes (K8s)¶
Kubernetes cung cấp nhiều trạng thái khác nhau cho cluster và các thành phần của nó (Pods, Nodes, Node Pools) nhằm thông báo về tình trạng hiện tại của hệ thống. Trong đó, tạng thái Degraded là trạng thái mà người dùng có thể hay gặp phải nhất. Trạng thái Degraded trong Kubernetes thường liên quan đến việc một hoặc nhiều thành phần của hệ thống (Node, Node Pool, Pod) không hoạt động tối ưu hoặc gặp lỗi, dẫn đến việc hiệu suất toàn bộ cụm (cluster) bị giảm.
Dưới đây là các Use Case phổ biến mà trạng thái Degraded có thể xuất hiện, cùng với các phương pháp troubleshoot.
II. Các Usecase thường gặp¶
Use Case 1: Node gặp trạng thái “NotReady” dẫn đến Cluster Degraded¶
1. Vấn đề: Một hoặc nhiều Node trong Node Pool bị rơi vào trạng thái NotReady, có thể do mất kết nối, thiếu tài nguyên, hoặc lỗi phần cứng.
2. Khắc phục
Kiểm tra trạng thái Node:
Sử dụng lệnh
kubectl get nodes
để xem Node nào bị ảnh hưởng.Trạng thái “NotReady” cho thấy Node đang gặp vấn đề trong việc duy trì kết nối hoặc thiếu tài nguyên.
Xem thông tin chi tiết Node:
Chạy lệnh
kubectl describe node <node-name>
để lấy thông tin chi tiết về Node, bao gồm nguyên nhân lỗi (như không thể liên lạc với Kubelet, disk đầy, hoặc quá tải tài nguyên).
Kiểm tra tài nguyên:
Kiểm tra xem Node có hết CPU, RAM hoặc disk không bằng cách sử dụng các công cụ giám sát hoặc trực tiếp xem trên Node.
Nếu Node không còn tài nguyên, bạn có thể cân nhắc việc thêm tài nguyên hoặc scale Node Pool để giảm tải.
Restart Kubelet trên Node:
Thử khởi động lại dịch vụ Kubelet trên Node bị lỗi:
sudo systemctl restart kubelet
Nếu Node không khắc phục được:
Thực hiện Cordoning và Draining Node để đảm bảo các Pod được di chuyển sang Node khác, sau đó gỡ bỏ Node bị lỗi:
kubectl cordon <node-name>
kubectl drain <node-name> --ignore-daemonsets
Nếu cần thiết, bạn có thể thêm Node mới vào Node Pool để đảm bảo cluster có đủ tài nguyên.
Use Case 2: Node Pool bị lỗi khi tự động mở rộng (Scaling)¶
1. Vấn đề: Khi Node Pool được tự động mở rộng do tăng tải, quá trình scaling thất bại, dẫn đến Node Pool bị kẹt trong trạng thái Degraded.
2. Khắc phục:
Kiểm tra trạng thái Node Pool:
Dùng giao diện quản lý cloud hoặc API để kiểm tra lý do tại sao quá trình mở rộng bị lỗi (ví dụ: hết quota tài nguyên trên cloud, lỗi cấu hình mạng).
Xác minh cấu hình Auto-scaling:
Kiểm tra lại cấu hình auto-scaling trong Node Pool, đảm bảo giá trị
Min
vàMax Node
được thiết lập hợp lý và Node Pool có khả năng mở rộng dựa trên tài nguyên yêu cầu.
Kiểm tra log scaling:
Kiểm tra log scaling để xem quá trình mở rộng gặp lỗi ở đâu (ví dụ: thiếu tài nguyên, hoặc giới hạn quota từ cloud provider).
Khởi động lại quy trình scaling:
Thử khởi động lại quá trình scaling bằng cách tạm thời vô hiệu hóa và kích hoạt lại auto-scaling cho Node Pool.
Kiểm tra giới hạn quota của VPC:
Nếu lỗi liên quan đến tài nguyên, bạn cần kiểm tra quota tài nguyên của VPC và yêu cầu tăng quota nếu cần.
Use Case 3: Một Pod hoặc nhóm Pod không thể khởi động được dẫn đến Degraded¶
1. Vấn đề: Một số Pod không thể khởi động do không đủ tài nguyên trên các Node hoặc gặp lỗi cấu hình dẫn đến việc toàn bộ cluster bị giảm hiệu suất.
2. Khắc phục¶
Kiểm tra trạng thái Pod:
Sử dụng lệnh
kubectl get pods
để xem Pod nào đang gặp vấn đề (có thể ở trạng thái Pending hoặc CrashLoopBackOff).
Xem thông tin chi tiết Pod:
Sử dụng lệnh
kubectl describe pod <pod-name>
để lấy thông tin chi tiết về lý do Pod không thể khởi động (ví dụ: thiếu CPU, RAM, hoặc lỗi cấu hình).
Kiểm tra tài nguyên Node:
Kiểm tra tổng tài nguyên của Node bằng cách chạy
kubectl describe nodes
. Nếu tài nguyên đã hết, cần phải tăng tài nguyên Node hoặc mở rộng Node Pool.
Điều chỉnh cấu hình tài nguyên cho Pod:
Kiểm tra và điều chỉnh requests và limits của Pod để phù hợp với tài nguyên sẵn có trên Node
Xem log của container:
Nếu Pod bị lỗi liên quan đến container, sử dụng lệnh
kubectl logs <pod-name>
để kiểm tra lỗi chi tiết từ container (ví dụ: không thể pull image, lỗi cấu hình environment).