대규모 베어메탈 K8s 클러스터와 에어갭 플랫폼(Cilium, MinIO AIStor, CNPG, OpenEBS 등)을 안정적으로 운영하기 위해서는 문서와 절차가 '형식적인 규정집'에 머물지 않고, GitOps 및 자동화 파이프라인(AWX/ArgoCD)과 1:1로 결합된 '실행 가능한 코드(Everything as Code)' 형태로 관리되어야 합니다.
대규모 클라우드 네이티브 엔터프라이즈 환경의 SRE/DevOps Best Practice를 기반으로 거버넌스 체계(분류 기준), 문서/에셋 맵, 4대 핵심 절차서의 상세 라이프사이클을 구조화했습니다.
문서와 에셋이 서로 섞여 파편화되지 않도록 기준(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) - 에어갭 패키지/이미지 매니페스트 │
└────────────────────────────────────────────────────────────────────────┘
플랫폼의 변경 이력과 현재 상태의 '단일 진실 공급원(Single Source of Truth)' 역할을 합니다.
Cilium: L7 DNS Egress Proxy 허용, Ingress Controller 비활성화(별도 F5/Ingress 사용).각 절차서는 위키(Confluence)에 갇혀 있지 않고 Git 리포지토리 및 자동화 파이프라인의 스테이지(Stage)로 직결되어야 합니다.
[인프라팀 노드 인도] ──> [Gate 1: OS/HW 인수 검증] ──> [Gate 2: K8s 조인/부하 검증] ──> [프로덕션 투입]
│ │
acceptance_test.sh k6 / synthetic FSDP
│ │
결과 MinIO 보관 (S3) Kubelet Scheduling 활성화
node-diagnostics.rpm을 설치하고 acceptance_test.sh 구동 (NIC 링 버퍼, 점보프레임, NVMe fsync 지연, NUMA 대칭성, 10분 CPU/RAM 스트레스).node.kubernetes.io/unschedulable 테인트(Taint)를 유지한 채, 검증 전용 K8s Job(k6 추론, PyTorch 합성 부하, iperf3 네트워크)을 배포하여 패킷 드롭 및 Cgroup CPU Throttling 발생 여부 측정.s3://node-reports/<HOSTNAME>/)에 자동 업로드하고, 기준 통과 시 테인트를 해제(Uncordon)하여 운영 워커 풀에 편입.check_bottlenecks.sh 진단 Sysctl/Cilium Config 변경 PR 생성 스테이징 클러스터 검증 AWX/ArgoCD 배포.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 자동 린트
2. ArgoCD Sync (Canary / Auto-sync) |
대규모 데이터 레이크하우스 및 인메모리/GPU 시스템 특화 용량 관리 체계입니다.
ResourceQuota와 LimitRange 자동 주입(Kyverno 연동).requests == limits (정수 코어)로 설정하도록 Kyverno Mutation/Validation Rule로 강제하여 CFS Throttling 원천 방지.인터넷이 차단된 에어갭 환경에서 바이너리, 패키지, 컨테이너 이미지를 반입하고 배포하는 통제 절차입니다.
[외부망 수집] ──> [SHA-256 Manifest 생성] ──> [보안성 심의/스캔] ──> [Nexus/Registry 반입] ──> [노드/파드 배포]
mc, k6), 모델 가중치, 컨테이너 이미지를 목록화한 assets-manifest.yaml 작성.sha256sum * > manifest.sha256 파일 생성.nexus.internal:8082/*)에서 서명된 이미지만 풀(Pull)할 수 있도록 차단 정책 적용.acceptance_test.sh가 Exit Code 0을 리턴해야만 AWX 다음 단계(K8s 조인)로 넘어가는 품질 게이트(Quality Gate) 자동화를 구축하는 것이 가장 효과적입니다.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)
현재 생각하신
성능 / 용량 / 설정 / 자원 / 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 | 무슨 문제가 발생했고 근본 원인은 무엇인가? |
이렇게 분리하면 나중에 엄청난 효과가 있습니다.
이 부분이 가장 중요합니다.
예를 들어 B300 서버 한 대를 생각하면:
Server
├─ Serial Number
├─ Vendor
├─ Model
├─ CPU
├─ Memory
├─ NIC
├─ GPU
├─ Rack
├─ Location
├─ Owner
├─ Purchase/Warranty
└─ Lifecycle
이것은 자산관리입니다.
반면:
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입니다.
그리고:
RHEL
Kernel
containerd
kubelet
Cilium
AIStor
CNPG
OpenEBS
Keycloak
Vault
...
은 Software Management입니다.
이 세 가지를 한 문서에 넣으면 시간이 갈수록 관리가 굉장히 어려워집니다.
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는 "왜 이렇게 구성했는가"를 설명해야 합니다.
이건 상당히 좋은 아이디어입니다.
저라면 이름을 조금 바꿔서:
라고 만들겠습니다.
예:
| Service | Capability | 제공 여부 | Owner |
|---|---|---|---|
| Kubernetes | Container orchestration | O | Platform |
| Kubernetes | Batch Job | O | Platform |
| Cilium | NetworkPolicy | O | Network |
| Cilium | BGP | O | Network |
| Cilium | ClusterMesh | O | Network |
| AIStor | S3 | O | Storage |
| AIStor | Lifecycle | O | Storage |
| CNPG | PostgreSQL HA | O | DB |
| OpenEBS | PV | O | Storage |
| Keycloak | IAM | O | Security |
| Vault | Secret | O | Security |
| Kyverno | Policy | O | Platform |
| Goldilocks | Resource recommendation | O | Platform |
그리고 각각에:
Supported
Not Supported
Deprecated
Experimental
상태를 부여합니다.
이 문서가 있으면 나중에 굉장히 중요해집니다.
예를 들어 사용자가:
"AIStor에서 FTP 지원하나요?"
라고 물었을 때,
설계문서에서 찾는 것이 아니라 Capability Catalog에서 바로 답할 수 있게 됩니다.
이것은 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)
예를 들어:
Cilium
에서
bpf-lb-mode
을 변경했다고 합시다.
Configuration Management는:
현재 값은 무엇인가?
를 관리합니다.
Change Management는:
왜 변경했는가?
를 관리합니다.
따라서:
Configuration
│
│ 변경
▼
Change Request
│
├─ 변경 이유
├─ 영향
├─ 위험
├─ 사전 테스트
├─ Rollback
├─ 승인
└─ 결과
│
▼
Configuration Update
구조가 되어야 합니다.
이것도 매우 중요합니다.
성능관리 문서를:
sysctl 값을 이렇게 한다
정도로 만들면 실패합니다.
성능관리는 다음 구조가 되어야 합니다.
Performance Management
│
├── Baseline
│
├── Monitoring
│
├── Benchmark
│
├── Bottleneck Analysis
│
├── Tuning
│
├── Validation
│
└── Regression
즉:
측정 → 원인분석 → 변경 → 검증 → 표준화
가 핵심입니다.
저라면 다음과 같이 정의하겠습니다.
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이 됩니다.
이게 앞으로 굉장히 중요합니다.
예를 들어:
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됐는지 검사합니다.
예를 들어 Cilium 성능 문제가 발생했습니다.
Packet latency 증가
↓
NIC → kernel → Cilium → veth 조사
↓
RPS/XPS 문제 발견
↓
튜닝값 변경
여기까지가 Performance Management입니다.
그 다음:
검증
↓
효과 있음
↓
Golden Configuration에 반영
↓
Ansible/Git에 반영
↓
Configuration Management 업데이트
이렇게 해야 합니다.
즉,
성능관리에서 발견한 최적값이 설정관리의 표준값이 된다.
이 관계가 매우 중요합니다.
예를 들어 AIStor 용량이 80%가 되었다고 합시다.
이건 Performance 문제가 아닙니다.
현재
↓
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)
이것도 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입니다.
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 | 알려진 문제 |
| Rollback | rollback |
| Dependency | 의존성 |
까지 관리합니다.
이건 강력하게 추천합니다.
Platform Compatibility Matrix
예:
| Component | Version |
|---|---|
| RHEL | 10.2 |
| Kernel | x.x |
| Kubernetes | 1.33.x |
| containerd | 1.7.x |
| Cilium | 1.18.4 |
| AIStor Operator | x |
| AIStor | x |
| CNPG | x |
| OpenEBS | x |
| Kafka | x |
| Keycloak | x |
| Vault | x |
| Kyverno | x |
| ArgoCD | x |
그리고:
RHEL × Kubernetes × Cilium × AIStor × Kernel
의 compatibility가 검증된 조합을 Approved Platform Version으로 지정합니다.
이 세 가지를 연결하면 아주 강력한 구조가 됩니다.
예:
Kubernetes
└─ Cilium
└─ BGP
└─ ECMP
Cilium
├─ bpf.lbMode
├─ kubeProxyReplacement
├─ BGP
└─ MTU
Cilium 1.18.4
즉:
Architecture
↓
Software
↓
Configuration
↓
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)
제가 추천하는 전체 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
가 있어야 합니다.
이것이 최종적으로 만들고 싶은 운영 loop입니다.
┌───────────────┐
│ Monitoring │
└───────┬───────┘
│
▼
Performance Issue
│
▼
Root Cause
│
▼
Tuning
│
▼
Benchmark
/ \
FAIL PASS
│ │
└─────┐ ▼
│ Standardize
│ │
│ ▼
│ Configuration
│ │
│ ▼
│ Git/Ansible/Helm
│ │
└──────┘
│
▼
Change
│
▼
Production
이 구조를 만들어 놓으면 "사람이 기억하는 튜닝"이 사라집니다.
제가 지금 조직 상황이라면 다음 12개 운영체계로 만들겠습니다.
이게 정말 중요합니다.
실제로 운영해보면 문서가 너무 많아서 아무도 안 봅니다.
저라면 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 안에 세부 절차/표준/템플릿을 둡니다.
지금 질문하신 방향을 보면 저는 이것을 일반적인 "성능관리절차"보다 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
으로 고정합니다.
예를 들어 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까지의 병목구간을 체계적으로 관리"하는 방법입니다.
문서를 각각 따로 만들기보다는 다음 관계를 갖게 하는 것이 가장 좋습니다.
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 개념 + 클라우드 네이티브 운영 방식"으로 재구성하는 게 실제로 잘 돌아갑니다. 아래는 그 매핑과 구체적 운영 방식 제안입니다.
가장 중요한 설계 결정은: 아키텍처 문서/사용기능목록/CMDB를 "단일 진실 공급원(SSOT)"으로 두고, 나머지 4개 관리절차가 전부 그걸 참조·갱신하는 구조로 만드는 것입니다. ITIL도 이걸 "Configuration Management System(CMS)"으로 부릅니다. 이게 안 되어 있으면 성능관리팀이 보는 노드 스펙과 용량관리팀이 보는 디스크 목록과 설정관리팀이 보는 Helm values가 서로 따로 놀게 됩니다.
[아키텍처 문서] ── 왜 이렇게 만들었나 (ADR)
│
[사용기능목록/서비스카탈로그] ── 뭐가 있고 누가 쓰나
│
┌─────────────────┼─────────────────┬─────────────────┐
[설정관리] [자원관리] [용량관리] [성능관리]
(뭐가 어떻게 (누구에게 (얼마나 남았고 (얼마나 빠르고
설정돼있나) 얼마나 줬나) 언제 증설하나) 어디가 병목인가)
│ │ │ │
└──────────────────┴──────── SW관리(무엇이 설치돼있나) ──┘
핵심 원칙: 설정관리가 "사실(fact)"을 기록하는 계층이고, 나머지(성능/용량/자원/SW관리)는 그 사실을 기반으로 "판단하고 행동하는" 절차입니다. 이 구분이 흐려지면 문서가 중복되고 곧 썩습니다.
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가 성능 저하 원인인 경우가 많음).
이건 ITIL에서는 Capacity Management의 "Component/Service Capacity" 하위로 다루지만, K8s에서는 사실상 별도 거버넌스 프로세스로 분리하는 게 낫습니다. 왜냐면 "얼마나 있냐(용량)"와 "누구에게 얼마 줬냐(할당)"는 다른 질문이기 때문입니다.
ResourceQuota/LimitRange, PriorityClass 정책 (Kyverno로 강제)절차 제안: 신규 서비스 온보딩 시 "리소스 요청서"를 표준 양식(예상 QPS, request/limit, 스토리지 크기, 성장 예측)으로 받고, 이게 곧 (3)용량관리의 입력값이 되도록 연결합니다.
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 프로비저닝 코드)에 반영되는 순환 구조.
이전에 만든 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. 문서화: "튜닝 이력대장"에 누적 — 나중에 같은 문제가 재발했을 때 과거 대응을 바로 찾을 수 있게
catalog/services.yaml로 서비스명/오너/의존성/SLA/런북 링크를 관리. 신규 인수 시 여기 등록하는 걸 온보딩 체크리스트의 마지막 항목으로 넣으면 목록이 저절로 최신 상태를 유지합니다.| 주기 | 활동 | 관련 절차 |
|---|---|---|
| 상시 | 모니터링/알림 | 성능·용량 |
| 이벤트 발생시 | 신규 노드/서비스 인수 | 성능(인수)·SW관리·사용기능목록 등록 |
| 주간 | Config drift 스캔, 튜닝 진행상황 점검 | 설정관리·성능(튜닝) |
| 월간 | 용량 추세 리뷰, 리소스 사용률 리포트 | 용량·자원 |
| 분기 | 리소스 재조정(Goldilocks 기반), 아키텍처 큰 그림 갱신, 패치 정책 리뷰 | 자원·아키텍처·SW관리 |
| 반기/연간 | 캐패시티 플랜(Business Capacity), 전체 baseline 재점검 | 용량·성능 |
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부터 시작하시는 걸 추천드립니다 — 나머지 영역은 실제로 반복되는 작업이 생길 때마다 하나씩 문서화하는 게 오히려 덜 썩습니다.