+47

[K8S] Phần 19 - Backup và restore etcd trên k8s

Lời tựa

Hello mọi người đã trở lại với series về Kubernetes của mình. Qua loạt bài trước mình đã chia sẻ quá trình dựng lab kubernetes và cài đặt đủ thứ cho nó rồi.

Đến đây có một vấn đề rất quan trọng các bạn cần lưu ý, đó là phải backup lại hệ thống định kỳ. Nếu không may một ngày đẹp trời mà hệ thống nó sập thì còn có cọc để mà bám vào 😄

Mô hình cài đặt của mình đang có 3 master node (tương ứng với cụm etcd cluster có 3 node) và 3 worker node. Một node CICD bên ngoài k8s để lưu trữ tập trung các file cài đặt lên k8s.

Trong bài hôm nay mình sẽ chia sẻ với các bạn về cách backup hệ thống kubernetes bằng cách snapshot ETCD để dễ dàng khôi phục hệ thống khi có sự cố nhé!

image.png

ETCD là gì

Etcd là một CSDL dạng key-value được dùng để lưu dữ liệu về hệ thống, tài nguyên và cấu hình của kubenetes cluster. Khi bạn tạo mới các ứng dụng bao gồm những deployment, pod, service.. thì những thông tin định nghĩa này sẽ được lưu vào etcd.

Etcd được chạy dưới dạng cluster và số lượng member trong cluster là lẻ. Theo tài liệu của etcd thì recommand cho production là nên cài 5 node etcd để đảm bảo tính sẵn sàng (availability). Trong ví dụ sử dụng hôm nay mình có etcd gồm 3 member.

Để thao tác với etcd thì mình recommand sử dụng etcdctl, nó tương tự như chúng ta dùng kubectl để giao tiếp với k8s vậy. Để sử dụng thì ta cần cài đặt và cấu hình certificate cho nó có thể kết nối được tới etcd cluster.

Cú pháp sử dụng etcdctl như sau:

ETCDCTL_API=3 etcdctl <etcd-command> \
--endpoints=https://127.0.0.1:2379 \
--cacert=<trusted-ca-file> \
--cert=<cert-file> \
--key=<key-file>

Cài đặt và sử dụng etcdctl

Cài đặt etcdctl

Ở đây do toàn bộ các node của mình đều cài centos7 nên mình cũng hướng dẫn cài etcdctl trên centos7. Với các OS khác các bạn hoàn toàn có thể tự cài được tương tự.

Ở đây mình thao tác trên node CICD nhé, để tách biệt với các máy chủ cài k8s.

Trước hết ta tạo thư mục cài đặt:

[sysadmin@vtq-cicd ~]$ mkdir -p /home/sysadmin/kubernetes_installation/etcd_backup
[sysadmin@vtq-cicd ~]$ cd /home/sysadmin/kubernetes_installation/etcd_backup
[sysadmin@vtq-cicd etcd_backup]$

Cài đặt một số gói phần mềm phụ trợ như curl, wget..

[sysadmin@vtq-cicd etcd_backup]$ sudo yum -y install wget curl

Download gói cài đặt của etcd trên centos:

curl -s https://api.github.com/repos/etcd-io/etcd/releases/latest \
  | grep browser_download_url \
  | grep linux-amd64 \
  | cut -d '"' -f 4 \
  | wget -i -

Copy các file binary vào thư mục chứa file thực thi của hệ điều hành:

cd /home/sysadmin/kubernetes_installation/etcd_backup
tar xvf etcd-v*.tar.gz
cd etcd-*/
sudo cp etcd* /usr/local/bin/
sudo cp etcd* /usr/bin/
cd ..
rm -rf etcd*

Kiểm tra phiên bản của etcdctl:

[sysadmin@vtq-cicd etcd_backup]$ etcdctl version
etcdctl version: 3.5.5
API version: 3.5

