개요
이번에 한번 서버가 죽고 난 이후 현재 서버상태를 주기적으로 Github에 올릴 수 있는 로직을 만들어보았습니다.
Rust도 공부할겸 기초적인 문법을 통해서 한번 진행해보았습니다.
결과물
https://github.com/lucia-land/server-status
GitHub - lucia-land/server-status
Contribute to lucia-land/server-status development by creating an account on GitHub.
github.com
일단은 짧게나마 Rust로 작성해보았습니다.
Rust로 작성한 이유는 홈서버인 만큼 메모리 효율성이 가비지 컬렉터에 의존하지 않는 서비스를 올리고 싶었습니다.
물론 아직 숙련도 이슈로인해 제대로 관리는 못하겠지만 말이죠 ㅎㅎ...ㅜ
동작 로직
동작 로직은 매우 간단합니다. main.rs에서 API요청 하는 로직을 mod로 추가해서 10분마다 K8S API Call을 진행합니다.
./kube/config를 확인해 홈서버에 APIServer로 요청을 보내고 값을 돌려받으면 그 값을 토대로 status.log를 내보냅니다.

간략 설명
라이센스
라이센스는 MIT 라이센스를 따릅니다.
MIT License
Copyright (c) 2024 server-status
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
cargo.toml
[package]
name = "server-status"
version = "0.1.0"
edition = "2024"
[dependencies]
anyhow = "1.0.100"
chrono = "0.4.42"
k8s-openapi = { version = "0.26.0", default-features = false, features = ["v1_30"] }
kube = { version = "2.0.1", features = ["runtime", "derive"] }
serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1.0.145"
tokio = { version = "1.47.1", features = ["full"] }
log = "0.4"
env_logger = "0.11"
toml파일은 직접 한줄 한줄 패키지를 add시키면서 검수했습니다.
현재 제 환경이 window인 만큼 조금 더 Cross Build를 하지 않게끔 설정하려고 노력했습니다.
main
mod cron_action;
use tokio::time::{interval, Duration};
use chrono::Local;
use anyhow::Result;
use std::io::Write;
우선 mod를 통해 cron_action이라는 k8s api 요청을하는 파일을 불러왔습니다.
이후 github_push라는 모듈도 추가할 예정인 만큼 한줄 정도 여유를 뒀습니다.
그 외로는 tokio라는 국룰 비동기 라이브러리를 추가했네요..
#[tokio::main]
async fn main() -> Result<()> {
let mut ticker = interval(Duration::from_secs(60 * 10));
loop {
ticker.tick().await;
let local_now = Local::now();
println!("[{local_now}] Collecting cluster status...");
match cron_action::collect_pod_status().await {
Ok(pods) => {
let log_entry = format!("[{}] Pod Status Check:\n{}\n---\n",
local_now, pods.join("\n"));
std::fs::OpenOptions::new()
.create(true)
.append(true)
.open("status.log")?
.write_all(log_entry.as_bytes())?;
println!("✅ Logged {} pod statuses to status.log", pods.len());
}
Err(e) => {
let error_log = format!("[{}] ERROR: {}\n", local_now, e);
std::fs::OpenOptions::new()
.create(true)
.append(true)
.open("status.log")?
.write_all(error_log.as_bytes())?;
eprintln!("❌ Error: {e}");
}
}
}
}
async fn문을 사용하기 위해서는 tokio를 추가해야하더군요ㅜ
10분마다 일정하게 한번씩 작업을 순차적으로 해야하는 만큼 비동기 프로그래밍 작업을 하는게 추후 확장성 측면에서 좋다고 판단했습니다..! (이건 상당히 개인적인 로드맵이기 때문에...)
결론
루프를 돌면서 10분마다 k8s용 모듈이 트리거 되고 리턴으로 Ok에 값이 날라오면 그 값을 status.log로 파일 시스템을 오픈해 저장 후 성공 로그를 print하는 코드입니다..!
(무척 짧고 쉽죠?)
향후 계획
아쉽게도 현재는 아직 서비스 형태로 올라와있진 않습니다.
오늘이나 내일 중으로 서비스 형태로 올리기 전에 AI를 통해 리뷰를 좀 더 받고 올려볼까 합니다.
그리고 Rust를 좀 더 공부해서 status.log파일을 주기적으로 github에 public하게 자동으로 올릴 수 있도록 설정하고자 계획 중에 있습니다.
물론 좀 더 생각해보면 서비스, 인그레스등과 같은 주요 컴포넌트도 모니터링하는게 맞을 것 같아서 점점 확장해볼까 합니다.
보안이 무척이나 중요한 만큼 vault같은 서비스를 먼저 K8S에 띄우고 그 이후에 github deploykey를 올려서 설정해야겠습니다.
그 전에! 이렇게 한 내용을 좀 더 그 즉시 즉시 기록할 수 있게끔 K8S에 Jira, 컨플을 내부에 띄워볼 예정입니다.
여담
사실 코드를 혼자 열심히 써보다가 컴파일 오류도 아니고 로직을 어떻게 짜야하는지 비동기는 어떻게 쓰는지를 모르겠어서 결국 초기엔 손 안대고 혼자 해보려고했던 계획과 다르게 GPT와 상담을 해버렸습니다....(저 특유의 이모지들은 GPT짓입니다 ㅜㅜ)
아직은 rust 숙련도가 무척이나 부족한 것도 사실이고 이렇게 부족한걸 어떻게 다듬을지를 모르겠어서 냅다 만들어봤습니다.
결국 숙련도를 늘리기 위해선 제가 주로하는 인프라쪽이랑 좀 더 관련지어 이제는 점점 서버프로그래밍 쪽으로 좀 더 여러가지를 다뤄봐야겠습니다.
커널 파라미터를 튜닝하는 프로그램이라던지 좀 더 다양하게 알아볼 필요가 있겠더라고요...ㅜㅜ
또한 아무래도 고가용성 및 안정성을 위해 저렴한 UPS같은걸 하나 구비할까 합니다.
합쳐서 그래도 몇십만원은 나갈거 같긴한데 눈물 나지만 구매해야죠 뭐...
