26S06g

QK·약 8시간 전

대규모 베어메탈 K8s 클러스터와 에어갭 플랫폼(Cilium, MinIO AIStor, CNPG, OpenEBS 등)을 안정적으로 운영하기 위해서는 문서와 절차가 '형식적인 규정집'에 머물지 않고, GitOps 및 자동화 파이프라인(AWX/ArgoCD)과 1:1로 결합된 '실행 가능한 코드(Everything as Code)' 형태로 관리되어야 합니다.

대규모 클라우드 네이티브 엔터프라이즈 환경의 SRE/DevOps Best Practice를 기반으로 거버넌스 체계(분류 기준), 문서/에셋 맵, 4대 핵심 절차서의 상세 라이프사이클을 구조화했습니다.


1. 운영 관리 프레임워크 분류 (3-Pillar 체계)

문서와 에셋이 서로 섞여 파편화되지 않도록 기준(Baseline) - 절차(Lifecycle) - 에셋(Artifacts)의 3대 축으로 명확히 격리합니다.

┌────────────────────────────────────────────────────────────────────────┐
│                        1. 표준 및 기준 (Standards)                      │
│   - 아키텍처 정의서 (ADR 포함)      - 사용 기능 목록 및 매트릭스          │
│   - 플랫폼 SLA/SLO & 리소스 기준    - 보안/컴플라이언스 기준 (Air-gap)    │
└───────────────────────────────────┬────────────────────────────────────┘
                                    │ 규정 준수 및 자동화 매핑
┌───────────────────────────────────▼────────────────────────────────────┐
│                        2. 운영 절차서 (Procedures / SOP)               │
│   - 성능 관리 (인수/튜닝)           - 설정 관리 (AWX/Helm GitOps)         │
│   - 용량 관리 (Storage/Compute)     - SW 수명주기 관리 (에셋 반입/배포)    │
└───────────────────────────────────┬────────────────────────────────────┘
                                    │ 파이프라인 실행 및 관리 대상
┌───────────────────────────────────▼────────────────────────────────────┐
│                        3. 관리 에셋 (Operational Assets)               │
│   - GitOps Manifests (AWX/ArgoCD)   - OS/K8s/DB 튜닝 베이스라인 (Conf)     │
│   - 검증 스크립트 (RPM / K8s Job)   - 에어갭 패키지/이미지 매니페스트      │
└────────────────────────────────────────────────────────────────────────┘

2. 표준 및 기준 문서 (정적 자산)

플랫폼의 변경 이력과 현재 상태의 '단일 진실 공급원(Single Source of Truth)' 역할을 합니다.

① 플랫폼 아키텍처 정의서 (Architecture Blueprint & ADR)

  • 내용:
  • 네트워크 토폴로지 (ToR 스위치 \rightarrow BGP ECMP \rightarrow Cilium Native Routing/eBPF 데이터 플레인).
  • 스토리지 토폴로지 (OpenEBS NVMe LocalPV 캐시 계층 \leftrightarrow MinIO AIStor 영구 오브젝트 스토리지).
  • 클러스터 멀티 테넌시 및 보안 경계 (Keycloak OIDC \rightarrow Vault Secret \rightarrow Kyverno 정책 엔진).
  • ADR (Architecture Decision Records) 필수 운영:
  • "왜 Cilium BPF Host Routing을 택했는가?", "왜 PostgreSQL Operator로 CNPG를 선정했는가?" 등 과거 기술적 결정의 배경, 대안, 트레이드오프를 Markdown으로 누적 관리하여 인사이동 시에도 아키텍처 철학이 유지되도록 합니다.

② 사용 기능 목록 및 매트릭스 (Capability Matrix)

  • 내용:
  • 컴포넌트별(Cilium, CNPG, Vault, Kyverno, Goldilocks) 공식 기능 중 ‘운영에서 공식 허용/활성화한 기능’과 ‘비활성화/금지한 기능’ 명시.
  • 예: Cilium: L7 DNS Egress Proxy 허용, Ingress Controller 비활성화(별도 F5/Ingress 사용).
  • 상호 호환성 매트릭스: K8s 버전 \leftrightarrow Kernel ABI \leftrightarrow CNI \leftrightarrow GPU 드라이버 호환 표.

3. 핵심 4대 운영 절차서 및 실행 메커니즘

각 절차서는 위키(Confluence)에 갇혀 있지 않고 Git 리포지토리 및 자동화 파이프라인의 스테이지(Stage)로 직결되어야 합니다.


절차 1. 성능 관리 절차 (신규 노드 인수 & 상시 튜닝)

