인프라 팀에서 OS(RHEL 10.2) 설치 후 노드를 넘겨받았을 때, DevOps/SRE 관점에서 K8s 클러스터 조인 전(또는 워크로드 배포 전) 반드시 확인해야 하는 인수 테스트(Acceptance Test) 체크리스트입니다.
하드웨어 결함이나 OS 설정 미비는 클러스터 운영 중 원인 불명의 Pod 퇴출(Eviction), 네트워크 플래핑, etcd/스토리지 타임아웃으로 이어지므로 5개 영역으로 나누어 자동화 스크립트 형태로 빠르게 검증하는 것이 좋습니다.
발주/설계 사양과 실제 서버 스펙이 일치하는지, 특히 멀티 소켓 환경에서 NUMA 밸런스가 맞는지 확인합니다.
lscpu | grep -E "Socket\(s\)|Core\(s\) per socket|Thread\(s\) per core|NUMA node\(s\)"
numactl --hardware # 노드별 메모리 용량이 균등한지 확인
free -h
dmidecode -t memory | grep -E "Size:|Speed:|Configured Memory Speed:"
# 과거 하드웨어 EDAC/ECC 에러 이력 점검
dmesg | grep -iE "edac|memory error|mce"
# 폭(Width)이나 속도(Speed)가 다운그레이드되어 붙지 않았는지 확인
lspci -vvv | grep -E "LnkCap|LnkSta" | grep -v "not available"
가장 장애가 빈번한 영역으로, 링크 속도, 본딩, MTU, 하드웨어 버퍼 에러를 확인합니다.
# 속도 및 듀플렉스 상태 (예: 25G/100G 정상 체결 여부)
ethtool bond0 | grep -E "Speed:|Duplex:|Link detected:"
# 드라이버 버전 및 펌웨어 버전 (최소 요구사항 충족 여부)
ethtool -i <물리_인터페이스명>
# DF(Don't Fragment) 비트를 걸고 8972 바이트(ICMP 헤더 포함 9000) 핑 테스트
ping -M do -s 8972 -c 5 <게이트웨이_또는_상대노드_IP>
# 링 버퍼 크기가 Max로 설정되어 있는지 확인
ethtool -g <물리_인터페이스명>
# CRC 오류, 프레임 드롭 카운트 확인 (0이어야 정상)
ip -s link show <물리_인터페이스명>
ethtool -S <물리_인터페이스명> | grep -iE "drop|error|discard" | grep -v ": 0"
OS 디스크와 컨테이너 런타임/로컬 볼륨(NVMe) 영역의 수명과 I/O 성능을 확인합니다.
nvme list
nvme smart-log /dev/nvme0n1 | grep -E "critical_warning|temperature|percentage_used|media_errors"
# percentage_used가 낮아야 하고, media_errors는 0이어야 함
fio):fio --name=write-lat-test --filename=/var/lib/testfile --size=512M \
--rw=randwrite --bs=4k --direct=1 --fdatasync=1 --runtime=20 --time_based
rm -f /var/lib/testfile
K8s 및 CNI(Cilium 등)가 올라가기 위한 필수 커널 파라미터가 인프라팀 작업에서 누락되지 않았는지 체크합니다.
free -m | grep Swap
# Swap 행의 total이 0이거나 /etc/fstab에 주석 처리되어 있어야 함
chronyc tracking
# 'System time' 및 'RMS offset'이 5ms 이내인지 확인
sysctl net.ipv4.ip_forward net.bridge.bridge-nf-call-iptables 2>/dev/null
# net.ipv4.ip_forward = 1 확인
# max file descriptor 및 inotify 확인
sysctl fs.file-max fs.inotify.max_user_watches fs.inotify.max_user_instances
getenforce # 사내 표준에 맞게 Permissive/Enforcing 확인
systemctl status firewalld # 클러스터 CNI 정책에 맞게 Inactive 여부 확인
OS 초기 불량(Core 결함, 전원 인가 불안정, 메모리 접촉 불량)은 유휴 상태에서는 발견되지 않습니다.
stress-ng):# 전체 CPU 코어 100% 가동 + 메모리의 70% 점유로 10분간 스트레스
stress-ng --cpu 0 --vm 4 --vm-bytes 70% --timeout 10m --metrics-brief
journalctl -k -f | grep -iE "mce|hardware error|panic|out of memory|throttled"
| 영역 | 점검 항목 | 통과 기준 (Pass Criteria) |
|---|---|---|
| CPU/RAM | lscpu, dmidecode | 발주 사양 코어/메모리 100% 일치, MCE/EDAC 에러 0건 |
| NIC | ethtool, MTU ping | 설계 대역폭(25G/100G) 링크 업, 점보프레임(9000) 드롭 없음 |
| 스토리지 | nvme smart-log, fio | Critical warning 0, 미디어 에러 0, fsync 지연 안정권 |
| OS 커널 | chrony, sysctl, swap | Swap = 0, NTP 오차 < 5ms, ip_forward = 1 |
| 안정성 | stress-ng (10분) | 커널 패닉, CPU Throttling, 리부팅 없이 통과 |
위 항목들을 하나의 쉘 스크립트(acceptance_test.sh)로 묶어 두고, 새 노드를 인도받을 때마다 파이프라인으로 돌려 보고서(로그)를 남기면 하드웨어 불량 노드의 클러스터 인입을 사전에 차단할 수 있습니다.
===
인수 테스트와 대규모 K8s 클러스터(수백~천 대 단위, Cilium Native Mode, 고성능 스토리지/쿼리 엔진 환경) 운영을 위해 별도 다운로드가 필요한 패키지와 필수 커널/OS 튜닝 파라미터입니다.
RHEL 10.2 최소 설치(Minimal) 환경 기준, 기본 OS 리포지토리에 없거나 추가로 챙겨야 하는 도구들입니다.
stress-ng: CPU/메모리 번인 검증용 (RHEL 기본 저장소 미포함)fio: 디스크/NVMe fsync 및 IOPS 실측용 (AppStream에 없을 경우 반입)iperf3: 대역폭 및 점보프레임 실측용nvme-cli: NVMe SMART 헬스 및 수명 점검 도구ethtool, pciutils(lspci), numactl, dmidecode, iproute, chrony.run, nvidia-fabricmanager, nvidia-container-toolkit, datacenter-gpu-manager노드당 Pod 밀도가 높고 대규모 데이터 셔플(Spark/StarRocks) 및 eBPF 네트워크(Cilium)를 구동할 때, Linux 기본값은 파일 디스크립터 고갈, conntrack 테이블 오버플로우, 소켓 버퍼 병목을 유발합니다.
/etc/sysctl.d/99-kubernetes-tuning.conf에 설정할 추천 파라미터 세트입니다.
### [1. 파일 디스크립터 & Inotify 확장]
# 수천 개의 컨테이너 및 로그 수집기(Fluentbit, Vector 등) 감시 한계 해제
fs.file-max = 20971520
fs.inotify.max_user_watches = 1048576
fs.inotify.max_user_instances = 8192
fs.nr_open = 20971520
### [2. 가상 메모리 & 스왑]
# K8s 권장 스왑 비활성화 및 OOM 방지
vm.swappiness = 0
vm.overcommit_memory = 1
vm.panic_on_oom = 0
# StarRocks / MinIO / PostgreSQL 등 대용량 메모리 앱 구동 시 mmap 제한 완화
vm.max_map_count = 2621440
### [3. 네트워크 코어 & 패킷 큐 튜닝]
# 수신 패킷 처리 백로그 및 소켓 listen 대기 큐 확장
net.core.netdev_max_backlog = 100000
net.core.somaxconn = 65535
# 25G/100G 고속 네트워크를 위한 TCP 송수신 기본/최대 버퍼 크기 (최대 16MB)
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
net.core.optmem_max = 2048576
### [4. TCP 스택 & 소켓 고갈 방지]
# 고속 네트워크 처리량을 위한 TCP 윈도우 스케일링 활성화
net.ipv4.tcp_window_scaling = 1
# BBR 또는 Cubic (고대역폭/저지연 인트라넷 환경)
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# TCP 버퍼 오토튜닝 [min default max] (단위: Byte)
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 로컬 포트 범위 확장 (대규모 Outbound 호출 대비)
net.ipv4.ip_local_port_range = 10240 65535
# 짧은 수명의 커넥션에 대한 포트 재사용
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_syn_backlog = 3240000
net.ipv4.tcp_max_tw_buckets = 1440000
# Keepalive 주기 단축 (비정상 종료된 세션 빠른 회수)
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
### [5. K8s / Cilium 필수 라우팅 & Conntrack 설정]
# IP 포워딩 (K8s 필수)
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
# 비대칭 라우팅(Asymmetric Routing) 및 ECMP/BGP 구동 시 필수
# 엄격한 역경로 필터링(1) 대신 느슨한 필터링(2)으로 설정해야 패킷 드롭 방지
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
# 브리지 트래픽 netfilter 전달
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
# 대규모 연결 추적(Conntrack) 테이블 확장 (기본값 초과 시 통신 두절 발생)
net.netfilter.nf_conntrack_max = 2097152
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 3600
# ARP 캐시 테이블 확장 (수천 개 Pod IP 및 라우팅 테이블 수용)
net.ipv4.neigh.default.gc_thresh1 = 8192
net.ipv4.neigh.default.gc_thresh2 = 32768
net.ipv4.neigh.default.gc_thresh3 = 65536
/etc/security/limits.d/99-k8s.conf)커널 레벨 외에도 시스템 전체 프로세스 제한(limits)을 함께 풀어주어야 containerd나 워커 데몬이 스레드/파일 제한에 걸리지 않습니다.
* soft nofile 1048576
* hard nofile 1048576
* soft nproc 524288
* hard nproc 524288
* soft memlock unlimited
* hard memlock unlimited
root soft nofile 1048576
root hard nofile 1048576
# 1. 브리지 및 conntrack 커널 모듈 사전 로드
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
nf_conntrack
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
sudo modprobe nf_conntrack
# 2. sysctl 파라미터 즉시 로드
sudo sysctl --system
# 3. conntrack 및 arp 테이블 정상 반영 확인
sysctl net.netfilter.nf_conntrack_max net.ipv4.neigh.default.gc_thresh3
===