+2

Hướng dẫn cách khôi phục các cụm Kubernetes Cluster bị hỏng một cách đơn giản

Việc triển khai Kubernetes hiện nay có 3 loại Node riêng biệt: Master node, ETCD node và Worker nodes. Trong thiết lập tính sẵn sàng cao (high availability), tất cả các loại node này đều được nhân rộng. Lỗi của các nodes riêng lẻ sẽ không gây ra hậu quả thảm khốc, nhưng bạn cần đảm bảo cụm Cluster của mình hoạt động hiệu quả càng nhanh càng tốt để ngăn chặn các lỗi tiếp theo có thể xảy ra.

Việc phục hồi sau những vụ việc như thế này có thể cực kỳ khó khăn. Không chỉ các nodes (kể cả các phần mềm dịch vụ khác) của bạn bị hỏng mà bạn còn phải tốn nhiều công sức về CNTT và kỹ thuật để khắc phục chúng. Điều tệ hơn là không có bất kỳ hướng dẫn toàn diện nào để khôi phục và chạy lại các cụm Cluster mà bạn có thể tìm thấy trên mạng. Vậy hãy thử tham khảo hướng dẫn ngay sau đây nhé.

Cách khắc phục lỗi "An ETCD Nodes has Failed"

1. Lỗi được phát hiện thế nào?

Lệnh kubectl có resource và Component Statuses, sẽ hiển thị tình trạng của ETCD Node mà bạn muốn kiểm tra:

$ kubectl get cs
NAME                 STATUS      MESSAGE
scheduler            Healthy     ok                                                               
controller-manager   Healthy     ok                                                               
etcd-2               Healthy     {"health": "true"}                                                               
etcd-0               Healthy     {"health": "true"}                                                               
etcd-1               Unhealthy   Client.Timeout exceeded while awaiting headers

2. Các bước phục hồi thiết lập tính sẵn sàng cao (high availability)

Nếu Kubernetes được cấu hình đúng ở chế độ HA thì cụm Cluster sẽ có thể xử lý việc mất một node ETCD, bạn hãy tạo một node mới để thay thế node ETCD bị lỗi. Nhớ ghi lại Địa chỉ IP của node mới, nhưng chưa khởi động ETCD vội. Đồng thời trên một trong các Node ETCD đang hoạt động, hãy xóa node ETCD bị lỗi ra khỏi cụm Cluster và thêm Địa chỉ IP của node mới, ví dụ như sau:

$ etcdctl --endpoints=http://127.0.0.1:2379 member list
10b576500ed3ae71: name=kube-etcd-1 peerURLs=https://10.0.0.1:2380 clientURLs=https://10.0.0.1:2379 isLeader=false
30bcb5f2f4c17805: name=kube-etcd-2 peerURLs=https://10.0.0.2:2380 clientURLs=https://10.0.0.2:2379 isLeader=false
a908b0f9f07a7127: name=kube-etcd-3 peerURLs=https://10.0.0.3:2380 clientURLs=https://10.0.0.3:2379 isLeader=true

$ etcdctl --endpoints=http://127.0.0.1:2379 member remove 30bcb5f2f4c17805
Removed member 30bcb5f2f4c17805 from cluster

$ etcdctl member add kube-etcd-4 --peer-urls=http://[new node IP]:2380
Member 2be1eb8f84b7f63e added to cluster ef37ad9dc622a7c4

Định cấu hình node ETCD mới để kết nối với cụm Cluster hiện có:

export ETCD_NAME="kube-etcd-4"
export ETCD_INITIAL_CLUSTER="kube-etcd-1=https://10.0.0.1:2380,kube-etcd-3=https://10.0.0.3:2380,kube-etcd-4=https://[new node IP]:2380"
export ETCD_INITIAL_CLUSTER_STATE=existing
etcd [flags]

Cuối cùng, bạn chỉ cần đăng nhập vào từng Kubernetes master và cập nhật tùy chọn máy chủ "kube-apiserver" của thành phần --etcd-server= để trỏ đến node ETCD mới.

3. Các bước khôi phục thành phần Non-HA

Nếu Kubernetes đang không chạy ở chế độ HA và node ETCD duy nhất bị lỗi thì cụm Cluster sẽ ngừng hoạt động.

Nếu bạn vẫn có quyền truy cập vào ổ đĩa hoặc có sẵn ảnh chụp nhanh, hãy thử khôi phục thư mục dữ liệu ETCD. Thông thường đây là thư mục: /var/lib/etcd. Xây dựng node ETCD mới với dữ liệu được khôi phục và có các flags giống như node ETCD bị lỗi ngoại trừ lần này, hãy đặt ETCDINITIALCLUSTERSTATE=existing

