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

Ticker

20/recent/ticker-posts

Một ngày của kĩ sư DevOps

Đà Nẵng, một buổi tối mùa hè nóng như đổ lửa, 11h đêm.


Điều hòa bật 18 độ, quạt chạy vù vù mà a kĩ sư X vẫn mồ hôi nhễ nhại, cái giường gỗ rung lên bần bật kèm với tiếng thở hồng hộc. “Tối hôm nay phải xúc đến chục tấn than chứ không ít” , anh nghĩ thầm

Đang lúc cao trào thì tiếng chuông điện thoại réo liên hồi, tiếng ting ting liên tục từ Microsoft team…

“Móa, trời đánh còn tránh bữa…, gì nữa đây?”

Mở điện thoại, liên tục message, email hiện ra

Bên US vừa thông báo, hệ thống DevOps đang bị tê liệt, bên Developer réo liên hồi

Jenkins pipeline báo lỗi “No disk space left”, các job build không chạy được

Artifactory trục trặc rồi, không thể nào down/up artifact để deploy lên server

Ai help xử lý con server cicd18 cái down rồi…

Mấy thanh niên Dev bên US, Europe kêu la ỏm tỏi. Mấy mẹ QA Ấn Độ thì gáo ré như động kinh

Why this issue happens everytime?

What is the problem here?

I need it fixed ASAP

Why Why What? WTF?

Khác timezone, giờ mình chuẩn bị đi ngủ thì mấy thánh ở bển lại đi làm, đành chịu khó xử lý để tránh ảnh hưởng đến schedule deliver thoai, biết làm sao.

Anh nhào tới bàn máy tính, bỏ mặc em út đang tênh hênh trên giường, khóc rấm rứt

Mở board Jira ticket, hoặc loạt ticket blocker xuất hiện

WAR-XXXX– Jenkins pipeline báo lỗi “No disk space left”,

Hệ thống Jenkins này được deploy trên các cluster K8S của GCP, có Jenkins Dev, QA, UAT deploy trên từng cluster. Mỗi Jenkins có 1 Jenkins master, Jenkins agent sẽ được launch khi run job và terminate khi job finished.

Access vào K8S cluster kiểm tra xem nào

gcloud container clusters get-credentials jenkins-dev --zone us-east1-a --project abc

Access vào jenkins master kiểm tra

kubectl exec -it jenkins-master -n jenkins bash

Kiểm tra disk space xem nào

jenkins@jenkins-master:/$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sdb 6.0T 5.9T xx 99% /var/jenkins_home

Dek, hết dung lượng rồi, jenkins master khi deploy len K8S được mount với GCP volume có dung lượng tận 6T vậy mà giờ đã hết sạch, cái gì đã chiếm nhiều dung lượng đến vậy

Bắt đầu ngồi search GG để tìm hiểu, à đây là cấu trúc thư mục của Jenkins

