26S06c

QK·약 8시간 전

인프라 팀에서 OS(RHEL 10.2) 설치 후 노드를 넘겨받았을 때, DevOps/SRE 관점에서 K8s 클러스터 조인 전(또는 워크로드 배포 전) 반드시 확인해야 하는 인수 테스트(Acceptance Test) 체크리스트입니다.

하드웨어 결함이나 OS 설정 미비는 클러스터 운영 중 원인 불명의 Pod 퇴출(Eviction), 네트워크 플래핑, etcd/스토리지 타임아웃으로 이어지므로 5개 영역으로 나누어 자동화 스크립트 형태로 빠르게 검증하는 것이 좋습니다.


1. 하드웨어 스펙 정합성 및 토폴로지 검증

발주/설계 사양과 실제 서버 스펙이 일치하는지, 특히 멀티 소켓 환경에서 NUMA 밸런스가 맞는지 확인합니다.

  • CPU & NUMA: 코어 수, 소켓 수, 하이퍼스레딩, Sub-NUMA Clustering(SNC) 적용 여부
lscpu | grep -E "Socket\(s\)|Core\(s\) per socket|Thread\(s\) per core|NUMA node\(s\)"
numactl --hardware  # 노드별 메모리 용량이 균등한지 확인
  • 메모리(RAM): 장착 용량 및 속도, 하드웨어 ECC 에러 감지
free -h
dmidecode -t memory | grep -E "Size:|Speed:|Configured Memory Speed:"
# 과거 하드웨어 EDAC/ECC 에러 이력 점검
dmesg | grep -iE "edac|memory error|mce"
  • PCIe 링크 대역폭: NIC 및 주요 컨트롤러가 제 속도(예: Gen4/Gen5 x16)로 붙었는지 점검
# 폭(Width)이나 속도(Speed)가 다운그레이드되어 붙지 않았는지 확인
lspci -vvv | grep -E "LnkCap|LnkSta" | grep -v "not available"

2. 네트워크 & NIC 무결성 검증 (ConnectX-6 / E810 등)

가장 장애가 빈번한 영역으로, 링크 속도, 본딩, MTU, 하드웨어 버퍼 에러를 확인합니다.

  • 물리 링크 및 드라이버/펌웨어 상태:
# 속도 및 듀플렉스 상태 (예: 25G/100G 정상 체결 여부)
ethtool bond0 | grep -E "Speed:|Duplex:|Link detected:"

# 드라이버 버전 및 펌웨어 버전 (최소 요구사항 충족 여부)
ethtool -i <물리_인터페이스명>
  • 점보 프레임 (MTU 9000) 및 패킷 전송 검증:
  • 스위치와 호스트 간 MTU 불일치는 대용량 스토리지(MinIO/Ceph) I/O 시 패킷 드롭을 유발합니다.
# DF(Don't Fragment) 비트를 걸고 8972 바이트(ICMP 헤더 포함 9000) 핑 테스트
ping -M do -s 8972 -c 5 <게이트웨이_또는_상대노드_IP>
  • NIC 하드웨어 링 버퍼(Ring Buffer) 및 드롭 카운터:
# 링 버퍼 크기가 Max로 설정되어 있는지 확인
ethtool -g <물리_인터페이스명>

# CRC 오류, 프레임 드롭 카운트 확인 (0이어야 정상)
ip -s link show <물리_인터페이스명>
ethtool -S <물리_인터페이스명> | grep -iE "drop|error|discard" | grep -v ": 0"

3. 디스크 & 로컬 스토리지 무결성 검증

OS 디스크와 컨테이너 런타임/로컬 볼륨(NVMe) 영역의 수명과 I/O 성능을 확인합니다.

  • NVMe 드라이브 헬스체크 (SMART):
  • 예비 블록 소진 여부, 치명적 경고, 온도 확인.
nvme list
nvme smart-log /dev/nvme0n1 | grep -E "critical_warning|temperature|percentage_used|media_errors"
# percentage_used가 낮아야 하고, media_errors는 0이어야 함
  • 로컬 디스크 쓰기 레이턴시 간이 측정 (fio):
  • K8s etcd 노드나 고속 로컬 캐시로 쓰일 볼륨은 fsync 레이턴시가 핵심(10ms 이하)입니다.
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