Như vậy là ta đã cài đặt xong etcdctl lên node cicd rồi. Việc tiếp theo là cấu hình cho nó kết nối được etcd cluster của cụm k8s của chúng ta.

Cấu hình etcdctl

Để kết nối tới etcd cluster ta cần các thông tin như: IP/Port của etcd endpoints, các file cert sử dụng để kết nối.

Để lấy các thông tin này, ta có thể lấy từ mô tả của pod kube-api-server, vì nó là thành phần kết nối trực tiếp với etcd trong k8s cluster.

Thực hiện lệnh sau để lấy các tham số command của kube-api-server (lưu ý tên pod đúng với cluster của bạn nhé):

kubectl -n kube-system get pod kube-apiserver-viettq-master1 -o=jsonpath='{.spec.containers[0].command}' |jq |grep etcd

Kết quả thu được:

  "--etcd-cafile=/etc/ssl/etcd/ssl/ca.pem",
  "--etcd-certfile=/etc/ssl/etcd/ssl/node-viettq-master1.pem",
  "--etcd-keyfile=/etc/ssl/etcd/ssl/node-viettq-master1-key.pem",
  "--etcd-servers=https://192.168.10.11:2379,https://192.168.10.12:2379,https://192.168.10.13:2379",
  "--storage-backend=etcd3",

Như vậy ta đã có thông tin các etcd endpoints và đường dẫn tới các file cert trên node master1. Giờ trên node cicd này, ở thư mục chúng ta từ tạo (/home/sysadmin/kubernetes_installation/etcd_backup) ta lần lượt tạo ra 3 file:

  • File ca.pem và copy nội dung cho nó từ file /etc/ssl/etcd/ssl/ca.pem trên node viettq-master1
  • File cert.pem và copy nội dung cho nó từ file /etc/ssl/etcd/ssl/node-viettq-master1.pem trên node viettq-master1
  • File key.pem và copy nội dung cho nó từ file /etc/ssl/etcd/ssl/node-viettq-master1-key.pem trên node viettq-master1

Kết quả sẽ như sau (lưu ý quyền và owner của các file này nhé):

[sysadmin@vtq-cicd etcd_backup]$ ls -lrt
total 12
-rw-rw-r-- 1 sysadmin sysadmin 1679 Sep 22 23:37 ca.pem
-rw-rw-r-- 1 sysadmin sysadmin 1444 Sep 22 23:37 cert.pem
-rw-rw-r-- 1 sysadmin sysadmin 1090 Sep 22 23:49 key.pem

Giờ thì ta có thể bắt đầu thao tác với etcdctl với thông số như sau:

ETCDCTL_API=3 etcdctl [some-command] \
--endpoints=https://192.168.10.11:2379 \
--cacert=/home/sysadmin/kubernetes_installation/etcd_backup/ca.pem \
--cert=/home/sysadmin/kubernetes_installation/etcd_backup/cert.pem \
--key=/home/sysadmin/kubernetes_installation/etcd_backup/key.pem

Hoặc chạy cách sau cũng tương tự:

export ETCDCTL_CACERT=/home/sysadmin/kubernetes_installation/etcd_backup/ca.pem
export ETCDCTL_CERT=/home/sysadmin/kubernetes_installation/etcd_backup/cert.pem
export ETCDCTL_KEY=/home/sysadmin/kubernetes_installation/etcd_backup/key.pem
export ETCDCTL_API=3
etcdctl [some-command]

Trước hết, ta kiểm tra danh sách node trong etcd cluster bằng lệnh "member list" như sau:

ETCDCTL_API=3 etcdctl member list --endpoints=https://192.168.10.11:2379 \
--cacert=/home/sysadmin/kubernetes_installation/etcd_backup/ca.pem \
--cert=/home/sysadmin/kubernetes_installation/etcd_backup/cert.pem \
--key=/home/sysadmin/kubernetes_installation/etcd_backup/key.pem

Kết quả:

8b0ca30665374b0, started, etcd3, https://192.168.10.13:2380, https://192.168.10.13:2379, false
2106626b12a4099f, started, etcd2, https://192.168.10.12:2380, https://192.168.10.12:2379, false
c6702130d82d740f, started, etcd1, https://192.168.10.11:2380, https://192.168.10.11:2379, false

Lấy danh sách key của etcd:

ETCDCTL_API=3 etcdctl get / --prefix --keys-only --endpoints=https://192.168.10.11:2379 \
--cacert=/home/sysadmin/kubernetes_installation/etcd_backup/ca.pem \
--cert=/home/sysadmin/kubernetes_installation/etcd_backup/cert.pem \
--key=/home/sysadmin/kubernetes_installation/etcd_backup/key.pem

Một số resource được lưu trong etcd như sau:

/registry/daemonsets/kube-system/kube-proxy
/registry/daemonsets/kube-system/nodelocaldns

/registry/deployments/cattle-system/cattle-cluster-agent
/registry/deployments/ingress/ingress-nginx-ingress-controller
/registry/deployments/storage/nfs-storage-delete-nfs-client-provisioner

/registry/endpointslices/ingress/apple-service-kx9dv
/registry/endpointslices/ingress/ingress-nginx-ingress-controller-7b4hw

/registry/ingress/ingress/apple.dev.viettq.com
/registry/ingress/ingress/apple.prod.viettq.com
/registry/ingress/ingress/banana.prod.viettq.com

/registry/ingressclasses/nginx

/registry/masterleases/192.168.10.11
/registry/masterleases/192.168.10.12
/registry/masterleases/192.168.10.13

/registry/minions/viettq-master1
/registry/minions/viettq-master2
/registry/minions/viettq-master3
/registry/minions/viettq-worker1
/registry/minions/viettq-worker2
/registry/minions/viettq-worker3

/registry/namespaces/cattle-system
/registry/namespaces/default
/registry/namespaces/fleet-system
/registry/namespaces/ingress
/registry/namespaces/kube-node-lease
/registry/namespaces/kube-public

/registry/persistentvolumeclaims/storage/test-pvc-delete
/registry/persistentvolumes/pvc-d8c24be8-0449-4e2d-907e-b50c6c2d9ff3

/registry/pods/ingress/apple-app
/registry/pods/ingress/banana-app
/registry/pods/ingress/ingress-nginx-ingress-controller-546fb6d5f-cn9dr
/registry/pods/storage/nfs-storage-delete-nfs-client-provisioner-5b7c76bb6-lpvlm
/registry/pods/storage/nfs-storage-delete-nfs-client-provisioner-5b7c76bb6-r49k6
/registry/pods/storage/nfs-storage-delete-nfs-client-provisioner-5b7c76bb6-w28cz

/registry/replicasets/ingress/ingress-nginx-ingress-controller-546fb6d5f
/registry/replicasets/storage/nfs-storage-delete-nfs-client-provisioner-5b7c76bb6
/registry/replicasets/storage/nfs-storage-retain-nfs-client-provisioner-5f8d88b89d

/registry/rolebindings/cattle-system/clusterrolebinding-2bsqr
/registry/rolebindings/cattle-system/clusterrolebinding-4rx84

/registry/roles/ingress/ingress-nginx-ingress-controller

/registry/secrets/cattle-system/cattle-credentials-001603a

/registry/serviceaccounts/ingress/default
/registry/serviceaccounts/storage/nfs-storage-delete-nfs-client-provisioner
/registry/serviceaccounts/storage/nfs-storage-retain-nfs-client-provisioner

/registry/services/endpoints/default/kubernetes
/registry/services/endpoints/ingress/apple-service
/registry/services/endpoints/ingress/banana-service
/registry/services/endpoints/ingress/ingress-nginx-ingress-controller

/registry/services/specs/default/kubernetes
/registry/services/specs/ingress/apple-service
/registry/services/specs/ingress/banana-service
/registry/services/specs/ingress/ingress-nginx-ingress-controller

/registry/storageclasses/viettq-nfs-delete
/registry/storageclasses/viettq-nfs-retain

/registry/clusterrolebindings/clusterrolebinding-62tv2
/registry/clusterrolebindings/clusterrolebinding-9dgc7
/registry/clusterrolebindings/clusterrolebinding-9fqxd

/registry/clusterroles/admin
/registry/clusterroles/cattle-admin
/registry/clusterroles/cluster-admin

/registry/configmaps/cattle-system/kube-root-ca.crt
/registry/configmaps/cattle-system/rancher-charts-fjf2r
/registry/configmaps/cattle-system/rancher-partner-charts-dvxgd

Ta lấy value của một key ta thực hiện lệnh get:

ETCDCTL_API=3 etcdctl get /registry/deployments/storage/nfs-storage-delete-nfs-client-provisioner \
--endpoints=https://192.168.10.11:2379 \
--cacert=/home/sysadmin/kubernetes_installation/etcd_backup/ca.pem \
--cert=/home/sysadmin/kubernetes_installation/etcd_backup/cert.pem \
--key=/home/sysadmin/kubernetes_installation/etcd_backup/key.pem

Như vậy chúng ta đã cài đặt/cấu hình etcdctl và thực hiện các thao tác cơ bản với etcd cluster trên k8s rồi. Tiếp theo ta sẽ thực hiện backup/restore cho etcd.

Backup và restore etcd

Kịch bản test chức năng backup/restore như sau:

  • Trước khi backup, ta sẽ cài một vài ứng dụng lên
  • Thực hiện backup
  • Sửa/xóa ứng dụng đã cài ở bước trên
  • Thực hiện restore ==> Expect ứng dụng trở lại cấu hình như ban đầu trước khi sửa/xóa

Cài đặt ứng dụng

Mình sẽ tạo một namespace mới là demo-backup-restore

[sysadmin@vtq-cicd apps]$ kubectl create ns demo-backup-restore
namespace/demo-backup-restore created

Sau đó cài đặt một ứng dụng nodejs lên đó như sau:

[sysadmin@vtq-cicd apps]$ kubectl -n demo-backup-restore apply -f deployment.yaml
deployment.apps/node-app-deployment created
[sysadmin@vtq-cicd apps]$ kubectl -n demo-backup-restore get pods
NAME                                   READY   STATUS    RESTARTS   AGE
node-app-deployment-75c7c88b58-6sksd   1/1     Running   0          13m
node-app-deployment-75c7c88b58-9d2c9   1/1     Running   0          13m
node-app-deployment-75c7c88b58-sglrc   1/1     Running   0          13m

Ở đây các bạn tạo ựng dụng bất kỳ nhé, có thể là deployment hay pod hay service.. Vì mục tiêu của mình là tạo xong sẽ backup lại etcd và xóa các ứng dụng đó đi. Sau đó restore lại etcd thì các ứng dụng đó cũng sẽ được restore.

Backup etcd dùng snapshot

Thực hiện backup etcd:

ETCDCTL_API=3 etcdctl snapshot save /home/sysadmin/kubernetes_installation/etcd_backup/etcd_snapshot \
--endpoints=https://192.168.10.11:2379 \
--cacert=/home/sysadmin/kubernetes_installation/etcd_backup/ca.pem \
--cert=/home/sysadmin/kubernetes_installation/etcd_backup/cert.pem \
--key=/home/sysadmin/kubernetes_installation/etcd_backup/key.pem

Kết quả của lệnh backup trên là lưu snapshot của etcd ra file /home/sysadmin/kubernetes_installation/etcd_backup/etcd_snapshot:

{"level":"info","ts":"2022-09-22T23:57:32.300-0400","caller":"snapshot/v3_snapshot.go:65","msg":"created temporary db file","path":"/home/sysadmin/kubernetes_installation/etcd_backup/etcd_snapshot.part"}
{"level":"info","ts":"2022-09-22T23:57:32.308-0400","logger":"client","caller":"v3/maintenance.go:211","msg":"opened snapshot stream; downloading"}
{"level":"info","ts":"2022-09-22T23:57:32.309-0400","caller":"snapshot/v3_snapshot.go:73","msg":"fetching snapshot","endpoint":"https://192.168.10.11:2379"}
{"level":"info","ts":"2022-09-22T23:57:32.785-0400","logger":"client","caller":"v3/maintenance.go:219","msg":"completed snapshot read; closing"}
{"level":"info","ts":"2022-09-22T23:57:32.942-0400","caller":"snapshot/v3_snapshot.go:88","msg":"fetched snapshot","endpoint":"https://192.168.10.11:2379","size":"50 MB","took":"now"}
{"level":"info","ts":"2022-09-22T23:57:32.942-0400","caller":"snapshot/v3_snapshot.go:97","msg":"saved","path":"/home/sysadmin/kubernetes_installation/etcd_backup/etcd_snapshot"}
Snapshot saved at /home/sysadmin/kubernetes_installation/etcd_backup/etcd_snapshot

Verify lại kết quả backup:

ETCDCTL_API=3 etcdctl --write-out=table snapshot status /home/sysadmin/kubernetes_installation/etcd_backup/etcd_snapshot \
--endpoints=https://192.168.10.11:2379 \
--cacert=/home/sysadmin/kubernetes_installation/etcd_backup/ca.pem \
--cert=/home/sysadmin/kubernetes_installation/etcd_backup/cert.pem \
--key=/home/sysadmin/kubernetes_installation/etcd_backup/key.pem

Thông tin của bản snapshot được hiển thị như sau:

Deprecated: Use `etcdutl snapshot status` instead.

+----------+----------+------------+------------+
|   HASH   | REVISION | TOTAL KEYS | TOTAL SIZE |
+----------+----------+------------+------------+
| 9bd9b496 |  1071549 |       2370 |      50 MB |
+----------+----------+------------+------------+

Như vậy là ta đã backup etcd thành công!

Sửa/xóa ứng dụng sau khi backup

Vì trong bài lab này mình có tạo một deployment có 3 pod, giờ mình sẽ xóa nó đi để lát nữa thử restore lại xem được không nhé:

[sysadmin@vtq-cicd apps]$ kubectl -n demo-backup-restore delete -f deployment.yaml
deployment.apps "node-app-deployment" deleted
[sysadmin@vtq-cicd apps]$ kubectl -n demo-backup-restore get pods
NAME                                   READY   STATUS        RESTARTS   AGE
node-app-deployment-75c7c88b58-6sksd   1/1     Terminating   0          17m
node-app-deployment-75c7c88b58-9d2c9   1/1     Terminating   0          17m
node-app-deployment-75c7c88b58-sglrc   1/1     Terminating   0          17m
[sysadmin@vtq-cicd apps]$ kubectl -n demo-backup-restore get pods
No resources found in demo-backup-restore namespace.

Sau bước này mình kiểm tra không còn pod nào của deployment này nữa.

Restore etcd từ bản backup

Rồi, giả sử bước xóa bên trên là "tai nạn", giờ ta cần "chữa cháy" bằng cách restore thì thực hiện như sau:

  • Dùng etcdctl để restore etcd-data từ file snapshot ta đã backup ở bước trên
  • Stop tất cả các instance của kube-api-server trên k8s cluster
  • Thay thế etcd-data hiện tại bằng data từ bản backup
  • Restart các service của k8s
  • Verify lại kết quả thực hiện

Như ban đầu chúng ta có tạo ra một deployment có 3 pod sau đó backup lại etcd. Sau đó chúng ta đã "lỡ tay" xóa mất deployment này. Vậy mục tiêu khi chúng ta restore etcd xong thì deployment này phải được tạo lại tự động cho chúng ta.

Restore etcd data

Chúng ta sẽ dùng file snapshot ở bước trước để restore, nhưng có điểm khác là sẽ restore ra local chứ không phải restore thẳng vào etcd cluster.

Câu lệnh để restore như sau:

export ETCDCTL_CACERT=/home/sysadmin/kubernetes_installation/etcd_backup/ca.pem
export ETCDCTL_CERT=/home/sysadmin/kubernetes_installation/etcd_backup/cert.pem
export ETCDCTL_KEY=/home/sysadmin/kubernetes_installation/etcd_backup/key.pem
export ETCDCTL_API=3
cd /home/sysadmin/kubernetes_installation/etcd_backup/
etcdctl snapshot restore etcd_snapshot

Kết quả thư mục default.etcd được sinh ra ở thư mục hiện tại:

[sysadmin@vtq-cicd etcd_backup]$ pwd
/home/sysadmin/kubernetes_installation/etcd_backup
[sysadmin@vtq-cicd etcd_backup]$ ls -lrt
total 49000
-rw-rw-r-- 1 sysadmin sysadmin     1679 Sep 22 23:37 key.pem
-rw-rw-r-- 1 sysadmin sysadmin     1444 Sep 22 23:37 cert.pem
-rw-rw-r-- 1 sysadmin sysadmin     1090 Sep 22 23:49 ca.pem
drwxrwxr-x 3 sysadmin sysadmin       89 Sep 23 02:38 apps
-rw------- 1 sysadmin sysadmin 50159648 Sep 23 04:19 etcd_snapshot
drwx------ 3 sysadmin sysadmin       20 Sep 23 05:14 default.etcd

NOTE: Lưu ý ở đây chúng ta thực hiện trên local (node CICD) nên không cần tham số endpoint cho câu lệnh restore nhé!

Stop các control plane instance

Việc restore lại etcd hơi phức tạp hơn backup một chút, và các bạn phải hết sức cẩn thận!

NOTE: Để restore etcd thì một điều chú ý là phải stop tất cả các instance của kube-api-server, restore etcd ở tất cả các etcd instance sau đó start lại tất cả instance của kube-api-server!

Nếu các bạn nghĩ có thể dùng lệnh kubectl để stop các pod này thì các bạn sai rồi đấy 😄. Các thành phần control plane đều được triển khai dưới dạng Static Pods. Chúng không được quản lý bởi bất kỳ loại triển khai nào như Deployment, Statefulset hay Daemonset, mà được định nghĩa dạng "tĩnh" trong các file cấu hình dạng yaml nằm ở thư mục /etc/kubernetes/manifests/ trên các master node:

[root@viettq-master1 member]# ll /etc/kubernetes/manifests/
total 16
-rw-------. 1 root root 4330 Sep 12 02:00 kube-apiserver.yaml
-rw-------. 1 root root 3037 Sep 12 01:25 kube-controller-manager.yaml
-rw-------. 1 root root 1619 Sep 12 01:25 kube-scheduler.yaml

Các file cấu hình này được đọc và xử lý bởi kubelet chạy trên các master node. Do đó để stop/delete các static pod này ta đơn giản chỉ cần move chúng ra khỏi thư mục mặc định. Kubelet sẽ scan định kỳ để tìm kiếm sự thay đổi và apply nó. Khi ta remove file khỏi thư mục thì tương ứng kubelet sẽ remove pod đi và ngược lại.

Ta sẽ tạo thư mục /k8s-backup để move các file yaml ra đó, sau khi restore etcd xong ta sẽ move lại để restore service:

[sysadmin@viettq-master1 ~]$ sudo -s
[root@viettq-master1 member]# mkdir /k8s-backup
[root@viettq-master1 sysadmin]# mv /etc/kubernetes/manifests/*.yaml /k8s-backup/
[root@viettq-master1 sysadmin]# ll /k8s-backup/
total 16
-rw-------. 1 root root 4330 Sep 12 02:00 kube-apiserver.yaml
-rw-------. 1 root root 3037 Sep 12 01:25 kube-controller-manager.yaml
-rw-------. 1 root root 1619 Sep 12 01:25 kube-scheduler.yaml
[root@viettq-master1 sysadmin]# ll /etc/kubernetes/manifests/
total 0

Lặp lại bước trên cho 2 node master còn lại trong cluster.

Lưu ý: Sau khi thực hiện bước này thì lệnh kubectl cũng sẽ không hoạt động nữa do ta đã stop hết kube-api-server rồi.

Các bạn có thể verify lại bằng cách kiểm tra các container của api, controller và scheduler đều đã không còn:

[root@viettq-master1 sysadmin]# docker ps -a |egrep "api|schedule|control"

Restore etcd-data từ bản backup

Trước tiên ta cần chuẩn bị sẵn file backup lên các node master. Dữ liệu backup đang được lưu ở trên cicd node ở đường dẫn:

/home/sysadmin/kubernetes_installation/etcd_backup/default.etcd/member

Ta sẽ copy nó sang các master node ở đường dẫn /k8s-backup:

[sysadmin@vtq-cicd member]$ sudo scp -r /home/sysadmin/kubernetes_installation/etcd_backup/default.etcd/member root@viettq-master1:/k8s-backup/
root@viettq-master1's password:
db                                                                                                       100%   48MB  98.0MB/s   00:00
0000000000000001-0000000000000001.snap                                                                   100% 6490    11.1MB/s   00:00
0000000000000000-0000000000000000.wal                                                                    100%   61MB  61.7MB/s   00:00

Lặp lại bước copy này sang 2 node master còn lại. Tới đây thì trên mỗi master node ta đều có ở thư mục /k8s-backup có nội dung như sau:

[root@viettq-master3 sysadmin]# ll /k8s-backup/
total 16
-rw-------. 1 root root 4330 Sep 12 02:01 kube-apiserver.yaml
-rw-------. 1 root root 3037 Sep 12 01:26 kube-controller-manager.yaml
-rw-------. 1 root root 1619 Sep 12 01:25 kube-scheduler.yaml
drwx------. 4 root root   29 Sep 23 05:49 member

Tiếp theo ta sẽ thay thế dữ liệu của etcd hiện tại với dữ liệu từ bản backup (thực hiện trên tất cả master node):

[root@viettq-master3 sysadmin]# mv /var/lib/etcd/member/ /var/lib/etcd/member.bak
[root@viettq-master3 sysadmin]# mv /k8s-backup/member /var/lib/etcd/
[root@viettq-master3 sysadmin]# ll /var/lib/etcd/
total 0
drwx------. 4 root root 29 Sep 23 05:49 member
drwx------. 4 root root 29 Sep 22 06:17 member.bak

Start các control plane instance

Chúng ta chỉ đơn giản move lại các file yaml đã backup ở thư mục /k8s-backup về lại thư mục /etc/kubernetes/manifests/.

Thực hiện các bước dưới đây trên tất cả các master node:

[root@viettq-master1 k8s-backup]# ll /k8s-backup/*.yaml
-rw-------. 1 root root 4330 Sep 12 02:00 /k8s-backup/kube-apiserver.yaml
-rw-------. 1 root root 3037 Sep 12 01:25 /k8s-backup/kube-controller-manager.yaml
-rw-------. 1 root root 1619 Sep 12 01:25 /k8s-backup/kube-scheduler.yaml
[root@viettq-master1 k8s-backup]# mv /k8s-backup/*.yaml /etc/kubernetes/manifests/
[root@viettq-master1 k8s-backup]# systemctl restart docker
[root@viettq-master2 sysadmin]# mv /k8s-backup/*.yaml /etc/kubernetes/manifests/
[root@viettq-master2 sysadmin]# systemctl restart docker
[root@viettq-master3 sysadmin]#  mv /k8s-backup/*.yaml /etc/kubernetes/manifests/
[root@viettq-master3 sysadmin]# systemctl restart docker

Lúc này kiểm tra các bạn sẽ thấy các container của control plane được start lên:

[root@viettq-master1 k8s-backup]# docker ps |egrep "api|schedule|control"
b76c9e8968eb   22d1a2072ec7           "kube-controller-man…"   18 seconds ago   Up 17 seconds             k8s_kube-controller-manager_kube-controller-manager-viettq-master1_kube-system_bc7c0e53757217105c35af4da0e7a233_2
1db1c7cc2cb6   38f903b54010           "kube-scheduler --au…"   20 seconds ago   Up 19 seconds             k8s_kube-scheduler_kube-scheduler-viettq-master1_kube-system_653aeb278187902c4e7f9b0a6eb92385_2
41e32f5cff81   034671b24f0f           "kube-apiserver --ad…"   28 seconds ago   Up 27 seconds             k8s_kube-apiserver_kube-apiserver-viettq-master1_kube-system_7e5cf782ae8a158e0288f1c0e854ded2_2
a2a2de672684   k8s.gcr.io/pause:3.3   "/pause"                 28 seconds ago   Up 27 seconds             k8s_POD_kube-controller-manager-viettq-master1_kube-system_bc7c0e53757217105c35af4da0e7a233_2
0db025948970   k8s.gcr.io/pause:3.3   "/pause"                 28 seconds ago   Up 27 seconds             k8s_POD_kube-scheduler-viettq-master1_kube-system_653aeb278187902c4e7f9b0a6eb92385_2
a7c25c0a8316   k8s.gcr.io/pause:3.3   "/pause"                 28 seconds ago   Up 27 seconds             k8s_POD_kube-apiserver-viettq-master1_kube-system_7e5cf782ae8a158e0288f1c0e854ded2_2

Lúc này k8s đã up trở lại và ta có thể sử dụng kubectl được. Ta kiểm tra các node đã ok hết hay chưa:

[sysadmin@vtq-cicd member]$ kubectl get nodes
NAME             STATUS   ROLES                  AGE   VERSION
viettq-master1   Ready    control-plane,master   11d   v1.20.7
viettq-master2   Ready    control-plane,master   11d   v1.20.7
viettq-master3   Ready    control-plane,master   11d   v1.20.7
viettq-worker1   Ready    <none>                 11d   v1.20.7
viettq-worker2   Ready    <none>                 11d   v1.20.7
viettq-worker3   Ready    <none>                 11d   v1.20.7

Như vậy là hệ thống không bị die, thế là mừng rồi 😄. Nhưng vấn đề quan trọng nhất là cái deployment của chúng ta liệu có được restore hay không thì phải check:

[sysadmin@vtq-cicd member]$ k -n demo-backup-restore get pods
NAME                                   READY   STATUS    RESTARTS   AGE
node-app-deployment-75c7c88b58-glb9r   1/1     Running   0          99m
node-app-deployment-75c7c88b58-ls5f2   1/1     Running   0          99m
node-app-deployment-75c7c88b58-r6pmr   1/1     Running   0          99m

Oh yeah, như vậy là công sức nãy giờ cũng được đền đáp. Etcd đã được restore về trước thời điểm chúng ta "lỡ tay" xóa vài thứ.

Đối với bất cứ hệ thống nào dù to hay nhỏ thì backup DB cho nó luôn là một điều phải ưu tiên hàng đầu. Hy vọng qua bài này các bạn sẽ hiểu rõ hơn về cơ chế quản lý dữ liệu của k8s và nên thực hiện backup etcd định kỳ cho an toàn nhé!

Nếu thấy bài viết hữu ích thì các bạn cho mình một upvote và bookmark bài viết để tạo động lực cho mình tiếp tục có nhiều bài chia sẻ hơn nữa nhé! Cảm ơn các bạn rất nhiều!


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í