GPU 노드 도입 및 검증 과정에서 클라이언트(엔지니어/운영자 PC) 접근용 UI 포트와, 각 클러스터(Compute/Storage) 간 연동 시 필요한 방화벽 오픈 대상 포트 목록입니다.
인수 테스트, vLLM 테스트, 스토리지 점검 시 웹 브라우저나 데스크톱 도구에서 노드로 직접 붙을 때 오픈이 필요한 포트입니다.
| 포트 / 프로토콜 | 용도 및 기본 서비스 | 비고 |
|---|---|---|
| 8000 / TCP | vLLM OpenAI 호환 엔드포인트 | Swagger UI (/docs) 및 추론 API 테스트 호출 |
| 9400 / TCP | NVIDIA DCGM Exporter | GPU 메트릭(온도, 전력, VRAM 사용률 등) 확인 |
| 3000 / TCP | Grafana (임시 대시보드 구동 시) | Burn-In 및 리소스 메트릭 모니터링 UI |
| 9001 / TCP | MinIO / AIStor Console (Web UI) | 스토리지 웹 관리자 콘솔 접근 (기본 콘솔 포트) |
| 443 / TCP | 서버 BMC / IPMI Web GUI | iDRAC/iLO 등 원격 콘솔, 전원 제어, SEL 센서 확인 |
| 5900 / TCP | BMC Virtual Console (KVM) | Java/HTML5 KVM 뷰어 화면 연결용 |
GPU 노드가 기존 Compute K8s 클러스터의 워커 노드로 합류할 때 필요한 제어 평면 및 CNI 오버레이 통신 포트입니다.
kubectl logs, 파드 exec 등에 필수)모델 가중치 로드, 임베딩 적재, 체크포인트 저장을 위해 GPU 노드가 스토리지 클러스터로 접근할 때 필요한 포트입니다.
GPU 노드가 K8s에 아직 조인되지 않고 Standalone vLLM 컨테이너로 서빙 중이거나, 별도 파드로 띄운 상태에서 Compute 클러스터의 App/워크플로우가 요청을 보낼 때입니다.
/v1/chat/completions, /v1/embeddings)http://<GPU_IP>:8000/metrics)Path MTU Discovery (PMTUD)를 위한 ICMP("Fragmentation Needed and DF set") 패킷을 차단하면 대용량 가중치 전송 시 세션이 멈추는(Blackhole) 현상이 발생합니다. ICMP 통신은 반드시 열려 있어야 합니다.===
에어갭(Air-gap) 환경에서는 컨테이너 이미지가 프라이빗 Nexus/Harbor 등으로 캐싱되더라도, 대용량 LLM 모델 가중치(Weights), CUDA/드라이버 오프라인 패키지, Python Wheel 의존성, 벤치마크 바이너리 등은 인터넷 연결망(DMZ/외부 반출입 서버)에서 사전에 온전히 패키징하여 무결성 검증을 거친 뒤 반입해야 합니다.
외부망 다운로드부터 물리적/논리적 망 연계, 내부 AIStor(MinIO) 및 GPU 노드 적재까지의 전체 반입 절차를 5단계로 정리했습니다.
에어갭 내부에서 추가 빌드나 외부 조회가 발생하지 않도록 의존성을 완전히 고립시켜 정의합니다.
*.safetensors, config.json, tokenizer.json, tokenizer_config.json, generation_config.json 등 필수 메타데이터 전수 포함..run 파일, Fabric Manager deb/rpm 패키지, DCGM deb/rpm.ice 드라이버 및 DDP(Dynamic Device Personalization) 펌웨어 패키지.pip download --dest).iperf3, fio, gpu-burn 빌드 아티팩트, s3-benchmark / warp 바이너리.외부망 서버에서 스크립트를 통해 온전한 파일 셋을 확보하고 체크섬을 생성합니다.
--local-dir-use-symlinks False)로 완전히 내려받습니다.pip install -U "huggingface_hub[cli]"
# 토큰 필요 모델(Llama 등) 로그인
huggingface-cli login --token <HF_TOKEN>
# 모델 전체 파일 다운로드
huggingface-cli download meta-llama/Llama-3.1-70B-Instruct \
--local-dir /export/models/Llama-3.1-70B-Instruct \
--local-dir-use-symlinks False \
--exclude "*.bin" "*.pth" # Safetensors만 반입할 경우 레거시 제외
mkdir -p /export/packages
# 예: Ubuntu 기준 의존성 일괄 다운로드
apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests \
--no-conflicts --no-breaks --no-replaces --no-enhances \
datacenter-gpu-manager nvidia-fabricmanager-550 | grep "^\w" | sort -u)
cd /export
find models/ packages/ -type f -exec sha256sum {} + > manifest_sha256.txt
사내 보안 반입 규정에 따라 승인 절차와 악성코드 검사를 수행합니다.
[인터넷망 다운로드 서버]
│
▼
[안티바이러스 / CDR 검사] (Pickle 취약점 및 악성 스크립트 스캔)
│
▼
[망연계 솔루션 / 전용 SFTP / 외장 스토리지]
│
▼
[에어갭 내부망 인제스천 Bastion]
.bin이나 .pt 같은 Python pickle 기반 가중치는 임의 코드 실행(RCE) 위험이 있어 보안 검사에서 반려되는 경우가 많습니다. 가능한 순수 텐서 직렬화 포맷인 safetensors만 통과시키는 것이 원칙입니다.split -b 20G 형태로 분할하여 전송하거나, 망연계 전용 고속 SFTP/MFT(Managed File Transfer) 채널을 경유합니다.에어갭 내부 Bastion 또는 데이터 인제스천 노드에서 체크섬을 일괄 대조합니다.
cat Llama-3.1-70B-Instruct.tar.gz.part* > Llama-3.1-70B-Instruct.tar.gz
tar -xvf Llama-3.1-70B-Instruct.tar.gz
sha256sum -c manifest_sha256.txt
FAILED가 출력되면 모델 로드 시 Silent Data Corruption 또는 Weight 포맷 에러가 발생하므로 재반입해야 합니다.검증이 끝난 모델을 내부 공용 오브젝트 스토리지(AIStor)에 업로드하고, GPU 노드가 이를 소비할 수 있도록 경로를 표준화합니다.
[내부망 Bastion]
│
│ (mc / s3 API, 내부망 bond1 MTU 9000)
▼
[AIStor Cluster (MinIO)] ── (S3 엔드포인트: 9000)
│
│ (E810 내부망 초고속 스트리밍 / 다운로드)
▼
[GPU Node: /data/models/ 로컬 NVMe 캐시]
│
▼
[vLLM 컨테이너 바인드 마운트]
mc) 또는 멀티파트 병렬 업로드 도구를 활용해 업로드합니다.# AIStor 호스트 등록
mc alias set aistor http://<AISTOR_INTERNAL_IP>:9000 <ACCESS_KEY> <SECRET_KEY>
# 버킷 생성 및 병렬 업로드
mc mb --ignore-existing aistor/model-registry
mc cp --recursive /data/models/Llama-3.1-70B-Instruct aistor/model-registry/Llama-3.1-70B-Instruct
mkdir -p /data/models/Llama-3.1-70B-Instruct
# S3 멀티파트 동시 다운로드
mc cp --recursive aistor/model-registry/Llama-3.1-70B-Instruct/ /data/models/Llama-3.1-70B-Instruct/
-v /data/models:/models)으로 즉시 연결하여 오프라인 서빙을 시작합니다.| 점검 영역 | 핵심 리스크 | 예방 및 조치 방안 |
|---|---|---|
| 토크나이저 누락 | 가중치 파일만 받고 tokenizer.json 등 메타데이터를 빠뜨려 vLLM 구동 실패 | snapshot_download를 써서 리포지토리 루트 전체를 통째로 다운로드 |
| Safetensors vs Bin | 보안 정책상 .bin(Pickle) 파일 반입 차단 | safetensors 포맷으로만 수집 (HuggingFace 허브 상에서 safetensors 변환 버전 확보) |
| 전송 중 체크섬 오류 | 대용량 전송 중 패킷 손상으로 텐서 가중치 깨짐 (추론 시 gibberish 텍스트 출력) | 외부에서 생성한 sha256sum 매니페스트로 내부 반입 직후 전수 자동 검증 |
| AIStor 디렉터리 구조 | S3 Prefix 경로가 어긋나 vLLM 로더가 모델 루트 경로를 찾지 못함 | s3://model-registry/<Model-Name>/ 밑에 설정 파일과 safetensors가 바로 위치하도록 표준화 |
===
RHEL 10.2 기반 베어메탈 환경 및 에어갭(Air-gap) 제약 조건을 기준으로, 1~5단계 테스트에 필요한 툴들의 설치 방식을 정리했습니다.
RHEL 10 환경에서는 Docker 대신 기본 컨테이너 런타임으로 Podman(및 CDI 기반 NVIDIA Container Toolkit)을 사용하며, 클러스터 합류 후에는 K8s Pod로 배포됩니다.
| 단계 | 주요 필요 툴 | 주요 역할 |
|---|---|---|
| Phase 1 | pciutils, iproute, ethtool, numactl, ipmitool, nvme-cli, stress-ng, fio | 하드웨어 인식, PCIe 링크, NUMA, 온도, 디스크/메모리 부하 |
| Phase 2 | nvidia-driver, nvidia-fabricmanager, cuda-samples, dcgm, gpu-burn | 드라이버/CUDA, NVLink P2P 대역폭, VRAM 무결성, GPU 풀로드 번인 |
| Phase 3 | vllm, curl, jq, netcat(ncat) | LLM 추론 서빙, REST API 호출, 스트리밍 검증 |
| Phase 4 | iperf3, fio, minio-client(mc), warp 또는 s3-benchmark | 점보프레임 대역폭, S3/NFS I/O 처리량, 가중치 다운로드 |
| Phase 5 | benchmark_serving.py(vLLM 내장), k6, locust, dcgm-exporter, prometheus | TTFT/ITL 벤치마크, 동시성 분산 부하, 메트릭 수집 |
이 단계는 하드웨어와 커널 상태를 직접 제어·진단해야 하므로 베어메탈 OS 직접 설치가 원칙입니다.
# BaseOS / AppStream 기본 제공
dnf install -y pciutils iproute ethtool numactl ipmitool nvme-cli fio
# stress-ng (EPEL 저장소 필요 -> 사내 Nexus RPM 미러에서 수집)
dnf install -y stress-ng
--privileged, /dev, /sys)를 그대로 마운트해야 합니다.podman run --rm -it --privileged \
-v /dev:/dev -v /sys:/sys:ro -v /tmp:/tmp \
nexus.internal:8082/infra/diag-tools:latest stress-ng --cpu 0 --timeout 60s
privileged: true, hostPID: true, hostNetwork: true 데몬셋 사용)드라이버와 Fabric Manager는 커널 모듈이므로 베어메탈에 설치해야 하며, 진단/번인 도구는 컨테이너 방식이 권장됩니다.
.run 파일 반입.# 오프라인 반입된 RPM 설치
dnf localinstall -y nvidia-driver-*.rpm nvidia-fabricmanager-*.rpm
systemctl enable --now nvidia-fabricmanager
systemctl enable --now nvidia-persistenced
p2pBandwidthLatencyTest) & DCGMdnf localinstall -y datacenter-gpu-manager-*.rpm).# P2P 대역폭 측정
podman run --rm --device nvidia.com/gpu=all \
nexus.internal:8082/nvidia/cuda-sample:vectorAdd-cuda12.5.0 \
p2pBandwidthLatencyTest
# DCGM 진단
podman run --rm --privileged --device nvidia.com/gpu=all \
nexus.internal:8082/nvidia/dcgm:latest dcgmi diag -r 3
wilic/gpu-burn 이미지를 docker save 후 내부 Nexus에 push.podman run --rm --device nvidia.com/gpu=all \
nexus.internal:8082/benchmark/gpu-burn:latest 3600
apiVersion: v1
kind: Pod
metadata:
name: gpu-burn-test
spec:
restartPolicy: Never
containers:
- name: gpu-burn
image: nexus.internal:8082/benchmark/gpu-burn:latest
args: ["3600"]
resources:
limits:
nvidia.com/gpu: "8"
--ipc=host 또는 --shm-size)와 디바이스 플래그가 중요합니다.podman run -d --name vllm-server \
--device nvidia.com/gpu=all \
--ipc=host \
--net=host \
-v /data/models:/models:ro \
nexus.internal:8082/vllm/vllm-openai:latest \
--model /models/Llama-3.1-70B-Instruct \
--tensor-parallel-size 8 \
--port 8000
apiVersion: apps/v1
kind: Deployment
metadata:
name: vllm-serving
spec:
replicas: 1
template:
spec:
containers:
- name: vllm
image: nexus.internal:8082/vllm/vllm-openai:latest
args: ["--model", "/models/Llama-3.1-70B-Instruct", "--tensor-parallel-size", "8"]
resources:
limits:
nvidia.com/gpu: "8"
volumeMounts:
- name: model-cache
mountPath: /models
- name: dshm
mountPath: /dev/shm
volumes:
- name: model-cache
hostPath: { path: /data/models }
- name: dshm
emptyDir: { medium: Memory, sizeLimit: 32Gi }
curl, jq, ncat)dnf install -y curl jq nmap-ncat
kubectl run net-test --image=nexus.internal:8082/tools/curlimages:latest -- sleep 3600
dnf install -y iperf3 (BaseOS/AppStream 기본 제공).podman run --net=host nexus.internal:8082/network/iperf3:latest -c <IP> -P 8mc) & Warp (또는 s3-benchmark)# 반입된 바이너리에 실행 권한 부여 후 /usr/local/bin에 배치
install -m 755 mc /usr/local/bin/mc
install -m 755 warp /usr/local/bin/warp
podman run --rm --net=host \
-v /data/models:/data \
nexus.internal:8082/minio/mc:latest \
cp --recursive aistor/model-registry/Llama-3.1-70B-Instruct/ /data/
benchmark_serving.py)/workspace/vllm/benchmarks/ 또는 vLLM 패키지에 포함되어 있으므로 별도 설치 불필요.podman exec -it vllm-server python3 -m vllm.entrypoints.openai.benchmark_serving \
--backend vllm \
--model /models/Llama-3.1-70B-Instruct \
--dataset-path /data/ShareGPT_V3_unfiltered_cleaned_split.json \
--request-rate 10
/usr/local/bin/k6로 복사.apiVersion: batch/v1
kind: Job
metadata:
name: k6-loadtest
spec:
parallelism: 4 # 4개 파드에서 동시 타격
template:
spec:
containers:
- name: k6
image: nexus.internal:8082/loadtest/k6:latest
command: ["k6", "run", "/scripts/vllm_load.js"]
volumeMounts:
- name: script-vol
mountPath: /scripts
volumes:
- name: script-vol
configMap: { name: k6-test-script }
restartPolicy: Never
systemctl start nvidia-dcgm-exporter).podman run -d --name dcgm-exporter \
--device nvidia.com/gpu=all \
--net=host \
nexus.internal:8082/nvidia/k8s-device-plugin/dcgm-exporter:latest
port: 9400).ethtool, ip, numactl), 로컬 벤치마크 바이너리(mc, warp).p2pBandwidthLatencyTest, gpu-burn, vllm(초기 단독 검증).k6/locust), K8s 조인 후의 정규 vLLM 서빙 파드, dcgm-exporter.