4. OS 커널 & 시스템 기본 설정(Compliance) 검증

K8s 및 CNI(Cilium 등)가 올라가기 위한 필수 커널 파라미터가 인프라팀 작업에서 누락되지 않았는지 체크합니다.

  • 스왑(Swap) 비활성화 확인:
free -m | grep Swap
# Swap 행의 total이 0이거나 /etc/fstab에 주석 처리되어 있어야 함
  • 시간 동기화 (NTP / Chrony) 편차 확인:
  • 노드 간 시간 편차가 수백 ms 이상 벌어지면 인증서 만료 에러나 분산 트랜잭션 충돌이 발생합니다.
chronyc tracking
# 'System time' 및 'RMS offset'이 5ms 이내인지 확인
  • 네트워크 포워딩 및 커널 파라미터 (sysctl):
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
  • SELinux / Firewall 상태:
getenforce          # 사내 표준에 맞게 Permissive/Enforcing 확인
systemctl status firewalld  # 클러스터 CNI 정책에 맞게 Inactive 여부 확인

5. 간단한 번인 및 시스템 안정성 (10분 퀵 스트레스)

OS 초기 불량(Core 결함, 전원 인가 불안정, 메모리 접촉 불량)은 유휴 상태에서는 발견되지 않습니다.

  • CPU & 메모리 단기 부하 검증 (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"

6. DevOps 인수 판정 체크리스트 (요약)

영역점검 항목통과 기준 (Pass Criteria)
CPU/RAMlscpu, dmidecode발주 사양 코어/메모리 100% 일치, MCE/EDAC 에러 0건
NICethtool, MTU ping설계 대역폭(25G/100G) 링크 업, 점보프레임(9000) 드롭 없음
스토리지nvme smart-log, fioCritical warning 0, 미디어 에러 0, fsync 지연 안정권
OS 커널chrony, sysctl, swapSwap = 0, NTP 오차 < 5ms, ip_forward = 1
안정성stress-ng (10분)커널 패닉, CPU Throttling, 리부팅 없이 통과

위 항목들을 하나의 쉘 스크립트(acceptance_test.sh)로 묶어 두고, 새 노드를 인도받을 때마다 파이프라인으로 돌려 보고서(로그)를 남기면 하드웨어 불량 노드의 클러스터 인입을 사전에 차단할 수 있습니다.

===

인수 테스트와 대규모 K8s 클러스터(수백~천 대 단위, Cilium Native Mode, 고성능 스토리지/쿼리 엔진 환경) 운영을 위해 별도 다운로드가 필요한 패키지필수 커널/OS 튜닝 파라미터입니다.


1. 인수 테스트를 위해 별도로 다운로드해야 하는 대상

RHEL 10.2 최소 설치(Minimal) 환경 기준, 기본 OS 리포지토리에 없거나 추가로 챙겨야 하는 도구들입니다.

  • CentOS Stream 10 / EPEL 10에서 반입할 RPM:
  • stress-ng: CPU/메모리 번인 검증용 (RHEL 기본 저장소 미포함)
  • fio: 디스크/NVMe fsync 및 IOPS 실측용 (AppStream에 없을 경우 반입)
  • iperf3: 대역폭 및 점보프레임 실측용
  • nvme-cli: NVMe SMART 헬스 및 수명 점검 도구
  • RHEL BaseOS/AppStream 기본 제공 확인 대상 (설치 여부만 확인):
  • ethtool, pciutils(lspci), numactl, dmidecode, iproute, chrony
  • NVIDIA GPU 노드 인수 시 추가분 (앞서 다룬 내역):
  • 드라이버 .run, nvidia-fabricmanager, nvidia-container-toolkit, datacenter-gpu-manager

2. 대규모 K8s 노드(수천 Pod/고트래픽)를 위한 필수 커널 파라미터

노드당 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

3. 사용자 리소스 제한 설정 (/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

4. 적용 및 영구 반영 절차

# 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

===

profile
engineer

0개의 댓글