Bài viết này xoay quanh chủ đề OS Upgrades trong Kubernetes khi node bị lỗi hoặc cần bảo trì. Chúng ta sẽ tìm hiểu cách Kubernetes hoạt động khi một node bị lỗi, và các kỹ thuật để bảo trì node một cách an toàn mà không ảnh hưởng đến dịch vụ.
Xem thêm:
1. Tình huống
Một node trong cụm Kubernetes có thể bị lỗi do nhiều nguyên nhân: phần cứng bị lỗi, hệ điều hành gặp vấn đề, hoặc đơn giản là cần bảo trì.
Các pod chạy trên node lỗi sẽ bị ảnh hưởng. Nếu pod không có bản sao (replica), dịch vụ tương ứng sẽ bị gián đoạn, người dùng sẽ không thể truy cập.
Giả sử bây giờ có 4 Node, Node thứ 2 vì một lý do nào đó mà gặp lỗi. Do đó các Pod trên Node đó mình không thể truy cập được. Tuy nhiên bản sao màu xanh làm có bản sao khác nên không bị ảnh hưởng, mà chỉ có Node màu xanh lá cây bị ảnh hưởng.
Kubernetes có một cơ chế thời gian chờ (pod-eviction-timeout) để đánh giá tình trạng của node. Thời gian chờ mặc định là 5 phút.
Nếu:
- Node phục hồi nhanh (dưới 5 phút): Kubernetes sẽ khởi động lại các pod trên node sau khi nó phục hồi.
- Node lỗi quá 5 phút: Kubernetes sẽ xem node đã chết (dead), xóa các pod đang chạy trên node và tạo lại chúng trên các node khác trong cụm.
2. Cách bảo trì node an toàn
Drain: Lệnh kubectl drain được sử dụng để loại bỏ các pod khỏi node một cách an toàn trước khi bảo trì.
kubectl drain node01 --ignore-daemonsets
Quá trình này bao gồm:
- Kết thúc các pod: Kubernetes sẽ gửi tín hiệu cho các pod đang chạy trên node để kết thúc gracefully (nhẹ nhàng).
- Tạo lại các pod: Các pod sẽ được tạo lại trên các node khác trong cụm, đảm bảo dịch vụ tiếp tục hoạt động.
Cordon node: Node được đánh dấu là unschedulable, nghĩa là không thể lên lịch cho các pod mới chạy trên node này.
Cordon: Lệnh kubectl cordon chỉ đánh dấu node là unschedulable, không di chuyển các pod. Có thể sử dụng lệnh này để ngăn chặn việc lên lịch cho các pod mới trên node, nhưng các pod đã chạy trên node sẽ vẫn tiếp tục hoạt động.
controlplane ~ ➜ kubectl drain node01 --ignore-daemonsets node/node01 cordoned Warning: ignoring DaemonSet-managed Pods: kube-flannel/kube-flannel-ds-k9nln, kube-system/kube-proxy-6xcwh evicting pod default/blue-667bf6b9f9-tmltg evicting pod default/blue-667bf6b9f9-nsmgn pod/blue-667bf6b9f9-nsmgn evicted pod/blue-667bf6b9f9-tmltg evicted node/node01 drained controlplane ~ ➜ kubectl get node NAME STATUS ROLES AGE VERSION controlplane Ready control-plane 10m v1.29.0 node01 Ready,SchedulingDisabled <none> 9m44s v1.29.0 controlplane ~ ➜ kubectl uncordon node01 node/node01 uncordoned
3. Các bước nâng cấp Kubernetes
Quy trình nâng cấp cho đến thực hành nâng cấp nâng cấp cụm Kubernetes bằng công cụ kubeadm.
3.1 Quy tắc nâng cấp
Các thành phần chính của Kubernetes (Control Plane) có thể có phiên bản khác nhau, nhưng kube-apiserver luôn phải có phiên bản cao nhất.
kube-apiserver: Phiên bản cao nhất.
controller-manager và scheduler: Có thể thấp hơn kube-apiserver một phiên bản.
kubelet và kube-proxy: Có thể thấp hơn kube-apiserver hai phiên bản.
kubectl: Có thể cao hơn, bằng hoặc thấp hơn kube-apiserver.
3.2 Khi nào cần nâng cấp
Hỗ trợ phiên bản: Kubernetes chỉ hỗ trợ tối đa ba phiên bản phụ gần nhất (ví dụ: 1.13, 1.12, 1.11).
Kubernetes khuyến nghị nâng cấp từng phiên bản một lần, ví dụ: 1.10 -> 1.11 -> 1.12.
3.3 Nâng cấp cụm Kubernetes
Hai bước chính:
- Nâng cấp master node (Control Plane).
- Nâng cấp worker node.
Nâng cấp master node:
Control Plane (API-server, Scheduler, kube-controller) sẽ tạm ngừng hoạt động trong khi nâng cấp, nhưng các ứng dụng và pod trên worker node vẫn hoạt động.
Không thể sử dụng kubectl, tạo/xóa/chỉnh sửa ứng dụng, hoặc sử dụng các chức năng quản lý cụm. Nếu một Pod bị lỗi thì Pod mới sẽ không được tạo ra.
Nâng cấp worker node:
Chiến lược 1 (downtime): Nâng cấp tất cả worker nodes cùng lúc, gây gián đoạn dịch vụ.
Chiến lược 2 (zero downtime): Nâng cấp từng worker node một, di chuyển các pod sang các node khác để đảm bảo dịch vụ không bị gián đoạn.
Chiến lược 3 (thêm node): Thêm node mới với phiên bản mới hơn, di chuyển workload sang node mới, sau đó loại bỏ node cũ.
3.4 Một số công cụ
Công cụ kubeadm: Công cụ kubeadm hỗ trợ nâng cấp cụm Kubernetes một cách tự động.
kubeadm upgrade plan: Hiển thị kế hoạch nâng cấp, bao gồm phiên bản hiện tại, phiên bản mục tiêu, và các lệnh nâng cấp.
kubeadm upgrade apply: Thực hiện nâng cấp, tải xuống các image cần thiết và nâng cấp các thành phần của cụm.
3.5 Nâng cấp kubelet
Hệ thống với kubelet trên master: Cần nâng cấp kubelet trên master node.
Hệ thống không có kubelet trên master: Không cần nâng cấp kubelet trên master.
Lệnh nâng cấp:
apt-get upgrade kubelet
: Nâng cấp gói kubelet.systemctl restart kubelet
: Khởi động lại dịch vụ kubelet.
3.6 Nâng cấp worker node
Bước 1: Sử dụng lệnh kubectl drain để di chuyển các pod khỏi node cần nâng cấp.
Bước 2: Nâng cấp kubeadm và kubelet trên worker node.
Bước 3: Sử dụng lệnh kubeadm upgrade apply để cập nhật cấu hình node.
Bước 4: Khởi động lại dịch vụ kubelet.
Bước 5: Sử dụng lệnh kubectl uncordon để cho phép node được lên lịch.
Bài giảng cung cấp một hướng dẫn chi tiết về cách nâng cấp cụm Kubernetes, bao gồm các quy tắc về phiên bản, quy trình nâng cấp master và worker node, và cách sử dụng công cụ kubeadm để nâng cấp. Cảm ơn bạn đã tham khảo kubernetes cơ bản trên ttnguyen.net.
Bài viết liên quan: