본문 바로가기

컨퍼런스 정리

GopherCon Korea 2023 정리 2편

728x90

 

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. 테스트를 어렵게 만드는 요소

  1. 높은 결합도와 낮은 응집도:
    • DB나 외부 API에 강하게 결합된 코드는 테스트하기 어려움.
    • 비즈니스 로직과 외부 의존성이 섞인 코드는 테스트 복잡성 증가.
  2. 복잡한 매개변수와 반환값:
    • 매개변수가 많거나 반환값이 복잡하면 테스트 케이스가 늘어나고 가독성이 떨어짐.
  3. 고루틴과 채널:
    • 고루틴의 비동기 특성으로 인해 테스트 시점과 고루틴 종료 시점이 달라 결과가 일관되지 않을 수 있음.
    • 채널의 블로킹 특성으로 인해 테스트가 종료되지 않는 문제 발생.
  4. 외부 의존성:
    • DB나 외부 API에 의존하는 코드는 테스트 환경에서 제어하기 어려움.
    • 데이터 일관성 유지가 어려움.
  5. 전역 상태 관리:
    • 전역 변수를 사용하면 테스트 시 사이드 이펙트 발생 가능성 증가.
  6. 코드 구조와 설계:
    • 프로젝트가 커질수록 테스트 작성이 어려워짐. 좋은 코드 구조가 선행되어야 함.

4. 고클린 아키텍처를 활용한 테스트 전략

  • 고클린 아키텍처: 클린 아키텍처를 Go에 적용한 구조.
    • 레이어: 딜리버리, 유즈케이스, 레파지토리, 도메인.
    • 특징: 각 레이어는 하위 레이어만 참조하며, 외부 세계와 독립적.
    • 장점: 결합도가 낮아 테스트하기 쉬운 구조.
  • 테스트 전략:
    • 레파지토리 레이어: 외부 의존성(DB, API)을 모킹하거나 도커, 인메모리 DB를 사용해 테스트.
    • 유즈케이스 레이어: 비즈니스 로직에 집중, 하위 레이어는 모킹.
    • 딜리버리 레이어: HTTP 요청/응답 검증, 프레임워크별 테스트 도구 활용.

5. 어려운 테스트 케이스 해결 방법

  1. 런타임 시 정해지는 값:
    • 시간이나 랜덤 값은 인터페이스로 감싸 제어.
    • go-cmp 라이브러리를 사용해 특정 필드 무시.
  2. 비대해지는 함수:
    • 내부 함수를 분리하고 모킹하여 테스트 코드 간소화.
  3. 고루틴과 채널:
    • 채널을 반환값으로 사용해 고루틴의 종료 시점 제어.
    • 테스트 코드에서 채널 값을 통해 고루틴 동작 검증.

6. 결론

  • 좋은 테스트 코드를 위한 전제: 좋은 코드 구조와 설계가 선행되어야 함.
  • 고클린 아키텍처: 테스트하기 쉬운 구조 제공.
  • 모킹과 도구 활용: 외부 의존성 제어, 테스트 코드 간소화.
  • 고루틴과 채널: 채널을 통해 고루틴 동작 제어.

eBPF 도구를 이용해 Go 애플리케이션 추적하기

https://youtu.be/Wzge0hb_MSE?si=mLJLZKJwIUP1tNmO

1. eBPF란?

  • 정의: 운영체제의 기능을 확장하는 프로그래밍 언어와 런타임.
  • 특징: 커널 내부에서 실행되며, 커널 API에 자유롭게 접근 가능.
  • 용도: 네트워크, 보안, 성능 모니터링 등 다양한 분야에서 사용.

2. eBPF 트레이스 도구

  • 목적: eBPF를 쉽게 사용할 수 있도록 도와주는 도구.
  • 기능: kprobe, uprobe, tracepoint 등을 활용해 커널 및 사용자 공간의 함수 호출 추적.
  • 출력: 히스토그램, 카운트 등 다양한 형태로 데이터 출력.

3. Go 애플리케이션 추적

  • 문제점:
    • Go는 uprobeuretprobe를 사용할 때 제약이 있음 (리턴 주소 변경 시 크래시 발생).
    • Go루틴은 OS 스레드를 왔다 갔다 하기 때문에 스레드 ID 기반 추적이 어려움.
  • 해결책:
    • uprobe와 오프셋을 활용해 함수 종료 시점 추적.
    • Go루틴 ID를 직접 추출해 스레드 ID 대신 사용.

4. 실제 추적 예시

  • 함수 인자 추적: uprobe를 사용해 함수의 인자를 추적.
  • 함수 실행 시간 측정: Go루틴 ID를 활용해 함수의 시작과 종료 시점을 측정.

5. 결론

  • eBPF는 강력한 도구지만, Go 애플리케이션 추적 시 몇 가지 제약이 있음.
  • uprobe와 Go루틴 ID를 활용해 이러한 제약을 극복할 수 있음.
  • eBPF 트레이스 도구를 활용하면 복잡한 추적 작업도 비교적 쉽게 수행 가능.

 

 

728x90

'컨퍼런스 정리' 카테고리의 다른 글

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