1편에서 이어진다.
영상에서의 텍스트 추출은 Voice2Text를 사용했으며, 텍스트의 정리는 ChatGPT의 도움을 받았다.
Golang으로 서버 모니터링 툴 개발
https://youtu.be/U5AQkycrvaU?si=TdO5LE4WBT6IeXIq
1. 발표 개요
- 발표자: 최정민 (Watemless, DevOps 엔지니어)
- 주제: Golang을 활용한 서버 모니터링 툴 개발
- 핵심 내용:
- 서버 모니터링의 개념과 필요성
- Golang을 선택한 이유
- 기본적인 서버 모니터링 아키텍처
- Golang을 활용한 데이터 수집 및 저장 방식
- 실제 데모 시연
2. 서버 모니터링이란?
- 서버 상태를 관찰하는 것
- 대표적인 모니터링 항목
- CPU 사용량
- 메모리 사용량
- 디스크 I/O
- 네트워크 상태
3. 왜 Golang으로 서버 모니터링 툴을 만들었는가?
✅ 1) 크로스 컴파일 가능 → Windows, Linux, macOS 모두 지원
✅ 2) 바이너리 실행 파일로 배포 가능 → 경량화된 실행 가능
✅ 3) 비동기 처리(Goroutine) 지원 → 성능 최적화
4. 서버 모니터링 기본 구조
✅ 데이터 수집 → 저장 → 시각화 → 알람
📌 데이터 수집 방식
- Linux 서버에서 /proc 디렉토리 활용
- /proc/stat: CPU 사용량 수집
- /proc/loadavg: CPU 부하량 수집
- /proc/meminfo: 메모리 사용량 수집
📌 데이터 저장 방식
- InfluxDB 사용 (시계열 데이터베이스)
- 시간별로 변하는 데이터를 저장 및 분석 가능
📌 시각화
- InfluxDB의 기본 UI 활용
- Grafana와 같은 다른 대시보드 툴과 연동 가능
📌 알람 시스템
- 특정 임계치를 초과하면 Slack 알람 전송
5. 코드 및 동작 방식
✅ Goroutine을 활용한 비동기 데이터 수집
- CPU 모니터링과 메모리 모니터링을 개별 고루틴에서 실행
- 10초마다 데이터를 수집하여 InfluxDB에 저장
✅ 파일 읽기 방식
- os.Open("/proc/stat") 으로 CPU 데이터 읽기
- /proc/meminfo를 읽어 메모리 사용량 분석
✅ 데이터 파싱 후 InfluxDB에 저장
- Golang의 os 및 bufio 패키지를 활용
- 수집된 데이터는 InfluxDB에 time-series 데이터로 저장
✅ Slack 알람 시스템
- 특정 CPU 사용량, 메모리 사용량 초과 시 Slack 메시지 전송
6. 데모 및 결과
- CPU 스트레스 테스트
- CPU 사용량이 100%에 도달하면 Slack 알람 전송
- 메모리 스트레스 테스트
- 메모리 사용량이 설정된 임계치(예: 52%)를 초과하면 Slack 알람 전송
📌 결과:
- 정상적으로 InfluxDB에 데이터가 저장됨
- Slack 알람이 정확한 타이밍에 전송됨
7. 추가 개선점 & 확장 가능성
✅ 디스크 I/O 모니터링 추가
✅ 프로세스별 리소스 사용량 분석 (/proc/[PID]/stat 활용)
✅ SMS, 전화 알람 추가
✅ 멀티 노드 모니터링 지원
📌 최종 요약
✅ Golang으로 경량 & 고성능 서버 모니터링 툴 제작 가능
✅ Linux /proc 디렉토리를 활용한 데이터 수집
✅ InfluxDB를 활용한 시계열 데이터 저장 & 시각화
✅ Slack을 활용한 실시간 알람 시스템 구축
✅ Goroutine으로 성능 최적화된 비동기 모니터링
Go와 K8S로 만드는 Datacenter Autopilot
https://youtu.be/YoG7ac5w6Mg?si=nYl-xNNqps5Lv0tN
1. 발표 개요
- 발표자: 박도형 (현대자동차, 클라우드 플랫폼 개발자)
- 주제: Golang과 Kubernetes를 활용한 데이터센터 자동화
- 핵심 내용:
- 현대자동차의 프라이빗 클라우드 구축 배경
- Golang과 Kubernetes를 활용한 인프라 자동화
- H메탈 (베어메탈 서버 자동화 솔루션)
- Kubernetes Operator 패턴을 활용한 자동화 구현
2. 현대자동차의 클라우드 혁신 배경
- 자동차 산업의 변화 → Software Defined Vehicle(SDV)
- 자동차가 스마트 디바이스가 되면서 클라우드 인프라 중요성 증가
- 현대자동차의 프라이빗 클라우드 "H 클라우드"
- 현대, 기아, 제네시스의 모든 커넥티드 카가 연결됨
3. H 클라우드 아키텍처 개요
✅ H 클라우드 주요 컴포넌트
- H 메탈: 베어메탈 서버 자동화
- HCS: VM 제공 (AWS EC2 유사)
- HKS: Kubernetes 클러스터 제공 (AWS EKS 유사)
- H53: DNS 관리 서비스 (AWS Route 53 유사)
- HLB: 로드 밸런서 서비스 (AWS ELB 유사)
- H2O: 오브젝트 스토리지 (AWS S3 유사)
- 허블: 로깅 & 모니터링 시스템
- 소나: 헬스 체크 서비스
4. H메탈 (베어메탈 자동화 솔루션)
✅ H메탈이 필요한 이유?
- AI & 빅데이터 워크로드에서 고성능 베어메탈 서버 요구 증가
- 기존 수작업으로 베어메탈을 관리하면 비효율적
- 자동화를 통해 빠르고 안정적인 서버 프로비저닝 가능
✅ H메탈이 제공하는 기능
- 서버 자동 할당 & 프로비저닝
- BIOS 설정, 펌웨어 업데이트
- OS 설치 및 설정 자동화
- 네트워크 및 IP 구성 자동화
- 실시간 모니터링 및 헬스 체크
✅ 데이터센터 자동화 수준
레벨 0 | 모든 작업 수동 |
레벨 1 | 일부 작업 자동화 |
레벨 2 | OS 설치 및 기본 설정 자동화 |
레벨 3 | OS 모니터링 및 검증 자동화 |
레벨 4 | 대부분 자동화 (소수 수동 작업) |
레벨 5 | 완전 자동화 (Datacenter Autopilot) |
🚀 H메탈의 목표: 2025년까지 레벨 5 (완전 자동화) 구현!
5. Golang & Kubernetes Operator를 활용한 자동화
✅ 왜 Kubernetes Operator 패턴을 사용했는가?
1️⃣ Kubernetes는 본질적으로 자동화를 위한 시스템
2️⃣ Operator 패턴을 통해 확장 가능한 API 설계 가능
3️⃣ 컨테이너 기반 인프라와의 높은 호환성
✅ Kubernetes Operator 패턴이란?
- Custom Resource (CR) 를 생성하여 인프라를 선언적으로 관리
- Operator가 Custom Resource를 감지(WATCH)하고 이벤트 처리
- 자동으로 서버 프로비저닝 & 설정 적용
✅ Operator 패턴을 활용한 인프라 자동화 예시
📌 서버 자동 프로비저닝 예제
apiVersion: hcloud.hyundai.com/v1
kind: Server
metadata:
name: gopher-server
spec:
type: c3.medium
hostname: gopher-server
os: rocky-linux-9.2
network:
ip: 192.168.1.100
🛠 동작 방식
1️⃣ 사용자가 Kubernetes에 Custom Resource (CR) 생성
2️⃣ Operator가 변경 감지 후 이벤트 핸들링
3️⃣ 자동으로 베어메탈 서버 할당 및 OS 설치 진행
📌 스위치 네트워크 자동 설정 예제
apiVersion: hcloud.hyundai.com/v1
kind: Switch
metadata:
name: gopher-switch
spec:
hostname: gopher-switch
interfaces:
- name: ethernet1
vlan: 100
ip: 192.168.1.1
🛠 동작 방식
1️⃣ 사용자가 Kubernetes에 Custom Resource (CR) 생성
2️⃣ Operator가 변경 감지 후 네트워크 장비 설정 자동화
✅ Operator 구현 코드 예제 (Golang)
📌 Custom Resource를 감지하고 이벤트 처리 (Reconcile 함수)
func (r *ServerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
var server hcloudv1.Server
if err := r.Get(ctx, req.NamespacedName, &server); err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
}
// 서버 프로비저닝 진행
if err := r.provisionServer(ctx, &server); err != nil {
return ctrl.Result{}, err
}
return ctrl.Result{}, nil
}
📌 Golang 구조체로 Custom Resource 정의
type ServerSpec struct {
Type string `json:"type,omitempty"`
Hostname string `json:"hostname,omitempty"`
OS string `json:"os,omitempty"`
Network struct {
IP string `json:"ip,omitempty"`
} `json:"network,omitempty"`
}
🛠 Operator 실행 흐름 1️⃣ Reconcile 함수가 Custom Resource 변경 감지
2️⃣ 자동으로 서버 프로비저닝 또는 업데이트 실행
3️⃣ 현재 상태를 Custom Resource에 반영
📌 최종 요약
✅ 자동차 산업은 SDV (Software Defined Vehicle) 시대로 변화 중
✅ H 클라우드는 현대자동차의 프라이빗 클라우드로 모든 차량과 연결됨
✅ H메탈은 Golang & Kubernetes를 활용한 베어메탈 서버 자동화 솔루션
✅ Kubernetes Operator 패턴을 활용해 인프라를 선언적으로 관리
✅ 궁극적인 목표는 "Datacenter Autopilot" (완전 자동화)
🚀 현대자동차는 단순한 자동차 기업이 아니라, 소프트웨어 중심 기업으로 변화하고 있다!
API 서버 테스트코드 A - Z 케이스별 효과적인 테스트코드 작성 전략
https://youtu.be/4DqcjCtgQ2k?si=aUpaLjR3JTa9utaY
1. 발표 개요
- 목적: API 서버 개발 시 테스트 코드 작성 경험을 공유하고, 효율적인 테스트 코드 작성 전략을 제시.
- 대상: Go 언어를 사용하는 개발자, 특히 테스트 코드 작성에 어려움을 겪는 분들.
- 주요 내용: Go 테스트 도구 소개, 테스트를 어렵게 만드는 요소, 고클린 아키텍처를 활용한 테스트 전략, 어려운 테스트 케이스 해결 방법.
2. Go 테스트 개요
- 테스트 파일: _test.go 확장자로 작성.
- 테스트 함수: Test로 시작하며, testing.T 타입의 매개변수를 받음.
- 테이블 드리븐 테스팅: 여러 케이스를 테이블 형태로 정의해 중복 코드를 줄이고 효율적으로 테스트.
- CLI 명령어: go test를 통해 테스트 실행, 특정 패키지나 함수만 테스트 가능.
- 커버리지: go tool cover를 통해 테스트 커버리지 확인.
3. 테스트를 어렵게 만드는 요소
- 높은 결합도와 낮은 응집도:
- DB나 외부 API에 강하게 결합된 코드는 테스트하기 어려움.
- 비즈니스 로직과 외부 의존성이 섞인 코드는 테스트 복잡성 증가.
- 복잡한 매개변수와 반환값:
- 매개변수가 많거나 반환값이 복잡하면 테스트 케이스가 늘어나고 가독성이 떨어짐.
- 고루틴과 채널:
- 고루틴의 비동기 특성으로 인해 테스트 시점과 고루틴 종료 시점이 달라 결과가 일관되지 않을 수 있음.
- 채널의 블로킹 특성으로 인해 테스트가 종료되지 않는 문제 발생.
- 외부 의존성:
- DB나 외부 API에 의존하는 코드는 테스트 환경에서 제어하기 어려움.
- 데이터 일관성 유지가 어려움.
- 전역 상태 관리:
- 전역 변수를 사용하면 테스트 시 사이드 이펙트 발생 가능성 증가.
- 코드 구조와 설계:
- 프로젝트가 커질수록 테스트 작성이 어려워짐. 좋은 코드 구조가 선행되어야 함.
4. 고클린 아키텍처를 활용한 테스트 전략
- 고클린 아키텍처: 클린 아키텍처를 Go에 적용한 구조.
- 레이어: 딜리버리, 유즈케이스, 레파지토리, 도메인.
- 특징: 각 레이어는 하위 레이어만 참조하며, 외부 세계와 독립적.
- 장점: 결합도가 낮아 테스트하기 쉬운 구조.
- 테스트 전략:
- 레파지토리 레이어: 외부 의존성(DB, API)을 모킹하거나 도커, 인메모리 DB를 사용해 테스트.
- 유즈케이스 레이어: 비즈니스 로직에 집중, 하위 레이어는 모킹.
- 딜리버리 레이어: HTTP 요청/응답 검증, 프레임워크별 테스트 도구 활용.
5. 어려운 테스트 케이스 해결 방법
- 런타임 시 정해지는 값:
- 시간이나 랜덤 값은 인터페이스로 감싸 제어.
- go-cmp 라이브러리를 사용해 특정 필드 무시.
- 비대해지는 함수:
- 내부 함수를 분리하고 모킹하여 테스트 코드 간소화.
- 고루틴과 채널:
- 채널을 반환값으로 사용해 고루틴의 종료 시점 제어.
- 테스트 코드에서 채널 값을 통해 고루틴 동작 검증.
6. 결론
- 좋은 테스트 코드를 위한 전제: 좋은 코드 구조와 설계가 선행되어야 함.
- 고클린 아키텍처: 테스트하기 쉬운 구조 제공.
- 모킹과 도구 활용: 외부 의존성 제어, 테스트 코드 간소화.
- 고루틴과 채널: 채널을 통해 고루틴 동작 제어.
eBPF 도구를 이용해 Go 애플리케이션 추적하기
https://youtu.be/Wzge0hb_MSE?si=mLJLZKJwIUP1tNmO
1. eBPF란?
- 정의: 운영체제의 기능을 확장하는 프로그래밍 언어와 런타임.
- 특징: 커널 내부에서 실행되며, 커널 API에 자유롭게 접근 가능.
- 용도: 네트워크, 보안, 성능 모니터링 등 다양한 분야에서 사용.
2. eBPF 트레이스 도구
- 목적: eBPF를 쉽게 사용할 수 있도록 도와주는 도구.
- 기능: kprobe, uprobe, tracepoint 등을 활용해 커널 및 사용자 공간의 함수 호출 추적.
- 출력: 히스토그램, 카운트 등 다양한 형태로 데이터 출력.
3. Go 애플리케이션 추적
- 문제점:
- Go는 uprobe와 uretprobe를 사용할 때 제약이 있음 (리턴 주소 변경 시 크래시 발생).
- Go루틴은 OS 스레드를 왔다 갔다 하기 때문에 스레드 ID 기반 추적이 어려움.
- 해결책:
- uprobe와 오프셋을 활용해 함수 종료 시점 추적.
- Go루틴 ID를 직접 추출해 스레드 ID 대신 사용.
4. 실제 추적 예시
- 함수 인자 추적: uprobe를 사용해 함수의 인자를 추적.
- 함수 실행 시간 측정: Go루틴 ID를 활용해 함수의 시작과 종료 시점을 측정.
5. 결론
- eBPF는 강력한 도구지만, Go 애플리케이션 추적 시 몇 가지 제약이 있음.
- uprobe와 Go루틴 ID를 활용해 이러한 제약을 극복할 수 있음.
- eBPF 트레이스 도구를 활용하면 복잡한 추적 작업도 비교적 쉽게 수행 가능.
'컨퍼런스 정리' 카테고리의 다른 글
GopherCon Korea 2024 Day 1 정리 (0) | 2025.03.22 |
---|---|
GopherCon Korea 2023 정리 4편(최종) (0) | 2025.03.18 |
GopherCon Korea 2023 정리 3편 (0) | 2025.03.18 |
GopherCon Korea 2023 정리 1편 (0) | 2025.03.18 |