OS Upgrades trong kubernetes

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:

DaemonSet trong Kubernetes

Multiple Schedulers trong Kubernetes

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.

OS Upgrades kubernetes

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.

Khi nào cần nâng cấp K8s

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ụ.

Nâng cấp worker node:

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.

Nâng cấp worker node:

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ũ.

Nâng cấp worker node:

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:

Manual Scheduling trong K8s

Resource requirement

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em