[인프라팀 노드 인도] ──> [Gate 1: OS/HW 인수 검증] ──> [Gate 2: K8s 조인/부하 검증] ──> [프로덕션 투입]
                               │                               │
                      acceptance_test.sh             k6 / synthetic FSDP
                               │                               │
                      결과 MinIO 보관 (S3)           Kubelet Scheduling 활성화
  • 신규 인수 절차 (Acceptance Pipeline):
  1. Phase 1 (OS/하드웨어 무결성): AWX가 node-diagnostics.rpm을 설치하고 acceptance_test.sh 구동 (NIC 링 버퍼, 점보프레임, NVMe fsync 지연, NUMA 대칭성, 10분 CPU/RAM 스트레스).
  2. Phase 2 (K8s & 워크로드 검증): 노드에 node.kubernetes.io/unschedulable 테인트(Taint)를 유지한 채, 검증 전용 K8s Job(k6 추론, PyTorch 합성 부하, iperf3 네트워크)을 배포하여 패킷 드롭 및 Cgroup CPU Throttling 발생 여부 측정.
  3. 판정 및 승인: 모든 검증 결과 리포트를 MinIO(s3://node-reports/<HOSTNAME>/)에 자동 업로드하고, 기준 통과 시 테인트를 해제(Uncordon)하여 운영 워커 풀에 편입.
  • 상시 성능 튜닝 절차 (Continuous Tuning):
  • 골디락스(Goldilocks) & VPA 기반 사이징: Goldilocks의 권장값을 기반으로 정기적으로 네임스페이스별 QoS를 재조정.
  • 튜닝 루프: 지연 시간 스파이크 감지(Prometheus Alert) \rightarrow check_bottlenecks.sh 진단 \rightarrow Sysctl/Cilium Config 변경 PR 생성 \rightarrow 스테이징 클러스터 검증 \rightarrow AWX/ArgoCD 배포.

절차 2. 설정 관리 절차 (Configuration & Infrastructure as Code)

K8s 상위 워크로드와 하부 호스트 OS의 변경 라이프사이클을 완전히 분리 관리합니다.

계층관리 대상도구 및 형상 관리절차 (Workflow)
Node / Host OS커널 sysctl, 링 버퍼, ulimit, NTP, GPU 드라이버AWX / Ansible


(Git: infra-os-baseline) | 1. OS 튜닝 변수 Git PR


2. AWX Webhook 트리거


3. 노드 그룹별 순차 롤링 적용 (serial: 10%) |
| K8s Core | kube-apiserver, kubelet, etcd, containerd | Kubespray


(Git: k8s-inventory/group_vars) | 1. 클러스터 인벤토리 브랜치 수정


2. 점검 창(Maintenance Window) AWX Playbook 실행 |
| Platform Add-ons | Cilium, OpenEBS, Vault, Kyverno, Goldilocks | Helm + ArgoCD


(Git: k8s-platform-apps) | 1. values.yaml 변경 PR \rightarrow 자동 린트


2. ArgoCD Sync (Canary / Auto-sync) |


절차 3. 용량 및 자원 관리 절차 (Capacity & Multi-Tenancy)

대규모 데이터 레이크하우스 및 인메모리/GPU 시스템 특화 용량 관리 체계입니다.

  • 디스크 및 스토리지 계열 (Storage Tiering):
  • 로컬 고속 계층 (OpenEBS LocalPV): 사용률 70% 도달 시 경고, 80% 도달 시 해당 노드로의 신규 PVC 프로비저닝 차단.
  • 오브젝트 계층 (MinIO AIStor): 드라이브 풀(Pool)별 수평 확장(Expansion Pool 추가) 임계치를 75%로 고정하고, 6개월 소비 트렌드를 선형 회귀로 예측하여 신규 스토리지 서버 발주 시점 트리거.
  • 컴퓨트 및 테넌트 자원 할당 (Compute Allocation):
  • Quota Tiering: 네임스페이스 생성 시 3단계 티어(Tier 1: High-QoS DB/AI, Tier 2: 일반 백엔드, Tier 3: 배치)로 구분하여 ResourceQuotaLimitRange 자동 주입(Kyverno 연동).
  • Guaranteed QoS 강제 정책: StarRocks BE, MinIO, vLLM 등 고부하 워크로드는 반드시 requests == limits (정수 코어)로 설정하도록 Kyverno Mutation/Validation Rule로 강제하여 CFS Throttling 원천 방지.

절차 4. 소프트웨어 및 에셋 수명주기 관리 절차 (Air-gap Lifecycle)

인터넷이 차단된 에어갭 환경에서 바이너리, 패키지, 컨테이너 이미지를 반입하고 배포하는 통제 절차입니다.

[외부망 수집] ──> [SHA-256 Manifest 생성] ──> [보안성 심의/스캔] ──> [Nexus/Registry 반입] ──> [노드/파드 배포]
  1. 사전 에셋 정의 (Asset BOM):
  • 수집할 패키지(RPM), 정적 바이너리(mc, k6), 모델 가중치, 컨테이너 이미지를 목록화한 assets-manifest.yaml 작성.
  1. 무결성 검증 및 빌드:
  • 외부망 수집 서버에서 다운로드 후 즉시 sha256sum * > manifest.sha256 파일 생성.
  1. 내부망 레지스트리 적재:
  • 사내 미러(Nexus Docker Proxy / Hosted, Yum Local Repo)에만 업로드.
  1. Kyverno 기반 런타임 통제:
  • 클러스터 내 모든 파드는 지정된 사내 신뢰 레지스트리(예: nexus.internal:8082/*)에서 서명된 이미지만 풀(Pull)할 수 있도록 차단 정책 적용.

4. 성공적인 정착을 위한 실무 제언 (Next Action)

  • 절차서를 코드로 증명할 것:
    "신규 노드 성능 기준"이라는 긴 텍스트 문서보다, 앞서 작성한 acceptance_test.sh가 Exit Code 0을 리턴해야만 AWX 다음 단계(K8s 조인)로 넘어가는 품질 게이트(Quality Gate) 자동화를 구축하는 것이 가장 효과적입니다.
  • 문서의 단일 창구화 (Monorepo 구조):
    설정(Ansible/Helm), 아키텍처(Markdown/ADR), 진단 스크립트(Bash)를 뿔뿔이 흩어놓지 말고, 인프라 플랫폼 모노레포(infra-control-plane)에 문서와 코드를 함께 버전 관리(Doc-as-Code)해야 코드 변경 시 문서가 함께 갱신됩니다.

===

네. 지금 말씀하신 것을 보면 단순히 운영 문서 몇 개를 만드는 것보다, 앞으로 1,000~2,000대급 Kubernetes 기반 플랫폼을 운영하기 위한 운영관리 체계(Operating Model) 자체를 설계하려는 단계로 보입니다.

제가 권하는 방향은 ITIL의 Asset / Configuration / Capacity / Change / Service Management 개념을 그대로 가져오되, Kubernetes·Cilium·AIStor·애플리케이션에 맞게 재구성하는 것입니다. 특히 Configuration Management는 "설정값을 보관하는 문서"가 아니라 무엇이 존재하고(CI), 어떤 관계를 가지고 있으며, 현재 실제 상태가 무엇인지를 관리하는 체계입니다. (ITIL)

그리고 Kubernetes 공식 문서도 대규모 클러스터에서는 node setup validation, production planning, node management 등을 별도 운영 관심사로 보고 있습니다. (Kubernetes)


1. 먼저 전체 체계를 이렇게 나누는 것을 추천합니다

현재 생각하신

성능 / 용량 / 설정 / 자원 / SW / 아키텍처 / 기능목록

을 조금 확장해서 다음 10개 관리영역으로 만드는 것이 좋습니다.

                         Platform Service
                              │
        ┌─────────────────────┼─────────────────────┐
        │                     │                     │
   Architecture          Service/Function       Asset/CI
        │                     │                     │
        └──────────────┬──────┴──────────┬──────────┘
                       │                 │
                Configuration       Software
                       │                 │
                       └────────┬────────┘
                                │
                ┌───────────────┼───────────────┐
                │               │               │
             Capacity       Performance       Resource
                │               │               │
                └───────────────┼───────────────┘
                                │
                         Change / Release
                                │
                       Incident / Problem
                                │
                         Lifecycle / EOL

여기서 중요한 것은 각 관리체계가 서로 다른 질문에 답하도록 만드는 것입니다.

관리영역답해야 하는 질문
Architecture어떻게 구성되어 있는가?
Service / Function무엇을 제공하는가?
Asset / CI무엇을 가지고 있는가?
Configuration현재 어떻게 설정되어 있는가?
Software무슨 SW/버전을 사용하고 있는가?
Resource누구에게 얼마나 할당했는가?
Capacity언제 부족해지는가?
Performance왜 느린가 / 어떻게 최적화하는가?
Change / Release무엇을 언제 왜 변경했는가?
Incident / Problem무슨 문제가 발생했고 근본 원인은 무엇인가?

이렇게 분리하면 나중에 엄청난 효과가 있습니다.


2. 특히 "Asset"과 "Configuration"을 분리하세요

이 부분이 가장 중요합니다.

예를 들어 B300 서버 한 대를 생각하면:

Asset

Server
 ├─ Serial Number
 ├─ Vendor
 ├─ Model
 ├─ CPU
 ├─ Memory
 ├─ NIC
 ├─ GPU
 ├─ Rack
 ├─ Location
 ├─ Owner
 ├─ Purchase/Warranty
 └─ Lifecycle

이것은 자산관리입니다.

반면:

Configuration

Node
 ├─ RHEL 10.2
 ├─ Kernel 6.x
 ├─ tuned profile
 ├─ sysctl
 ├─ IRQ affinity
 ├─ NIC MTU
 ├─ NIC driver
 ├─ kubelet config
 ├─ containerd config
 ├─ Cilium config
 └─ labels/taints

이것은 Configuration Management입니다.

그리고:

Software

RHEL
Kernel
containerd
kubelet
Cilium
AIStor
CNPG
OpenEBS
Keycloak
Vault
...

Software Management입니다.

이 세 가지를 한 문서에 넣으면 시간이 갈수록 관리가 굉장히 어려워집니다.


3. 저는 "Architecture Document"를 최상위에 두겠습니다

Architecture는 운영 중 계속 수정되는 설정문서가 아닙니다.

예를 들어:

Platform Architecture
│
├── Physical Architecture
│
├── Network Architecture
│
├── Kubernetes Architecture
│
├── Storage Architecture
│
├── Data Architecture
│
├── Security Architecture
│
├── Observability Architecture
│
└── Application Architecture

그리고 각각:

Network
 ├─ bond0
 ├─ bond1
 ├─ VLAN
 ├─ subnet
 ├─ BGP
 ├─ ECMP
 ├─ Cilium
 └─ ClusterMesh

Storage
 ├─ AIStor
 ├─ OpenEBS
 ├─ CNPG
 └─ local NVMe

Application
 ├─ StarRocks
 ├─ Spark
 ├─ Airflow
 ├─ Polaris
 ├─ OPA
 └─ Jupyter

처럼 논리적 관계를 표현합니다.

Architecture에는 가능한 한 다음을 넣지 않는 것이 좋습니다.

net.core.rmem_max=...

그것은 Configuration입니다.

Architecture는 "왜 이렇게 구성했는가"를 설명해야 합니다.


4. "사용기능목록"은 별도로 만드는 것이 좋습니다

이건 상당히 좋은 아이디어입니다.

저라면 이름을 조금 바꿔서:

Platform Service & Capability Catalog

라고 만들겠습니다.

예:

ServiceCapability제공 여부Owner
KubernetesContainer orchestrationOPlatform
KubernetesBatch JobOPlatform
CiliumNetworkPolicyONetwork
CiliumBGPONetwork
CiliumClusterMeshONetwork
AIStorS3OStorage
AIStorLifecycleOStorage
CNPGPostgreSQL HAODB
OpenEBSPVOStorage
KeycloakIAMOSecurity
VaultSecretOSecurity
KyvernoPolicyOPlatform
GoldilocksResource recommendationOPlatform

그리고 각각에:

Supported
Not Supported
Deprecated
Experimental

상태를 부여합니다.

이 문서가 있으면 나중에 굉장히 중요해집니다.

예를 들어 사용자가:

"AIStor에서 FTP 지원하나요?"

라고 물었을 때,

설계문서에서 찾는 것이 아니라 Capability Catalog에서 바로 답할 수 있게 됩니다.


5. Configuration Management는 "Single Source of Truth"로

이것은 GitOps/IaC와 직접 연결합니다.

제가 권하는 구조는:

Configuration Management
        │
        ├── OS
        │    └── Ansible
        │
        ├── Kubernetes
        │    └── Kubespray
        │
        ├── Cilium
        │    └── Helm
        │
        ├── AIStor
        │    └── Helm / Operator
        │
        ├── Application
        │    └── Helm / ArgoCD
        │
        └── Policy
             └── Kyverno / OPA

그리고 원칙을:

운영환경에서 직접 변경하지 않는다.

로 잡는 것을 추천합니다.

즉:

Git
 ↓
PR
 ↓
Review
 ↓
CI validation
 ↓
ArgoCD / AWX / Ansible
 ↓
Production

입니다.

Kubernetes 자체도 declarative configuration을 중심으로 관리하도록 설계되어 있으며, 공식 문서에서도 built-in API를 통한 선언적 정책 관리 등을 권장합니다. (Kubernetes)


6. 설정관리와 변경관리를 반드시 연결하세요

예를 들어:

Cilium

에서

bpf-lb-mode

을 변경했다고 합시다.

Configuration Management는:

현재 값은 무엇인가?

를 관리합니다.

Change Management는:

왜 변경했는가?

를 관리합니다.

따라서:

Configuration
     │
     │ 변경
     ▼
Change Request
     │
     ├─ 변경 이유
     ├─ 영향
     ├─ 위험
     ├─ 사전 테스트
     ├─ Rollback
     ├─ 승인
     └─ 결과
     │
     ▼
Configuration Update

구조가 되어야 합니다.


7. 성능관리는 "튜닝값 관리"가 아닙니다

이것도 매우 중요합니다.

성능관리 문서를:

sysctl 값을 이렇게 한다

정도로 만들면 실패합니다.

성능관리는 다음 구조가 되어야 합니다.

Performance Management
        │
        ├── Baseline
        │
        ├── Monitoring
        │
        ├── Benchmark
        │
        ├── Bottleneck Analysis
        │
        ├── Tuning
        │
        ├── Validation
        │
        └── Regression

즉:

측정 → 원인분석 → 변경 → 검증 → 표준화

가 핵심입니다.


8. 특히 지금 하시려는 "신규 노드 인수"는 Performance Management의 첫 단계입니다

저라면 다음과 같이 정의하겠습니다.

Node Acceptance Procedure

1. HW Acceptance
        ↓
2. OS Acceptance
        ↓
3. Network Acceptance
        ↓
4. Kubernetes Node Acceptance
        ↓
5. CNI Acceptance
        ↓
6. Performance Baseline
        ↓
7. Configuration Snapshot
        ↓
8. DevOps Handover

그리고 여기서 만들어진 결과가 해당 Node의 Golden Baseline이 됩니다.


9. Golden Baseline을 별도 관리하세요

이게 앞으로 굉장히 중요합니다.

예를 들어:

Node Golden Baseline v1.0

Hardware
 ├─ CPU
 ├─ RAM
 ├─ NUMA
 ├─ NIC
 └─ Disk

OS
 ├─ RHEL version
 ├─ Kernel
 ├─ tuned
 ├─ sysctl
 └─ limits

Network
 ├─ NIC driver
 ├─ MTU
 ├─ link speed
 ├─ IRQ
 ├─ RPS/XPS
 └─ TCP

Kubernetes
 ├─ kubelet
 ├─ containerd
 └─ CNI

Performance
 ├─ CPU baseline
 ├─ Memory baseline
 ├─ Network baseline
 ├─ Disk baseline
 └─ Pod network baseline

그리고:

Node-0001
Node-0002
Node-0003
...

각 node가 이 baseline에서 얼마나 deviation됐는지 검사합니다.


10. 그러면 "성능 튜닝"과 "설정관리"의 관계가 명확해집니다

예를 들어 Cilium 성능 문제가 발생했습니다.

Performance

Packet latency 증가
       ↓
NIC → kernel → Cilium → veth 조사
       ↓
RPS/XPS 문제 발견
       ↓
튜닝값 변경

여기까지가 Performance Management입니다.

그 다음:

검증
 ↓
효과 있음
 ↓
Golden Configuration에 반영
 ↓
Ansible/Git에 반영
 ↓
Configuration Management 업데이트

이렇게 해야 합니다.

즉,

성능관리에서 발견한 최적값이 설정관리의 표준값이 된다.

이 관계가 매우 중요합니다.


11. Capacity Management는 Performance와 분리하세요

예를 들어 AIStor 용량이 80%가 되었다고 합시다.

이건 Performance 문제가 아닙니다.

Capacity

현재
↓
Trend
↓
Forecast
↓
Threshold
↓
Expansion

입니다.

예:

Storage capacity
70% → Warning
80% → Expansion planning
85% → Expansion execution
90% → Critical

CPU도 마찬가지입니다.

Cluster CPU
 ├─ current utilization
 ├─ allocatable
 ├─ requested
 ├─ actual usage
 ├─ growth rate
 └─ forecast

Capacity Management는 "현재 얼마나 빠른가"가 아니라

언제 부족해질 것인가

를 보는 영역입니다.

ITIL Capacity Management도 component / service / business capacity를 구분해 현재와 미래 수요를 맞추는 관점입니다. (ITIL)


12. Resource Management는 "할당 정책"입니다

이것도 Capacity와 구분하면 좋습니다.

예:

Resource Management
 ├─ CPU allocation
 ├─ Memory allocation
 ├─ GPU allocation
 ├─ Storage quota
 ├─ Namespace quota
 ├─ Priority
 ├─ LimitRange
 └─ ResourceQuota

예를 들어:

프로젝트 A에 CPU 100 core / memory 500GB 할당

은 Resource Management입니다.

반면:

전체 클러스터 CPU가 85%가 되어 100노드 추가 필요

는 Capacity Management입니다.


13. Software Management는 lifecycle 중심으로

SW 관리도 단순히 버전 목록만 만들면 안 됩니다.

다음 lifecycle로 관리하는 것을 추천합니다.

Request
 ↓
Evaluation
 ↓
POC
 ↓
Approval
 ↓
Production
 ↓
Upgrade
 ↓
Maintenance
 ↓
EOL
 ↓
Retirement

예:

Cilium 1.18.4
AIStor X
CNPG X
OpenEBS X

각각:

항목내용
Current Version현재
Target Version목표
Supported OS지원 OS
Supported K8s지원 K8s
Owner담당
EOL종료
Upgrade Path업그레이드 경로
Known Issue알려진 문제
Rollbackrollback
Dependency의존성

까지 관리합니다.


14. 그래서 "Version Matrix"가 하나 필요합니다

이건 강력하게 추천합니다.

Platform Compatibility Matrix

예:

ComponentVersion
RHEL10.2
Kernelx.x
Kubernetes1.33.x
containerd1.7.x
Cilium1.18.4
AIStor Operatorx
AIStorx
CNPGx
OpenEBSx
Kafkax
Keycloakx
Vaultx
Kyvernox
ArgoCDx

그리고:

RHEL × Kubernetes × Cilium × AIStor × Kernel

의 compatibility가 검증된 조합을 Approved Platform Version으로 지정합니다.


15. "Architecture / Configuration / Software"의 관계

이 세 가지를 연결하면 아주 강력한 구조가 됩니다.

예:

Architecture

Kubernetes
 └─ Cilium
     └─ BGP
         └─ ECMP

Configuration

Cilium
 ├─ bpf.lbMode
 ├─ kubeProxyReplacement
 ├─ BGP
 └─ MTU

Software

Cilium 1.18.4

즉:

Architecture
      ↓
Software
      ↓
Configuration
      ↓
Actual State

입니다.

이 네 가지를 연결해서 보면 운영자가 굉장히 빨리 상황을 파악할 수 있습니다.


16. 저는 "Actual State"를 반드시 추가하겠습니다

이게 없는 Configuration Management가 가장 흔한 문제입니다.

예:

Desired

Git:
net.core.rmem_max = X

하지만 실제 서버:

Actual

node01 = X
node02 = Y
node03 = X

라면 configuration drift입니다.

따라서:

Desired State
       ↕
   Drift Check
       ↕
Actual State

를 자동화해야 합니다.

ITIL Configuration Management에서도 configuration record와 실제 환경의 일치 여부를 검증하고 audit하는 것을 중요한 활동으로 봅니다. (ITIL)


17. 그리고 "인수 → 운영"의 handover를 명확하게

제가 추천하는 전체 lifecycle은 다음입니다.

Infrastructure Team
        │
        ▼
HW/OS 설치
        │
        ▼
[Node Acceptance]
        │
        ├─ Hardware
        ├─ Firmware
        ├─ OS
        ├─ Network
        ├─ Storage
        └─ Performance baseline
        │
        ▼
DevOps Acceptance
        │
        ├─ Kubernetes join
        ├─ Cilium
        ├─ Monitoring
        ├─ Logging
        └─ Security
        │
        ▼
Production Ready
        │
        ▼
Operations

그리고 인수 문서에는 최소한:

Node ID
Serial
Rack
IP
NIC
MAC
CPU
Memory
NUMA
Disk
OS
Kernel
Firmware
Driver
K8s version
Container runtime
Cilium
Baseline
Known issue
Owner
Acceptance date

가 있어야 합니다.


18. 운영 중에는 Change → Performance → Configuration이 순환해야 합니다

이것이 최종적으로 만들고 싶은 운영 loop입니다.

              ┌───────────────┐
              │   Monitoring  │
              └───────┬───────┘
                      │
                      ▼
               Performance Issue
                      │
                      ▼
                Root Cause
                      │
                      ▼
                  Tuning
                      │
                      ▼
                 Benchmark
                  /       \
               FAIL       PASS
                │           │
                └─────┐     ▼
                      │  Standardize
                      │      │
                      │      ▼
                      │ Configuration
                      │      │
                      │      ▼
                      │ Git/Ansible/Helm
                      │      │
                      └──────┘
                             │
                             ▼
                           Change
                             │
                             ▼
                         Production

이 구조를 만들어 놓으면 "사람이 기억하는 튜닝"이 사라집니다.


19. 운영 문서는 아래 정도로 구성하면 좋겠습니다

제가 지금 조직 상황이라면 다음 12개 운영체계로 만들겠습니다.

A. Architecture Management

  1. Architecture Standard
  2. Architecture Diagram
  3. Technology Standard
  4. Dependency / Service Map

B. Service Management

  1. Service & Capability Catalog
  2. Service Level / SLO

C. Asset / Configuration

  1. Asset Management
  2. Configuration Management
  3. Configuration Baseline / Drift Management

D. Software

  1. Software Lifecycle Management
  2. Version / Compatibility Matrix

E. Resource / Capacity

  1. Resource Management
  2. Capacity Management

F. Performance

  1. Performance Management
  2. Performance Baseline
  3. Benchmark Standard
  4. Tuning Guide

G. Change / Release

  1. Change Management
  2. Release Management
  3. Rollback Standard

H. Operations

  1. Incident Management
  2. Problem / RCA Management
  3. Operational Runbook

I. Security

  1. Security Baseline
  2. Vulnerability / Patch Management
  3. Access Management

J. Lifecycle

  1. EOL/EOS Management
  2. Technology Retirement

20. 다만 이걸 28개 문서로 만들지는 마세요

이게 정말 중요합니다.

실제로 운영해보면 문서가 너무 많아서 아무도 안 봅니다.

저라면 6개의 핵심 Book으로 묶습니다.

01. Architecture Book
02. Service & Asset Book
03. Configuration & Software Book
04. Resource & Capacity Book
05. Performance Engineering Book
06. Operations & Change Book

그리고 각 Book 안에 세부 절차/표준/템플릿을 둡니다.


21. 특히 지금 조직에는 Performance Engineering Book이 중요합니다

지금 질문하신 방향을 보면 저는 이것을 일반적인 "성능관리절차"보다 Performance Engineering으로 부르는 것도 추천합니다.

구조:

Performance Engineering
│
├── PE-01 Node Acceptance
├── PE-02 Baseline
├── PE-03 Monitoring
├── PE-04 Bottleneck Analysis
├── PE-05 Benchmark
├── PE-06 Tuning
├── PE-07 Validation
├── PE-08 Regression
└── PE-09 Capacity Correlation

그리고 계층을:

L0 Hardware
 ↓
L1 Firmware
 ↓
L2 OS / Kernel
 ↓
L3 NIC / Storage
 ↓
L4 Kubernetes
 ↓
L5 Cilium
 ↓
L6 Storage Platform
 ↓
L7 Middleware
 ↓
L8 Application

으로 고정합니다.


22. 이 구조가 특히 현재 환경에 잘 맞습니다

예를 들어 Pod network latency가 증가했다고 합시다.

운영자는 무작정 Cilium부터 튜닝하지 않습니다.

정해진 순서대로:

Switch
 ↓
NIC
 ↓
PCIe
 ↓
IRQ
 ↓
Kernel
 ↓
Socket
 ↓
Cilium/eBPF
 ↓
veth
 ↓
Pod
 ↓
Application

을 검사합니다.

그리고:

CPU saturation?
Memory pressure?
NUMA remote access?
NIC drop?
PCIe bottleneck?
TCP retransmission?
Cilium drop?
Pod CPU throttling?
Application latency?

를 단계적으로 확인합니다.

이것이 바로 앞에서 말씀하신 "스위치 → Pod까지의 병목구간을 체계적으로 관리"하는 방법입니다.


23. 최종적으로는 "운영 데이터 모델" 하나를 만드는 게 좋습니다

문서를 각각 따로 만들기보다는 다음 관계를 갖게 하는 것이 가장 좋습니다.

                    Service
                       │
                 ┌─────┴─────┐
                 │           │
             Architecture   SLO
                 │
                 ▼
              CI / Asset
                 │
       ┌─────────┼─────────┐
       │         │         │
   Software   Config    Resource
       │         │         │
       └─────────┼─────────┘
                 │
             Performance
                 │
          ┌──────┴──────┐
          │             │
       Capacity       Incident
          │             │
          └──────┬──────┘
                 │
               Change
                 │
              Release

이렇게 해놓으면 나중에 CMDB를 만들더라도 단순 서버 목록 DB가 아니라 "서비스-구성요소-설정-성능-변경" 관계를 가진 운영 데이터베이스가 됩니다. ITIL에서도 configuration management의 핵심 가치는 CI 자체보다 CI 간 관계와 서비스 의존성을 파악하는 것에 있습니다. (ITIL)


제가 가장 추천하는 조직 운영 원칙

결국 아래 7개 원칙만 조직 전체에 강하게 정착시키면 됩니다.

① Architecture는 왜 그렇게 구성했는지를 관리한다.

② Asset은 무엇을 가지고 있는지를 관리한다.

③ Configuration은 어떻게 설정되어 있는지를 관리한다.

④ Software는 무엇을 어떤 버전으로 사용하는지를 관리한다.

⑤ Resource/Capacity는 얼마나 사용하고 언제 부족해지는지를 관리한다.

⑥ Performance는 왜 느리고 어떻게 개선할지를 관리한다.

⑦ Change는 그 상태를 왜/언제/누가 변경했는지를 관리한다.

그리고 가장 중요한 연결은:

Performance 개선 → 검증 → Configuration 표준화 → IaC 반영 → Change → Production → 다시 Monitoring

입니다.

이렇게 설계하면 지금 구축하고 계신 RHEL → Kubernetes/Kubespray → Cilium → AIStor/OpenEBS/CNPG → Kafka → Polaris/OPA → StarRocks/Spark/Airflow/Jupyter → Keycloak/Vault/Kyverno/Goldilocks가 각각 따로 운영되는 것이 아니라, 하나의 Platform Engineering 운영체계 안에서 관리되게 됩니다.

특히 Kubernetes는 규모가 커질수록 단순 "클러스터 운영"이 아니라 node lifecycle, configuration drift, capacity, performance, change를 함께 관리해야 하므로, 지금처럼 1,000~2,000대 규모로 가기 전에 이 운영 모델부터 만드는 것이 상당히 좋은 시점입니다. Kubernetes 공식 문서 역시 production 환경에서 planning, node setup validation, cluster administration을 별도 고려사항으로 다루고 있습니다. (Kubernetes)

다음 단계로는

지금 말씀하신 조직/환경이라면 제가 다음처럼 실제 운영 표준 체계의 "목차 + 산출물 + 담당조직(RACI) + 주기 + 입력/출력 + 사용하는 시스템(Git/ArgoCD/AWX/Prometheus/Grafana/CMDB/Notion 등)"을 한 장짜리 Operating Model로 설계하는 것을 권합니다.

예를 들어 Node 인수 → Configuration 등록 → Software 등록 → Baseline 생성 → 운영 → 성능이슈 → 튜닝 → Change → 표준화 → Capacity 반영 → EOL을 하나의 lifecycle로 연결하고, 각 단계에서 누가 무엇을 작성/승인/실행하는지까지 정의하면 바로 사내 운영규정으로 발전시킬 수 있습니다.

===

여러 관리 영역을 나열하신 걸 보니 이미 ITIL 계열 프레임워크의 practice 분류와 거의 일치합니다. 다만 실무에서 그대로 ITIL 매뉴얼대로 쓰면 K8s/GitOps 환경엔 안 맞는 부분이 많아서, "ITIL 개념 + 클라우드 네이티브 운영 방식"으로 재구성하는 게 실제로 잘 돌아갑니다. 아래는 그 매핑과 구체적 운영 방식 제안입니다.

1. 전체 그림 — 무엇이 "허브"이고 무엇이 "practice"인가

가장 중요한 설계 결정은: 아키텍처 문서/사용기능목록/CMDB를 "단일 진실 공급원(SSOT)"으로 두고, 나머지 4개 관리절차가 전부 그걸 참조·갱신하는 구조로 만드는 것입니다. ITIL도 이걸 "Configuration Management System(CMS)"으로 부릅니다. 이게 안 되어 있으면 성능관리팀이 보는 노드 스펙과 용량관리팀이 보는 디스크 목록과 설정관리팀이 보는 Helm values가 서로 따로 놀게 됩니다.

                    [아키텍처 문서] ── 왜 이렇게 만들었나 (ADR)
                          │
                    [사용기능목록/서비스카탈로그] ── 뭐가 있고 누가 쓰나
                          │
        ┌─────────────────┼─────────────────┬─────────────────┐
   [설정관리]          [자원관리]         [용량관리]        [성능관리]
   (뭐가 어떻게        (누구에게        (얼마나 남았고     (얼마나 빠르고
    설정돼있나)         얼마나 줬나)     언제 증설하나)     어디가 병목인가)
        │                  │                  │                  │
        └──────────────────┴──────── SW관리(무엇이 설치돼있나) ──┘

핵심 원칙: 설정관리가 "사실(fact)"을 기록하는 계층이고, 나머지(성능/용량/자원/SW관리)는 그 사실을 기반으로 "판단하고 행동하는" 절차입니다. 이 구분이 흐려지면 문서가 중복되고 곧 썩습니다.


2. 영역별 상세 구조

(1) 설정관리 (Configuration Management) — 모든 것의 기반

ITIL의 Service Configuration Management를 GitOps 방식으로 구현하는 게 요즘 표준입니다.

구성요소도구 예내용
Configuration Item(CI) 정의Git 리포 구조 자체노드, 클러스터, Helm release, AWX job template, Ansible inventory 각각을 CI로 취급
Desired State(선언)Helm values.yaml, Ansible playbook/inventory"이래야 한다"를 코드로 선언
Actual State 수집AWX job 결과, kubectl get -A -o yaml, Ansible facts"지금 실제 이렇다"를 주기적으로 수집
Drift 탐지ArgoCD(있다면)/Kyverno PolicyReport, AWX 스케줄 잡의 diff선언과 실제가 어긋나면 알림
이력Git 커밋 로그 + AWX job 실행 이력"누가 언제 왜 바꿨나"의 감사 추적

절차 제안
1. 모든 변경은 PR(코드리뷰) 없이 직접 서버에 손대는 걸 금지 → "설정은 반드시 Git에 먼저 들어간다"는 원칙만 지켜도 나머지가 쉬워집니다.
2. Helm/Ansible 변경은 반드시 변경관리 티켓(Change Request) 번호와 연결. 규모가 작으면 PR 자체가 티켓 역할을 해도 됩니다.
3. 정기(예: 주 1회) drift 스캔 → 리포트를 자원관리/성능관리팀과 공유(설정 drift가 성능 저하 원인인 경우가 많음).

(2) 자원관리 (Resource Allocation)

이건 ITIL에서는 Capacity Management의 "Component/Service Capacity" 하위로 다루지만, K8s에서는 사실상 별도 거버넌스 프로세스로 분리하는 게 낫습니다. 왜냐면 "얼마나 있냐(용량)"와 "누구에게 얼마 줬냐(할당)"는 다른 질문이기 때문입니다.

  • 정적 거버넌스: Namespace별 ResourceQuota/LimitRange, PriorityClass 정책 (Kyverno로 강제)
  • 동적 근거자료: Goldilocks/VPA 추천치를 근거로 분기별 request/limit 재조정 — 이걸 "리소스 리뷰"라는 이름의 정례 절차로 만드세요 (팀별 실제 사용률 vs 할당량 비교 리포트)
  • 차지백/코스트 어카운팅: 팀·서비스 단위 CPU/메모리/스토리지 사용량을 정기 리포트로 공유하면 과할당 요청이 줄어듭니다 (Kubecost류 도구 또는 자체 스크립트)

절차 제안: 신규 서비스 온보딩 시 "리소스 요청서"를 표준 양식(예상 QPS, request/limit, 스토리지 크기, 성장 예측)으로 받고, 이게 곧 (3)용량관리의 입력값이 되도록 연결합니다.

(3) 용량관리 (Capacity Management, disk 계열 등)

ITIL의 3단계 구조(Business/Service/Component Capacity Management)를 그대로 가져오는 게 실제로 유용합니다.

단계질문
Business Capacity앞으로 6개월/1년 뒤 사업이 얼마나 커지나"신규 서비스 3개 온보딩 예정 → 스토리지 몇 TB 필요 추정"
Service Capacity서비스 단위로 지금 얼마나 쓰고 있나CNPG DB별 디스크 사용 추이, PVC 증가율
Component Capacity개별 컴포넌트(디스크, 노드)가 언제 한계에 닿나OpenEBS 풀 사용률 80% 도달 예상 시점

절차 제안
1. 임계치 기반 알림(예: 디스크 사용률 75%/85%/95% 단계별)은 필수지만, 그것만으로는 "용량관리"가 아니라 "모니터링"입니다. 여기에 추세선 기반 예측(선형회귀나 최근 N개월 성장률)을 얹어서 "언제 한계에 도달할지"를 분기별 캐패시티 리포트로 내는 게 핵심입니다.
2. 캐패시티 리뷰 미팅(월간 또는 분기)을 별도로 잡고, 여기서 증설 예산/일정을 결정 → 이 결과가 다시 (1)설정관리(Ansible 프로비저닝 코드)에 반영되는 순환 구조.

(4) 성능관리 (Performance Management) — 신규인수절차 + 튜닝절차

이전에 만든 node_check.sh류가 여기서 "신규인수절차"의 실행 도구가 됩니다. ITIL 관점에서 성능관리는 용량관리와 짝을 이루지만, "빠르다/느리다"는 용량("얼마나 있냐")과 완전히 다른 축이라 절차를 분리하는 게 실무적으로 맞습니다.

신규인수절차 (Onboarding/Acceptance)
1. HW/OS/커널 baseline 점검 (지난번 스크립트) → 결과를 CMDB/CMS에 "이 노드의 baseline 성능 지표"로 등록
2. K8s join 후 2차 점검: kubelet/containerd 정상 동작, CNI(Cilium) 연결성, DaemonSet 배포 확인
3. 애플리케이션 스택(Keycloak/OpenEBS/CNPG/Vault 등) 배포 후 3차 점검: 서비스별 smoke test + 초기 성능 baseline(응답시간, throughput)
4. 이 baseline 값들을 "이 노드/클러스터의 기준선"으로 문서화 → 이후 튜닝절차의 비교 기준(before/after)이 됨

튜닝절차 (Continual Performance Improvement)
이건 ITIL의 "Continual Improvement" 루프(Plan-Do-Check-Act)를 그대로 쓰면 됩니다.
1. 관측: Prometheus/Grafana 등에서 병목 후보 식별 (CPU throttle, conntrack 포화, disk latency 등)
2. 가설: "이 sysctl/Helm value를 바꾸면 개선될 것" 형태로 튜닝 대상과 예상 효과를 문서화 (튜닝 제안서 — 원인/변경내용/예상효과/롤백방법)
3. 적용: 반드시 (1)설정관리 절차를 통해 Git PR로 적용 (직접 서버 sysctl -w 금지, 재부팅시 유실되고 감사 추적도 안 됨)
4. 검증: 적용 전후 성능 지표 비교, 최소 1~2주 관찰
5. 문서화: "튜닝 이력대장"에 누적 — 나중에 같은 문제가 재발했을 때 과거 대응을 바로 찾을 수 있게

(5) SW관리 (package, daemon, binary)

  • 인벤토리: 노드별로 어떤 패키지/데몬/바이너리 버전이 깔려있는지 (Ansible facts 수집을 정기 잡으로) — 이것도 CMDB의 일부
  • 패치/취약점 관리 절차: CVE 스캔 주기, 패치 적용 SLA(심각도별), 롤아웃 방식(카나리/롤링)을 명문화
  • 릴리즈 관리: Helm chart/컨테이너 이미지 버전을 SemVer로 관리하고, 배포 이력을 남기는 것 (ArgoCD/Helm history가 이미 이력을 가지고 있으니 이를 "SW관리대장"으로 재활용하면 중복 문서화를 피할 수 있음)

(6) 아키텍처 문서 / 사용기능목록

  • 아키텍처 문서: 매번 처음부터 그리지 말고 ADR(Architecture Decision Record) 형식을 도입하세요. "왜 CNPG를 선택했나", "왜 이 sysctl 값을 baseline으로 정했나" 같은 결정과 근거를 짧은 문서(1~2페이지)로 계속 누적하는 방식이, 큰 아키텍처 문서 하나를 유지보수하는 것보다 실제로 안 썩습니다. 큰 그림은 C4 모델(Context→Container→Component) 수준으로 분기 1회 정도만 갱신.
  • 사용기능목록: 이건 사실상 "서비스 카탈로그"입니다. Backstage 같은 도구를 쓰거나, 간단히는 Git 리포에 catalog/services.yaml로 서비스명/오너/의존성/SLA/런북 링크를 관리. 신규 인수 시 여기 등록하는 걸 온보딩 체크리스트의 마지막 항목으로 넣으면 목록이 저절로 최신 상태를 유지합니다.

3. 운영 리듬 (Cadence) 제안

주기활동관련 절차
상시모니터링/알림성능·용량
이벤트 발생시신규 노드/서비스 인수성능(인수)·SW관리·사용기능목록 등록
주간Config drift 스캔, 튜닝 진행상황 점검설정관리·성능(튜닝)
월간용량 추세 리뷰, 리소스 사용률 리포트용량·자원
분기리소스 재조정(Goldilocks 기반), 아키텍처 큰 그림 갱신, 패치 정책 리뷰자원·아키텍처·SW관리
반기/연간캐패시티 플랜(Business Capacity), 전체 baseline 재점검용량·성능

4. 문서 저장 구조 제안 (예시)

ops-docs/                          # 또는 별도 리포
├── architecture/
│   ├── overview-c4.md
│   └── adr/0001-choose-cnpg.md ...
├── catalog/
│   └── services.yaml               # 사용기능목록/서비스카탈로그
├── procedures/
│   ├── performance/
│   │   ├── node-acceptance.md      # 신규인수절차 (스크립트 링크 포함)
│   │   └── tuning-log.md           # 튜닝 이력대장
│   ├── capacity/
│   │   └── disk-capacity-review.md
│   ├── configuration/
│   │   └── change-workflow.md      # Git PR → AWX 적용 흐름
│   ├── resource/
│   │   └── quota-review.md
│   └── software/
│       └── patch-policy.md
└── cmdb/                           # 실제 상태 스냅샷(자동 생성물)
    ├── nodes.yaml
    └── helm-releases.yaml

이렇게 나누면 "이번에 노드 하나 새로 들어왔다"는 이벤트 하나가 자연스럽게 procedures/performance(인수)→cmdb 갱신→catalog 등록까지 이어지는 흐름을 그대로 문서 구조가 따라가게 됩니다. 처음부터 완벽하게 만들기보다, 지금 있는 node_check.sh/aggregate_report.py를 procedures/performance/에 넣고 tuning-log.md부터 시작하시는 걸 추천드립니다 — 나머지 영역은 실제로 반복되는 작업이 생길 때마다 하나씩 문서화하는 게 오히려 덜 썩습니다.

profile
engineer

0개의 댓글