폐쇄망 설치
인터넷이 없는 현장 설치: 이미지 tar 반입, 패키지 프록시 비활성화, 사전학습 가중치 미러 업로드
MLOps Central Platform 은 기본 설정에서 몇 군데 인터넷에 접속. 폐쇄망에서는 그 지점마다 미리 반입하거나, 사내 미러로 전환하거나, 비활성화하는 준비 필요.
인터넷을 사용하는 곳
| 시점 | 내려받는 대상 | 폐쇄망 대응 |
|---|---|---|
앱 이미지 빌드(docker compose up --build) | uv, kubectl, 파이썬 패키지 | 외부망에서 빌드해 tar 로 반입 |
| Compose 서비스 기동 | Postgres·RustFS·Prometheus 등 공개 이미지 | tar 로 반입 |
| k3s 설치, device plugin | k3s 바이너리·이미지, nvcr.io/nvidia/k8s-device-plugin | k3s 공식 폐쇄망(에어갭) 설치 + 이미지 반입 |
| 공유 이미지 게시(클러스터 내부 빌드) | docker.io/moby/buildkit:v0.18.2-rootless, 베이스 이미지(python:*-slim, 포인트 클라우드 런타임은 nvidia/cuda), pip·apt 패키지, PyTorch 휠 | 사내 미러를 지정하거나, 외부에서 빌드한 이미지를 반입 |
| 학습 실행 | 사전학습 가중치(체크포인트) | 가중치 미러에 미리 업로드하고 인터넷 내려받기를 비활성화 |
1. 컨테이너 이미지 반입
-
외부망 PC 에서 같은 버전의 소스로 앱 이미지를 빌드하고, Compose 가 사용하는 이미지 이름 확인.
docker compose -f /opt/geo-mlops/docker-compose.yml build docker compose -f /opt/geo-mlops/docker-compose.yml pull --ignore-buildable docker compose -f /opt/geo-mlops/docker-compose.yml config --images -
위에서 출력된 이미지를 모두 한 tar 로 묶어 이동. 클러스터 파드용 이미지(BuildKit rootless, device plugin)는 따로 묶음.
docker save -o geo-mlops-compose.tar $(docker compose -f /opt/geo-mlops/docker-compose.yml config --images) docker pull docker.io/moby/buildkit:v0.18.2-rootless docker pull nvcr.io/nvidia/k8s-device-plugin:v0.19.3 docker save -o geo-mlops-k3s.tar docker.io/moby/buildkit:v0.18.2-rootless nvcr.io/nvidia/k8s-device-plugin:v0.19.3 -
폐쇄망 서버 에서 이미지를 불러오고, 빌드 없이 실행.
docker load -i geo-mlops-compose.tar sudo k3s ctr images import geo-mlops-k3s.tar docker compose -f /opt/geo-mlops/docker-compose.yml up -d --no-build
학습 런타임처럼 플랫폼이 보통 클러스터 내부에서 빌드하는 이미지도 외부에서 빌드해 반입 가능. docker save 로 만든 tar 를 웹 화면 컨테이너 레지스트리 → 이미지 반입으로 업로드한 뒤, 학습 런타임 화면에서 그 이미지를 외부 이미지 변형으로 등록. 외부 이미지 변형은 게시(빌드) 단계 없음.
2. 빌드 패키지 프록시
Compose 에 포함된 proxpi(pip)·apt-cacher-ng(apt)는 캐시일 뿐 미러가 아님. 인터넷에 접근할 수 없으면 캐시를 채울 수도 없고, 비어 있는 캐시를 거친 빌드는 실패. 둘 중 하나 선택.
| 선택 | 설정(app.env) |
|---|---|
| 사내 미러가 있는 경우: pip 인덱스·apt 미러를 사내에 운영 | GEO_MLOPS_BUILD_PIP_INDEX_URL=http://<사내 pip 미러>/simple/GEO_MLOPS_BUILD_APT_PROXY=http://<사내 apt 프록시>:3142필요하면 GEO_MLOPS_TRAINING_RUNTIME_TORCH_INDEX 도 사내 PyTorch 휠 인덱스로 |
| 미러가 없는 경우: 프록시 주입을 비활성화 | GEO_MLOPS_BUILD_PACKAGE_PROXY_ENABLED=false |
# /etc/geo-mlops/app.env (프록시를 쓰지 않는 환경)
GEO_MLOPS_BUILD_PACKAGE_PROXY_ENABLED=false
- 비활성화하는 설정은 이것 하나뿐. 주소 설정을 비우면 비활성화되지 않고 기본 주소(
10.42.0.1:5000,:3142) 사용. - 비활성화하면 빌드가 PyPI·데비안 저장소에 직접 접속. 폐쇄망에서는 그 빌드 역시 실패하므로, 미러가 없으면 위 1절처럼 외부에서 빌드한 이미지를 반입해 사용.
- 설정을 바꾼 뒤에는 앱 컨테이너를 다시 생성하고(
docker compose … up -d app), 서빙 빌더를 한 번 다시 게시. 절차는 업그레이드의 "이미지 재게시" 참고. - 빌드 캐시 화면에서 두 프록시 카드가 "미사용" 이고 "꺼져 있음" 문구가 표시되면 정상적으로 비활성화된 상태. 활성화한 상태에서 프록시가 중단되어 있으면 "실패" 와 "닿지 않습니다" 가 표시되고, 그 상태의 빌드는 모두 실패.
3. 사전학습 가중치 미러 업로드
학습은 시작할 때 사전학습 체크포인트(예: YOLO·RF-DETR 가중치) 사용. 플랫폼은 이것을 오브젝트 저장소의 가중치 미러에 저장하고 파드에 미리 배치. 기본 설정에서는 미러에 없으면 스테이저가 인터넷에서 내려받아 미러를 채움. 폐쇄망에서는 이 인터넷 내려받기를 비활성화하고, 미러를 수동으로 채움.
# /etc/geo-mlops/app.env
GEO_MLOPS_TRAINING_WEIGHTS_UPSTREAM_FETCH=false
-
카탈로그에 어떤 가중치가 있고, 미러에 무엇이 있는지 확인.
docker exec geo-mlops-app ./run geo-mlops-admin weights list # rf-detr rf-detr-nano 349.3MB -- # yolo yolo11n 5.4MB -- # -> 0/16 mirrored, 3.6GB total -
외부망에서 내려받은 체크포인트 파일을 앱 컨테이너에 복사하고, 카탈로그의 모델 키를 지정해 미러에 업로드. 파일의 MD5 가 카탈로그와 다르면 거부.
docker cp ./rf-detr-nano.pth geo-mlops-app:/tmp/rf-detr-nano.pth docker exec geo-mlops-app ./run geo-mlops-admin weights push rf-detr-nano /tmp/rf-detr-nano.pth # rf-detr/rf-detr-nano: pushed -
시스템 콘솔 가중치 미러 화면에서 해당 모델의 미러 칸이 "아직 없음" 에서 "있음" 으로 변경되었는지 확인. 인터넷 내려받기를 비활성화한 상태면 화면 위에 "자동 확보 꺼짐" 표시. 같은 모델 키가 여러 프레임워크에 있으면
--framework를 지정하라는 오류 표시.가중치 미러: 사전학습 체크포인트를 사내 저장소에 보관
미러에 없는 가중치로 학습을 제출해도 학습은 차단되지 않음. 다만 인터넷 내려받기가 비활성화되어 있으면 트레이너가 직접 내려받으려다 실패할 수 있음. 사용할 모델의 가중치는 미리 미러에 업로드.
4. 웹 화면
웹 화면 정적 파일도 외부망에서 빌드(npm ci && npm run build)해 dist/ 반입. 방법은 Docker Compose 로 설치의 "웹 화면 배포" 와 동일.
설정 전체 목록은 레퍼런스 참고.