Khắc Phục Lỗi Mâu Thuẫn Driver Quản Lý Tài Nguyên Giữa Kubelet và Docker Trong Môi Trường Kubernetes

Tình trạng hệ thống gặp sự cố

Khi kiểm tra trạng thái các node trong cụm qua lệnh kubectl, bạn có thể nhận được phản hồi lỗi kết nối:

$ kubectl get nodes
The connection to the server host:6443 was refused - did you specify the right host or port

Cố gắng truy vấn thêm bằng cách xem xét log của dịch vụ cốt lõi Kubelet:

$ sudo journalctl -xu kubelet.service

Nội dung log ghi lại chi tiết nguyên nhân dừng dịch vụ:

Mar 01 03:23:29 k8s-master kubelet[691]: err="failed to run Kubelet: misconfiguration: kubelet cgroup driver: \"systemd\" is different from docker cgroup driver: \"cgroupfs\""

Lỗi này chỉ ra sự không khớp về phương thức quản lý nhóm tiến trình (cgroup driver): Kubelet đang định cấu hình để sử dụng systemd, trong khi môi trường Docker chạy dưới cgroupfs. Sự bất đồng này khiến tác nhân Node Agent bị từ chối khởi động.

Hướng xử lý kỹ thuật

Theo khuyến nghị của tài liệu chính thức, việc thống nhất cả Kubernetes Node và Container Runtime về cơ chế điều khiển systemd sẽ giúp hệ thống ổn định hơn so với việc dùng cgroupfs truyền thống. Dưới đây là quy trình chuẩn hóa lại cấu hình để đưa cả hai thành phần về chung một chuẩn systemd.

Bước 1: Cập nhật tham số khởi động cho Kubelet

Thay vì điều chỉnh Docker sang cgroupfs (cách làm ít được khuyến khích hiện nay), ta nên điều chỉnh Kubelet để nó nhận diện đúng driver của Docker. Nếu hệ thống sử dụng các bản phân phối như CentOS/RHEL, file cấu hình thường nằm tại đường dẫn sau:

/etc/sysconfig/kubelet

Sử dụng công cụ soạn thảo để bổ sung tham số ép buộc driver vào dòng khởi động:

KUBELET_EXTRA_ARGS=--cgroup-driver=systemd

Một số phiên bản hệ thống hoặc phương pháp cài đặt khác có thể yêu cầu cấu hình trực tiếp trong tập tin dịch vụ systemd thay thế cho file sysconfig, tuy nhiên mục đích vẫn là khai báo rõ ràng biến số --cgroup-driver=systemd.

Bước 2: Cấu hình Daemon Docker

Để ngăn chặn xung đột tái diễn sau này, cần đảm bảo Docker Engine cũng được kích hoạt chế độ systemd. Sửa đổi file cấu hình daemon nơi chứa danh sách các tùy chọn thực thi:

/etc/docker/daemon.json

Nếu file chưa tồn tại, hãy tạo mới và điền nội dung dạng JSON theo mẫu sau để thiết lập executor driver:

{
  "exec-opts": [
    "native.cgroupdriver=systemd"
  ]
}

Sau khi hoàn tất việc chỉnh sửa file cấu hình, bắt buộc phải tải lại bộ nhớ cache của systemd và khởi động lại các dịch vụ liên quan theo thứ tự:

  1. Tải lại cấu hình systemd.
  2. Khởi động lại Docker daemon.
  3. Khởi động lại Kubelet.

Cụm lệnh thực thi toàn bộ quá trình:

$ systemctl daemon-reload \&& systemctl restart docker \&& systemctl restart kubelet

Bước 3: Xác nhận cấu hình đã áp dụng

Để đảm bảo việc điều chỉnh thành công, kiểm tra lại thông tin tổng quan của Docker để xem phần Cgroup Driver đã chuyển sang systemd chưa:

$ docker info | grep Cgroup

Kết quả mong đợi cần hiển thị:

 Cgroup Driver: systemd

Và xác nhận phiên bản cgroup đang hoạt động.

Thẻ: Kubernetes kubelet cgroup-driver docker systemd

Đăng vào ngày 23 tháng 5 lúc 01:21