JENKINS_HOME
+- config.xml (jenkins root configuration)
+- *.xml (other site-wide configuration files)
+- userContent (files in this directory will be served under your http://server/userContent/)
+- fingerprints (stores fingerprint records)
+- nodes (slave configurations)
+- plugins (stores plugins)
+- secrets (secretes needed when migrating credentials to other servers)
+- workspace (working directory for the version control system)
+- [JOBNAME] (sub directory for each job)
+- jobs
+- [JOBNAME] (sub directory for each job)
+- config.xml (job configuration file)
+- latest (symbolic link to the last successful build)
+- builds
+- [BUILD_ID] (for each build)
+- build.xml (build result summary)
+- log (log file)
+- changelog.xml (change log)

Jenkins jobs khi chạy sau nó sẽ lưu lại artifact của Job Build vào jenkins master, artifact này có thể là binary file, image, text tả pì lù. Hệ thống Jenkins hiện tại đã chạy được 5 năm, hàng chục nghìn jobs.

Sort thử dung lượng xem folder nào chiếm disk space

find -type f -exec du -Sh {} + | sort -rh | head -n 5

À có mấy folder jobs chiếm trăm GB lân, vào Jenkins UI kiểm tra mấy job này xem.

WTF, CLGT, một mớ job keep build từ thời napoleong cởi truồng, bảo sao dung lượng chiếm lớn thế


Check thêm một lúc, số Job keep build khá lớn, không thể xóa bằng cơm được

OK, Jenkins có món Jenkins Script Console

Phải viết nhanh một Jenkins script để discard the old build. Tức là Jenkins job có config để keep 1 số lượng build nhất định. Jenkins script này sẽ discard tất cả những build trước một khoảng thời gian nào đó

OK, search GG + lạch cạch lọc cọc 30 phút sau thì xong cái script, paste vô console run trong 1 nốt nhạc.

Nghỉ chút, phi lên giường, đóng thêm vài phát nữa rồi kiểm tra

Ngon roài , jenkins master đã được dọn sạch còn 30%, hết lỗi

Job build được rồi làng nước ơi

Cảm ơn anh X, I LOVE YOU!!!!

You are my man

Tiếng thanh niên bên France gào ré, nghe chữ LOVE YOU mà thấy đau đít roài

Tiếp theo đến ticket thứ 2

Artifactory warning used more 70%

Uầy, lại dính dáng đến vấn để disk space. Lại nói Jenkins job sau khi thực hiện build sẽ lưu binary lên jfrog artifactory repos thành các version, để khi deploy sẽ lấy binary này deploy lên server

Virtual Repositories - JFrog - JFrog Documentation

JFrog artifactory được install trên 1 EC2 server, SSH vào server qua bastion host, check dung lượng bằng lệnh df -h

Đúng là đã hết dung lượng, nhưng mà xóa cái gì đây

JFrog server hiện tại có hàng nghìn repos, hàng ngày Jenkins job build và upload vào repos liên tục nào là npm, docker, rpm đủ loại. Diskspace của artifactory lên tới 16T, tính ra chứa được tới mấy nghìn JAV FullHD thế mà cũng phải chịu thua đống binary artifact của mấy anh Dev.

Sau một lúc mày mò, bằng thời gian làm 1 shot thì cũng tìm ra cách

Artifactory có sử dụng 1 clean up script

https://github.com/jfrog/artifactory-scripts/blob/master/Artifactory-Cleanup.sh

Thực chất là sử dùng Jfrog API để thực hiện clean up những repos không sử dụng trong 1 khoảng thời gian. Đại loại là xóa bớt những artifact binary quá cũ đi để dọn dẹp diskspace

OK, thà giết lầm còn hơn bỏ sót, login terminal gõ cmd enter luôn

Ngồi đợi, lâu vãi lúa, quái lạ diskspace không hề giảm. clgt?

curl -u <USER>:<KEY> "<ADR>/artifactory/api/storageinfo"| jq '.fileStoreSummary'

API chạy mãi không thấy gì, access vô system log của artifact , log vẫn print đều đều

parser/package.json, 66260/514440 total 195837054775 bytes
2021-04-26 09:02:32,662 [https-jsse-nio-127.0.0.1-8443-exec-778] [INFO ] (artifactCleanup :138) - Deleting .....

Lạ quá, xóa thì nó đi đâu, vò đầu bứt tai, tiếng message vẫn nhéo liên hồi tự mẹ Ấn Độ

Tôi không push binary lên được, artifactory vẫn không hoạt động

Do it ASAP, I need a call …

Đứng dậy đi lại, ngó vô cái thùng rác chứa đầy BCS

móa bẩn quá phải đi đổ thôi

Bỗng một tia sáng lóe lên, thùng rác

JFrog artifactory sử dụng Trash Can, các file delete được bỏ vào đây trước để có thể restore khi cần. Chức năng tương tự như recycle bin của Windows

Nhanh như 1 cơn gió, kiểm tra Trash Can, đúng mịa rồi, nó bỏ vô đây trước

OK này thì empty trash can

#!/bin/bash

curl -u <USER>:<API_KEY> <ADR>/api/storage/auto-trashcan | jq -r '.children[].uri' > artifacts.txt

cat artifacts.txt | while read LINE; do
echo $LINE
curl -X DELETE -v -u <USER>API_KEY> <ADR>/api/trash/clean$LINE
done

Script run chứng dập bã trầu, artifactory diskspace trở nên trống hoác như cái hang

WOW, you save my life!!!!

Amading gút chóp!!!

Mẹ Ấn Độ đổi giọng nhanh hơn cả lật bánh tráng.

Anh kĩ sư X thở dài đã 2h sáng, lặng lẽ đặt lưng xuống giường.

Một ngày của kĩ sư DevOps là như vại đấy

Đăng nhận xét

5 Nhận xét

  1. Em cứ ngỡ bác làm back end cơ, nhưng hóa ra bác làm Devops

    Trả lờiXóa
  2. hi anh. cho em hỏi nếu dùng jenkins trên k8s thì có build dc cho iOS app ko nhỉ? Vì theo em biết muốn build đc iOS thì phải có image của macOS

    Trả lờiXóa
    Trả lời
    1. ko rành ios lắm nhưng cần build jenkins agent là macOS

      Xóa
  3. Daily work kiểu này là của mấy ông IT-Ops chứ k phải của DevOps nhá thanh niên.
    Monitoring system để đâu mà để HDD đến 99% ?

    Trả lờiXóa