Cuối cùng, bạn chỉ cần đăng nhập vào Kubernetes master và cập nhật tùy chọn kube-apiserver của thành phần --etcd-server= để trỏ đến node ETCD mới.

Cách khắc phục lỗi "A Kubernetes master Node has Failed"

1. Lỗi được phát hiện thế nào?

Lệnh kubectl get nodes sẽ báo cáo các node chính không thể truy cập được như: NotReady

$ kubectl get nodes
NAME            STATUS     AGE       VERSION
kube-master-1   Ready      21h       v1.7.2
kube-master-2   NotReady   20h       v1.7.2
kube-master-3   Ready      20h       v1.7.2
kube-worker-1   Ready      17h       v1.7.2
kube-worker-2   Ready      17h       v1.7.2

2. Các bước phục hồi HA

Tạo nút Kubernetes mới và nối nó vào cụm làm việc. Thêm master labelstaints , cấu hình hoặc bằng cách sử dụng kubectl :

kubectl label nodes kube-master-4 node-role.kubernetes.io/master=
kubectl taint nodes kube-master-4 node-role.kubernetes.io/master=:NoSchedule

Tiếp theo, hãy đăng nhập vào một trong các Kubernetes master đang hoạt động và sao chép cấu hình sang Kubernetes master mới. Thông thường, điều này có thể được thực hiện bằng cách sao chép thư mục từ bản gốc đang hoạt động sang bản gốc mới: /etc/kubernetes

Certificates, kube-apiserver, kube-controller-manager, và cả kube-scheduler configurations phải được sao chép sang bản gốc mới. Nếu chúng được xác định là dịch vụ hệ thống, hãy đảm bảo rằng tất cả các dịch vụ đã khởi động đúng cách. Nếu chúng được chạy bằng cách sử dụng kubelet bên trong thư mục /etc/kubernetes/manifests , hãy khởi động lại dịch vụ kubelet rồi sử dụng các lệnh docker ps -adocker logs để đảm bảo rằng các dịch vụ đã khởi động đúng cách.

Khi bản master node mới đang hoạt động, hãy đảm bảo đã xóa đi bản master node bị lỗi:

$ kubectl delete nodes kube-master-2
node "kube-master-2" deleted

Cập nhật bộ cân bằng tải API Kubernetes của bạn bằng cách xóa Địa chỉ IP của master node bị lỗi và thêm Địa chỉ IP của master node mới.

3. Các bước khôi phục thành phần Non-HA

Nếu Kubernetes không chạy ở chế độ HA và master node Kubernetes duy nhất bị lỗi thì cụm Cluster cũng sẽ ngừng hoạt động.

Nếu bạn vẫn có quyền truy cập vào ổ đĩa hoặc ảnh chụp nhanh, hãy thử khôi phục thư mục cấu hình Kubernetes chứa chứng chỉ chính Kubernetes gốc. Thông thường đây là thư mục /etc/kubernetes .

Giả sử ETCD vẫn còn nguyên, hãy tạo Kubernetes master node mới trỏ đến cụm ETCD node hiện có. Sử dụng các chứng chỉ đã được khôi phục trên bản master node mới. Đảm bảo rằng kube-apiserver, kube-controller-manager, và kube-scheduler đang chạy trên bản master node mới,

Đăng nhập vào từng worker nodes và cập nhật cấu hình kubelet để trỏ đến Kubernetes master node mới. Thông thường, tệp này được tìm thấy ở /etc/kubernetes/kubelet.conf . Khởi động lại dịch vụ kubelet sau khi đã hoàn tất thay đổi.

Cách khắc phục lỗi "A Kubernetes Worker Node has Failed"

1. Lỗi được phát hiện thế nào?

Giống như việc phát hiện lỗi ở Kubernetes master node, lệnh kubectl get nodes sẽ báo cáo các worker nodes không thể truy cập được như: NotReady

$ kubectl get nodes
NAME            STATUS     AGE       VERSION
kube-master-1   Ready      21h       v1.7.2
kube-master-2   Ready      20h       v1.7.2
kube-master-3   Ready      20h       v1.7.2
kube-worker-1   Ready      17h       v1.7.2
kube-worker-2   NotReady   17h       v1.7.2

2. Các bước phục hồi

Kubernetes sẽ tự động lên lịch lại các nhóm bị lỗi trên các node khác trong cụm Cluster. Bạn hãy tạo một worker mới để thay thế cho worker nodes bị lỗi và nối nó vào cụm Kubernetes. Khi worker mới đang hoạt động, hãy xóa cái worker cũ bị lỗi đi bằng cách:

$ kubectl delete nodes kube-worker-2
node "kube-worker-2" deleted

Vậy là bạn đã hoàn thành việc khắc phục các lỗi thường gặp trên các cụm Kubernetes Cluster rồi.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí