Giaosucan's blog - Chia sẻ kiến thức theo cách bá đạo

Ticker

20/recent/ticker-posts

Project Zeus 05 – Giải pháp Zero down time cho Jenkins

 Tiếp tục phần 4, bài này tiếp tục với câu chuyện của Jenkins

Vào thời kì đầu, Jenkins được deploy trên K8s vẫn theo kiểu truyền thống. Jenkins master chạy trên 1 K8s pod, pod này mount vào 1 PVC volume khoảng 10T.

Sử dụng Persistent Volume (pv) và Persistent Volume Claim (pvc) trong  Kubernetes

Volume này được mount vào thư mục /var/jenkins_home , lưu trữ toàn bộ data, các jobs configuration, build artifact. Có khoảng 20K jobs running hàng ngày, tạo ra một lượng data khổng lồ từ build code artifact đến test data, test reports, sinh ra khoảng 10 G data hàng ngày.

Backup DR

Với lượng dữ liệu lớn như vậy thì việc backup, recover data được team đặc biệt quan tâm, ban đầu việc backup data jenkins được thực hiện theo cách truyền thống là snapshot PVC preodically

Quá trình tạo snapshot như sau

apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshot
metadata:
name: new-snapshot
spec:
volumeSnapshotClassName: csi-aws-vsc
source:
persistentVolumeClaimName: pvc-1
EKS Volume Snapshots

Cũng giống như PVC và PV dùng trong K8s pod, k8s volume snapshot sẽ copy content của pvc tại thời điểm nhất định, incremental change chứ không phải tạo mới toàn bộ PV disk

Như vậy nếu có mất data, thì có thể restore lại volume từ snapshot tại thời điểm nào đó.

Cách trên là cách truyền thống, nhưng chỉ backup được data volume. Vậy làm sao backup được toàn bộ k8s cluster jenkins (namespace, pv, k8s config..)

Velero là giải pháp bổ sung cho phép backup toàn bộ cluster Jenkins . Chi tiết về Velero có thể tra GG, bài này tập trung vào giải pháp thực tế

Có 2 cách backup k8s cluster manuall hoặc schedule

velero backup create <backup_name> <option>

Bạn có thể lựa chọn backup cả namespaces, hoặc backup 1 số resources k8s nào đó tùy ý

velero backup create k8s-jenkins-backup --include-namespaces=jenkins --snapshot-volumes=true

Truyền tham số schedule thì cho phép backup the schedules

Như vậy ngay cả khi namespace jenkins có lỡ tay bị delete, thì vẫn dễ dàng phục hồi băng velero mà không cần tạo lại theo cách thủ công

Clean up data

Với khoảng 10G data sinh ra hàng ngày, thì chỉ sau vài tháng 10T disk sẽ nhanh chóng full và Jenkins sẽ down. Do một cron jobs monitors trạng thái của disk sẽ chạy daily. Job này run lệnh df -h để kiểm tra dung lượng disk. Nếu vượt quá 80% sẽ alert và trigger jobs clean để xóa hết những artifact build older than specific date.

Zero downtime

Mỗi khi nâng cấp tính năng mới, Jenkins master phải restart lại theo cách xóa pod cũ và deploy jenkins master pod từ manifest mới. Cách này dẫn tới Jenkins downtime trong 5 phút. Tuy nhiên, vấn đề là khi jenkins downtime, nhiều jobs đang run dở sẽ bị terminate, khiến họ phải re-run khá bất tiện và nhiều team complaint.

Vậy sao không dùng k8s rollout command để deploy.

Lý thuyết nghe có vẻ dễ, nhưng thực tế không đơn giản như vậy. Tại thời kì đầu xây dựng hệ thống, Jenkins master chỉ mount vào 1 PVC duy nhất. Nếu sử dụng deployment kind của k8s rồi dùng lệnh k8s rollout sẽ không work

Warning FailedAttachVolume attachdetach-controller AttachVolume.Attach failed for volume "jenkins-home" : googleapi: Error 400: RESOURCE_IN_USE_BY_ANOTHER_RESOURCE - The disk resource '***' is already being used by 'jenkins-pool-masters-88b39f60-0viv'

Bởi vì GCP disk không thể share bởi nhiều pod

https://stackoverflow.com/questions/31693529/how-to-share-storage-between-kubernetes-pods

Giải pháp được đưa ra là sử dụng NFS server

Thay vì để k8s pod mount trực tiếp vào GCP disk thì sẽ point vào 1 NFS server.

NFS server này mount GCP disk.

NFS Persistent Volumes | Container Service Extension (CSE)
- name: jenkins-data
nfs:
server: x.x.x.x # NFS Server's Internal IP
path: "/jenkins-data"

Tại Jenkins master manifest, point đến internal IP của server

Bằng cách này, việc rollout jenkins master thành công, Jenkins master không còn bị downtime mỗi khi restart

Giải pháp này không phải là không có nhược điểm, việc đọc ghi data sẽ chậm hơn so với ghi trực tiếp vào disk. Nó cũng giống như bạn copy phim JAV vào USB cắm trực tiếp và ổ cứng mạng

Giải pháp khắc phục thế nào, đọc bài tiếp

Đăng nhận xét

0 Nhận xét