Sự cố sáng thứ HaiBạn ngồi xuống, nhâm nhi tách cà phê và chạy lệnh kiểm tra định kỳ kubectl get nodes. Thay vì danh sách các node hoạt động bình thường, terminal của bạn lại trả về một lỗi TLS:
Unable to connect to the server: x509: certificate has expired or is not yet valid
Điều này thường xảy ra chính xác sau 365 ngày kể từ khi bạn khởi tạo cụm lần đầu. Vì các chứng chỉ nội bộ đã hết hạn, API server hiện từ chối mọi yêu cầu. Các ứng dụng của bạn có thể vẫn đang chạy, nhưng khả năng quản lý chúng đã hoàn toàn bị đóng băng.
Tại sao chứng chỉ Kubernetes hết hạnKhi bạn thiết lập một cụm bằng kubeadm, nó sẽ tạo ra một bộ chứng chỉ trong /etc/kubernetes/pki. Theo mặc định, các chứng chỉ này chỉ có hiệu lực trong một năm. Trong khi các phiên bản Kubernetes hiện đại cố gắng tự động xoay vòng một số chứng chỉ Kubelet, các chứng chỉ control plane cốt lõi thường yêu cầu làm mới thủ công nếu bạn không thực hiện nâng cấp cụm gần đây.
API server dựa vào các chứng chỉ này để giao tiếp an toàn. Khi đồng hồ một năm điểm hết, quá trình bắt tay TLS thất bại và kubectl mất quyền giao tiếp với cụm.
Bước 1: Kiểm tra thời hạn chứng chỉĐầu tiên, hãy xem chính xác chứng chỉ nào đã hết hạn. Đăng nhập vào node master (control-plane) và kiểm tra trạng thái:
sudo kubeadm certs check-expiration
Lưu ý: Nếu bạn đang sử dụng phiên bản cũ (trước v1.20), hãy sử dụng sudo kubeadm alpha certs check-expiration để thay thế.
Hãy nhìn vào cột RESIDUAL TIME. Nếu bạn thấy 0d hoặc giá trị âm cho các mục như admin.conf hoặc apiserver, bạn đã tìm thấy nguyên nhân. Ngay cả khi chúng còn 2 hoặc 3 ngày, đã đến lúc phải gia hạn trước khi mọi thứ bị gián đoạn.
Bước 2: Gia hạn tất cả cùng lúcCách khắc phục hiệu quả nhất là gia hạn mọi chứng chỉ do cụm quản lý. Hãy thực thi lệnh này trên node master của bạn:
sudo kubeadm certs renew all
Lệnh này cập nhật các tệp .crt và .key trong /etc/kubernetes/pki. Nó cũng cập nhật các chứng chỉ được nhúng bên trong các tệp .conf của bạn. Tuy nhiên, cụm của bạn vẫn chưa được sửa lỗi hoàn toàn — cấu hình người dùng cục bộ của bạn vẫn chứa thông tin xác thực cũ.
Bước 3: Cập nhật Kubeconfig của bạnTệp ~/.kube/config của bạn là bản sao của chứng chỉ cũ đã hết hạn. Nếu bạn không cập nhật nó, kubectl sẽ tiếp tục cố gắng sử dụng thông tin xác thực đã chết. Hãy ghi đè cấu hình cục bộ bằng cấu hình mới được tạo ra sau khi gia hạn:
# Cho người dùng root hoặc người dùng hiện tại trên node master
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Nếu bạn quản lý cụm từ máy tính cá nhân từ xa, hãy sao chép nội dung của tệp /etc/kubernetes/admin.conf mới vào tệp cấu hình trên máy cục bộ của bạn. Nếu không có bước này, bạn sẽ tiếp tục thấy lỗi x509 mặc dù máy chủ đã hoạt động bình thường.
Bước 4: Buộc Control Plane khởi động lạiAPI server và Controller Manager vẫn đang chạy trong bộ nhớ bằng các chứng chỉ cũ đã hết hạn. Bạn cần khởi động lại chúng để chúng tải các tệp mới. Vì đây là các static pod, phương pháp đáng tin cậy nhất là di chuyển các tệp manifest của chúng ra khỏi thư mục triển khai và đưa chúng trở lại.
# Di chuyển các manifest sang thư mục tạm để dừng các pod
sudo mv /etc/kubernetes/manifests/*.yaml /tmp/
# Đợi khoảng 30 giây để Kubelet chấm dứt các tiến trình
sleep 30
# Di chuyển chúng trở lại để kích hoạt khởi động lại
sudo mv /tmp/*.yaml /etc/kubernetes/manifests/
Đợi một phút để API server ổn định. Bạn có thể theo dõi quá trình bằng watch docker ps hoặc watch crictl ps để đảm bảo các container đã hoạt động trở lại.
Xác minh kết quảKhi các dịch vụ đã trực tuyến trở lại, hãy kiểm tra kết nối của bạn:
kubectl get nodes
Nếu bạn thấy các node được liệt kê là Ready, cuộc khủng hoảng đã kết thúc. Chạy sudo kubeadm certs check-expiration một lần cuối. Bây giờ bạn sẽ thấy thời hạn còn lại là 364 ngày cho tất cả các mục.

